Browse Source

Implemented indexer parameter data provider.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
4824080f99
  1. 44
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  2. 2
      ICSharpCode.NRefactory.CSharp/Completion/IParameterCompletionDataFactory.cs
  3. 55
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

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

@ -42,20 +42,45 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -42,20 +42,45 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
this.document = document;
this.factory = factory;
}
public Tuple<CSharpParsedFile, AstNode, CompilationUnit> GetIndexerBeforeCursor ()
{
CompilationUnit baseUnit;
if (currentMember == null && currentType == null)
return null;
baseUnit = ParseStub ("x] = a[1");
var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin;
var mref = baseUnit.GetNodeAt (location, n => n is IndexerExpression);
Print (baseUnit);
AstNode expr;
if (mref is IndexerExpression) {
expr = ((IndexerExpression)mref).Target;
} else {
return null;
}
var member = Unit.GetNodeAt<AttributedNode> (memberLocation);
var member2 = baseUnit.GetNodeAt<AttributedNode> (memberLocation);
member2.Remove ();
member.ReplaceWith (member2);
var tsvisitor = new TypeSystemConvertVisitor (ProjectContent, CSharpParsedFile.FileName);
Unit.AcceptVisitor (tsvisitor, null);
return Tuple.Create (tsvisitor.ParsedFile, (AstNode)expr, Unit);
}
public IParameterDataProvider GetParameterDataProvider (int offset)
{
if (offset <= 0)
return null;
SetOffset (offset);
char completionChar = document.GetCharAt (offset - 1);
if (completionChar != '(' && completionChar != '<' && completionChar != '[')
return null;
if (IsInsideComment () || IsInsideString ())
return null;
var invoke = GetInvocationBeforeCursor (true);
var invoke = GetInvocationBeforeCursor (true) ?? GetIndexerBeforeCursor ();
if (invoke == null)
return null;
@ -106,16 +131,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -106,16 +131,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
// if (string.IsNullOrEmpty (result.Expression))
// return null;
// return new NRefactoryTemplateParameterDataProvider (textEditorData, resolver, GetUsedNamespaces (), result, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset));
// case '[': {
// ResolveResult resolveResult = resolver.Resolve (result, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset));
// if (resolveResult != null && !resolveResult.StaticResolve) {
// IType type = dom.GetType (resolveResult.ResolvedType);
// if (type != null)
// return new NRefactoryIndexerParameterDataProvider (textEditorData, type, result.Expression);
// }
// return null;
// }
case '[':
var indexerExpression = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3);
if (indexerExpression == null || indexerExpression.Item1 == null || indexerExpression.Item1.IsError)
return null;
return factory.CreateIndexerParameterDataProvider (indexerExpression.Item1.Type, invoke.Item2);
}
return null;
}

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

@ -39,6 +39,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -39,6 +39,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
IParameterDataProvider CreateMethodDataProvider (IMethod method);
IParameterDataProvider CreateDelegateDataProvider (IType type);
IParameterDataProvider CreateIndexerParameterDataProvider (IType type, AstNode resolvedNode);
}
}

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

@ -76,8 +76,36 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -76,8 +76,36 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
}
}
#endregion
}
class IndexerProvider : IParameterDataProvider
{
public IEnumerable<IProperty> Data { get; set; }
#region IParameterDataProvider implementation
public string GetMethodMarkup (int overload, string[] parameterMarkup, int currentParameter)
{
return "";
}
public string GetParameterMarkup (int overload, int paramIndex)
{
return "";
}
public int GetParameterCount (int overload)
{
var method = Data.ElementAt (overload);
return method.Parameters.Count;
}
public int OverloadCount {
get {
return Data.Count ();
}
}
#endregion
}
#region IParameterCompletionDataFactory implementation
public IParameterDataProvider CreateConstructorProvider (ICSharpCode.NRefactory.TypeSystem.IType type)
{
@ -107,6 +135,13 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -107,6 +135,13 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
Data = new [] { type.GetDelegateInvokeMethod () }
};
}
public IParameterDataProvider CreateIndexerParameterDataProvider (IType type, AstNode resolvedNode)
{
return new IndexerProvider () {
Data = type.GetProperties (ctx, p => p.IsIndexer)
};
}
#endregion
}
@ -349,5 +384,23 @@ class AClass @@ -349,5 +384,23 @@ class AClass
}
/// <summary>
/// Bug 1760 - [New Resolver] Parameter tooltip not shown for indexers
/// </summary>
[Test()]
public void Test1760 ()
{
var provider = CreateProvider (
@"
class TestClass
{
public static void Main (string[] args)
{
$args[$
}
}");
Assert.IsNotNull (provider, "provider was not created.");
Assert.AreEqual (1, provider.OverloadCount);
}
}
}
Loading…
Cancel
Save