Browse Source

Parameter data providers now contain the start offset of their

expression (makes it easier to count the correct parameter number).
newNRvisualizers
mike 14 years ago
parent
commit
670975c924
  1. 32
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  2. 10
      ICSharpCode.NRefactory.CSharp/Completion/IParameterCompletionDataFactory.cs
  3. 19
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs
  4. 7
      ICSharpCode.NRefactory/Completion/IParameterDataProvider.cs

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

@ -157,39 +157,39 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -157,39 +157,39 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (invoke.Node is ConstructorInitializer) {
var init = (ConstructorInitializer)invoke.Node;
if (init.ConstructorInitializerType == ConstructorInitializerType.This) {
return factory.CreateConstructorProvider (ctx.CurrentTypeDefinition);
return factory.CreateConstructorProvider (document.GetOffset (invoke.Node.StartLocation), ctx.CurrentTypeDefinition);
} else {
var baseType = ctx.CurrentTypeDefinition.DirectBaseTypes.FirstOrDefault (bt => bt.Kind != TypeKind.Interface);
if (baseType == null)
return null;
return factory.CreateConstructorProvider (baseType);
return factory.CreateConstructorProvider (document.GetOffset (invoke.Node.StartLocation), baseType);
}
}
if (invoke.Node is ObjectCreateExpression) {
var createType = ResolveExpression (((ObjectCreateExpression)invoke.Node).Type, invoke.Unit);
return factory.CreateConstructorProvider (createType.Item1.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)
return null;
return factory.CreateConstructorProvider (attribute.Item1.Type);
return factory.CreateConstructorProvider (document.GetOffset (invoke.Node.StartLocation), attribute.Item1.Type);
}
var invocationExpression = ResolveExpression (invoke);
if (invocationExpression == null || invocationExpression.Item1 == null || invocationExpression.Item1.IsError)
return null;
resolveResult = invocationExpression.Item1;
if (resolveResult is MethodGroupResolveResult)
return factory.CreateMethodDataProvider (CollectMethods (invoke.Node, resolveResult as MethodGroupResolveResult));
return factory.CreateMethodDataProvider (document.GetOffset (invoke.Node.StartLocation), CollectMethods (invoke.Node, resolveResult as MethodGroupResolveResult));
if (resolveResult is MemberResolveResult) {
var mr = resolveResult as MemberResolveResult;
if (mr.Member is IMethod)
return factory.CreateMethodDataProvider (new [] { (IMethod)mr.Member });
return factory.CreateMethodDataProvider (document.GetOffset (invoke.Node.StartLocation), new [] { (IMethod)mr.Member });
}
if (resolveResult.Type.Kind == TypeKind.Delegate)
return factory.CreateDelegateDataProvider (resolveResult.Type);
return factory.CreateDelegateDataProvider (document.GetOffset (invoke.Node.StartLocation), resolveResult.Type);
//
// if (result.ExpressionContext == ExpressionContext.BaseConstructorCall) {
@ -212,20 +212,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -212,20 +212,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (typeExpression == null || typeExpression.Item1 == null || typeExpression.Item1.IsError)
return null;
return factory.CreateTypeParameterDataProvider (CollectAllTypes (typeExpression.Item1.Type));
return factory.CreateTypeParameterDataProvider (document.GetOffset (invoke.Node.StartLocation), CollectAllTypes (typeExpression.Item1.Type));
}
return null;
}
if (invoke.Node is ObjectCreateExpression) {
var createType = ResolveExpression (((ObjectCreateExpression)invoke.Node).Type, invoke.Unit);
return factory.CreateConstructorProvider (createType.Item1.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)
return null;
return factory.CreateConstructorProvider (attribute.Item1.Type);
return factory.CreateConstructorProvider (document.GetOffset (invoke.Node.StartLocation), attribute.Item1.Type);
}
invocationExpression = ResolveExpression (invoke);
@ -235,16 +235,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -235,16 +235,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
resolveResult = invocationExpression.Item1;
if (resolveResult is MethodGroupResolveResult)
return factory.CreateMethodDataProvider (CollectMethods (invoke.Node, resolveResult as MethodGroupResolveResult));
return factory.CreateMethodDataProvider (document.GetOffset (invoke.Node.StartLocation), CollectMethods (invoke.Node, resolveResult as MethodGroupResolveResult));
if (resolveResult is MemberResolveResult) {
if (resolveResult.Type.Kind == TypeKind.Delegate)
return factory.CreateDelegateDataProvider (resolveResult.Type);
return factory.CreateDelegateDataProvider (document.GetOffset (invoke.Node.StartLocation), resolveResult.Type);
var mr = resolveResult as MemberResolveResult;
if (mr.Member is IMethod)
return factory.CreateMethodDataProvider (new [] { (IMethod)mr.Member });
return factory.CreateMethodDataProvider (document.GetOffset (invoke.Node.StartLocation), new [] { (IMethod)mr.Member });
}
if (resolveResult != null)
return factory.CreateIndexerParameterDataProvider (resolveResult.Type, invoke.Node);
return factory.CreateIndexerParameterDataProvider (document.GetOffset (invoke.Node.StartLocation), resolveResult.Type, invoke.Node);
break;
case '<':
invoke = GetTypeBeforeCursor ();
@ -254,7 +254,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -254,7 +254,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (tExpr == null || tExpr.Item1 == null || tExpr.Item1.IsError)
return null;
return factory.CreateTypeParameterDataProvider (CollectAllTypes (tExpr.Item1.Type));
return factory.CreateTypeParameterDataProvider (document.GetOffset (invoke.Node.StartLocation), CollectAllTypes (tExpr.Item1.Type));
case '[':
invoke = GetIndexerBeforeCursor ();
if (invoke == null)
@ -262,7 +262,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -262,7 +262,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var indexerExpression = ResolveExpression (invoke);
if (indexerExpression == null || indexerExpression.Item1 == null || indexerExpression.Item1.IsError)
return null;
return factory.CreateIndexerParameterDataProvider (indexerExpression.Item1.Type, invoke.Node);
return factory.CreateIndexerParameterDataProvider (document.GetOffset (invoke.Node.StartLocation), indexerExpression.Item1.Type, invoke.Node);
}
return null;
}

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

@ -33,15 +33,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -33,15 +33,15 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{
public interface IParameterCompletionDataFactory
{
IParameterDataProvider CreateConstructorProvider (IType type);
IParameterDataProvider CreateConstructorProvider (int startOffset, IType type);
IParameterDataProvider CreateMethodDataProvider (IEnumerable<IMethod> methods);
IParameterDataProvider CreateMethodDataProvider (int startOffset, IEnumerable<IMethod> methods);
IParameterDataProvider CreateDelegateDataProvider (IType type);
IParameterDataProvider CreateDelegateDataProvider (int startOffset, IType type);
IParameterDataProvider CreateIndexerParameterDataProvider (IType type, AstNode resolvedNode);
IParameterDataProvider CreateIndexerParameterDataProvider (int startOffset, IType type, AstNode resolvedNode);
IParameterDataProvider CreateTypeParameterDataProvider (IEnumerable<IType> types);
IParameterDataProvider CreateTypeParameterDataProvider (int startOffset, IEnumerable<IType> types);
}
}

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

@ -55,6 +55,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -55,6 +55,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
public IEnumerable<IMethod> Data { get; set; }
#region IParameterDataProvider implementation
public int StartOffset { get { return 0; } }
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
{
return "";
@ -94,6 +96,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -94,6 +96,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
public IEnumerable<IProperty> Data { get; set; }
#region IParameterDataProvider implementation
public int StartOffset { get { return 0; } }
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
{
return "";
@ -132,6 +136,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -132,6 +136,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
class ArrayProvider : IParameterDataProvider
{
#region IParameterDataProvider implementation
public int StartOffset { get { return 0; } }
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
{
return "";
@ -169,6 +175,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -169,6 +175,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
public IEnumerable<IType> Data { get; set; }
#region IParameterDataProvider implementation
public int StartOffset { get { return 0; } }
public string GetHeading (int overload, string[] parameterDescription, int currentParameter)
{
return "";
@ -204,7 +212,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -204,7 +212,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
}
#region IParameterCompletionDataFactory implementation
public IParameterDataProvider CreateConstructorProvider (ICSharpCode.NRefactory.TypeSystem.IType type)
public IParameterDataProvider CreateConstructorProvider (int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type)
{
return new Provider () {
@ -212,21 +220,21 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -212,21 +220,21 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
};
}
public IParameterDataProvider CreateMethodDataProvider (IEnumerable<IMethod> methods)
public IParameterDataProvider CreateMethodDataProvider (int startOffset, IEnumerable<IMethod> methods)
{
return new Provider () {
Data = methods
};
}
public IParameterDataProvider CreateDelegateDataProvider (ICSharpCode.NRefactory.TypeSystem.IType type)
public IParameterDataProvider CreateDelegateDataProvider (int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type)
{
return new Provider () {
Data = new [] { type.GetDelegateInvokeMethod () }
};
}
public IParameterDataProvider CreateIndexerParameterDataProvider (IType type, AstNode resolvedNode)
public IParameterDataProvider CreateIndexerParameterDataProvider (int startOffset, IType type, AstNode resolvedNode)
{
if (type.Kind == TypeKind.Array)
return new ArrayProvider ();
@ -234,7 +242,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -234,7 +242,8 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
Data = type.GetProperties (p => p.IsIndexer)
};
}
public IParameterDataProvider CreateTypeParameterDataProvider (IEnumerable<IType> types)
public IParameterDataProvider CreateTypeParameterDataProvider (int startOffset, IEnumerable<IType> types)
{
return new TypeParameterDataProvider () {
Data = types

7
ICSharpCode.NRefactory/Completion/IParameterDataProvider.cs

@ -40,6 +40,13 @@ namespace ICSharpCode.NRefactory.Completion @@ -40,6 +40,13 @@ namespace ICSharpCode.NRefactory.Completion
get;
}
/// <summary>
/// Gets the start offset of the parameter expression node.
/// </summary>
int StartOffset {
get;
}
/// <summary>
/// Returns the markup to use to represent the specified method overload
/// in the parameter information window.

Loading…
Cancel
Save