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. 24
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  2. 5
      ICSharpCode.NRefactory.CSharp/Completion/IParameterCompletionDataFactory.cs
  3. 8
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

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

@ -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) {
@ -194,17 +194,17 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -194,17 +194,17 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
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();

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