Browse Source

[Completion] Added a case to prevent recursive constructor calls:

'public A() : this()'.
newNRvisualizers
Mike Krüger 13 years ago
parent
commit
1ed352ca30
  1. 46
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  2. 5
      ICSharpCode.NRefactory.CSharp/Completion/IParameterCompletionDataFactory.cs
  3. 8
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

46
ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs

@ -120,7 +120,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -120,7 +120,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
yield return method;
}
foreach (var extMethods in resolveResult.GetEligibleExtensionMethods (true)) {
foreach (var method in extMethods) {
yield return method;
@ -152,7 +152,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -152,7 +152,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (invoke.Node is ConstructorInitializer) {
var init = (ConstructorInitializer)invoke.Node;
if (init.ConstructorInitializerType == ConstructorInitializerType.This) {
return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), ctx.CurrentTypeDefinition);
return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), ctx.CurrentTypeDefinition, init);
} else {
var baseType = ctx.CurrentTypeDefinition.DirectBaseTypes.FirstOrDefault(bt => bt.Kind != TypeKind.Interface);
if (baseType == null) {
@ -167,7 +167,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -167,7 +167,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null;
return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type);
}
if (invoke.Node is ICSharpCode.NRefactory.CSharp.Attribute) {
var attribute = ResolveExpression(invoke);
if (attribute == null || attribute.Item1 == null) {
@ -189,22 +189,22 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -189,22 +189,22 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return factory.CreateMethodDataProvider(document.GetOffset(invoke.Node.StartLocation), new [] { (IMethod)mr.Member });
}
}
if (resolveResult.Type.Kind == TypeKind.Delegate) {
return factory.CreateDelegateDataProvider(document.GetOffset(invoke.Node.StartLocation), resolveResult.Type);
}
//
// if (result.ExpressionContext == ExpressionContext.BaseConstructorCall) {
// if (resolveResult is ThisResolveResult)
// return new NRefactoryParameterDataProvider (textEditorData, resolver, resolveResult as ThisResolveResult);
// if (resolveResult is BaseResolveResult)
// return new NRefactoryParameterDataProvider (textEditorData, resolver, resolveResult as BaseResolveResult);
// }
// IType resolvedType = resolver.SearchType (resolveResult.ResolvedType);
// if (resolvedType != null && resolvedType.ClassType == ClassType.Delegate) {
// return new NRefactoryParameterDataProvider (textEditorData, result.Expression, resolvedType);
// }
//
// if (result.ExpressionContext == ExpressionContext.BaseConstructorCall) {
// if (resolveResult is ThisResolveResult)
// return new NRefactoryParameterDataProvider (textEditorData, resolver, resolveResult as ThisResolveResult);
// if (resolveResult is BaseResolveResult)
// return new NRefactoryParameterDataProvider (textEditorData, resolver, resolveResult as BaseResolveResult);
// }
// IType resolvedType = resolver.SearchType (resolveResult.ResolvedType);
// if (resolvedType != null && resolvedType.ClassType == ClassType.Delegate) {
// return new NRefactoryParameterDataProvider (textEditorData, result.Expression, resolvedType);
// }
break;
case ',':
invoke = GetInvocationBeforeCursor(true) ?? GetIndexerBeforeCursor();
@ -217,7 +217,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -217,7 +217,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (typeExpression == null || typeExpression.Item1 == null || typeExpression.Item1.IsError) {
return null;
}
return factory.CreateTypeParameterDataProvider(document.GetOffset(invoke.Node.StartLocation), CollectAllTypes(typeExpression.Item1.Type));
}
return null;
@ -228,7 +228,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -228,7 +228,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type);
return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type);
}
if (invoke.Node is ICSharpCode.NRefactory.CSharp.Attribute) {
var attribute = ResolveExpression(invoke);
if (attribute == null || attribute.Item1 == null) {
@ -236,13 +236,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -236,13 +236,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), attribute.Item1.Type);
}
invocationExpression = ResolveExpression(invoke);
if (invocationExpression == null || invocationExpression.Item1 == null || invocationExpression.Item1.IsError) {
return null;
}
resolveResult = invocationExpression.Item1;
if (resolveResult is MethodGroupResolveResult) {
return factory.CreateMethodDataProvider(document.GetOffset(invoke.Node.StartLocation), CollectMethods(invoke.Node, resolveResult as MethodGroupResolveResult));
@ -269,7 +269,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -269,7 +269,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (tExpr == null || tExpr.Item1 == null || tExpr.Item1.IsError) {
return null;
}
return factory.CreateTypeParameterDataProvider(document.GetOffset(invoke.Node.StartLocation), CollectAllTypes(tExpr.Item1.Type));
case '[':
invoke = GetIndexerBeforeCursor();
@ -320,7 +320,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -320,7 +320,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return result;
}
}
}

5
ICSharpCode.NRefactory.CSharp/Completion/IParameterCompletionDataFactory.cs

@ -35,6 +35,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -35,6 +35,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{
IParameterDataProvider CreateConstructorProvider (int startOffset, IType type);
/// <summary>
/// Creates a constructor provider skipping the parent of thisInitializer.
/// </summary>
IParameterDataProvider CreateConstructorProvider (int startOffset, IType type, AstNode thisInitializer);
IParameterDataProvider CreateMethodDataProvider (int startOffset, IEnumerable<IMethod> methods);
IParameterDataProvider CreateDelegateDataProvider (int startOffset, IType type);

8
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

@ -220,6 +220,14 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -220,6 +220,14 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
};
}
public IParameterDataProvider CreateConstructorProvider(int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type, AstNode skipNode)
{
Assert.IsTrue(type.Kind != TypeKind.Unknown);
return new Provider () {
Data = type.GetConstructors (m => m.Accessibility == Accessibility.Public)
};
}
public IParameterDataProvider CreateMethodDataProvider (int startOffset, IEnumerable<IMethod> methods)
{
return new Provider () {

Loading…
Cancel
Save