Browse Source

[Completion] Filtered shadowed members in parameter completion.

newNRvisualizers
Mike Krüger 13 years ago
parent
commit
cb54c370bd
  1. 41
      ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs
  2. 2
      ICSharpCode.NRefactory.CSharp/Completion/IParameterCompletionDataFactory.cs
  3. 79
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs

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

@ -109,6 +109,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -109,6 +109,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (resolvedNode is IdentifierExpression && currentMember != null && currentMember.IsStatic || resolveResult.TargetResult is TypeResolveResult) {
onlyStatic = true;
}
var methods = new List<IMethod>();
foreach (var method in resolveResult.Methods) {
if (method.IsConstructor) {
continue;
@ -118,15 +119,47 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -118,15 +119,47 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (onlyStatic && !method.IsStatic) {
continue;
}
yield return method;
if (method.IsShadowing) {
for (int j = 0; j < methods.Count; j++) {
if (ParameterListComparer.Instance.Equals(methods[j].Parameters, method.Parameters)) {
methods.RemoveAt (j);
j--;
}
}
}
methods.Add (method);
}
foreach (var m in methods)
yield return m;
foreach (var extMethods in resolveResult.GetEligibleExtensionMethods (true)) {
foreach (var method in extMethods) {
yield return method;
}
}
}
IEnumerable<IProperty> GetAccessibleIndexers(IType type)
{
var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly);
var properties = new List<IProperty>();
foreach (var property in type.GetProperties ()) {
if (!property.IsIndexer)
continue;
if (!lookup.IsAccessible (property, true))
continue;
if (property.IsShadowing) {
for (int j = 0; j < properties.Count; j++) {
if (ParameterListComparer.Instance.Equals(properties[j].Parameters, property.Parameters)) {
properties.RemoveAt (j);
j--;
}
}
}
properties.Add (property);
}
return properties;
}
public IParameterDataProvider GetParameterDataProvider(int offset, char completionChar)
{
@ -259,7 +292,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -259,7 +292,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
}
if (resolveResult != null) {
return factory.CreateIndexerParameterDataProvider(document.GetOffset(invoke.Node.StartLocation), resolveResult.Type, invoke.Node);
return factory.CreateIndexerParameterDataProvider(document.GetOffset(invoke.Node.StartLocation), resolveResult.Type, GetAccessibleIndexers (resolveResult.Type), invoke.Node);
}
break;
case '<':
@ -285,7 +318,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -285,7 +318,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (indexerExpression == null || indexerExpression.Item1 == null || indexerExpression.Item1.IsError) {
return null;
}
return factory.CreateIndexerParameterDataProvider(document.GetOffset(invoke.Node.StartLocation), indexerExpression.Item1.Type, invoke.Node);
return factory.CreateIndexerParameterDataProvider(document.GetOffset(invoke.Node.StartLocation), indexerExpression.Item1.Type, GetAccessibleIndexers (indexerExpression.Item1.Type), invoke.Node);
}
return null;
}

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

@ -44,7 +44,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -44,7 +44,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
IParameterDataProvider CreateDelegateDataProvider (int startOffset, IType type);
IParameterDataProvider CreateIndexerParameterDataProvider (int startOffset, IType type, AstNode resolvedNode);
IParameterDataProvider CreateIndexerParameterDataProvider (int startOffset, IType type, IEnumerable<IProperty> accessibleIndexers, AstNode resolvedNode);
IParameterDataProvider CreateTypeParameterDataProvider (int startOffset, IEnumerable<IType> types);
}

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

@ -262,13 +262,13 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -262,13 +262,13 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
};
}
public IParameterDataProvider CreateIndexerParameterDataProvider(int startOffset, IType type, AstNode resolvedNode)
public IParameterDataProvider CreateIndexerParameterDataProvider(int startOffset, IType type, IEnumerable<IProperty> accessibleIndexers, AstNode resolvedNode)
{
Assert.IsTrue(type.Kind != TypeKind.Unknown);
if (type.Kind == TypeKind.Array)
return new ArrayProvider ();
return new IndexerProvider () {
Data = type.GetProperties (p => p.IsIndexer)
Data = accessibleIndexers
};
}
@ -1040,7 +1040,7 @@ class TestClass @@ -1040,7 +1040,7 @@ class TestClass
Assert.IsTrue (provider == null || provider.Count == 0);
}
[Test()]
[Test]
public void TestJaggedArrayCreationCase2()
{
IParameterDataProvider provider = CreateProvider(
@ -1057,5 +1057,78 @@ class TestClass @@ -1057,5 +1057,78 @@ class TestClass
Assert.IsTrue (provider == null || provider.Count == 0);
}
/// <summary>
/// Bug 9301 - Inaccessible indexer overload in completion
/// </summary>
[Test]
public void TestBug9301()
{
IParameterDataProvider provider = CreateProvider(
@"using System;
public class A
{
public virtual int this [int i, string s] {
get {
return 1;
}
}
}
public class B : A
{
public new bool this [int i, string s2] {
get {
return true;
}
}
}
public class Test
{
public static int Main ()
{
B p = new B ();
$p[$
return 0;
}
}
");
Assert.AreEqual (1, provider.Count);
}
[Test]
public void TestBug9301Case2()
{
IParameterDataProvider provider = CreateProvider(
@"using System;
public class A
{
public virtual int Test (int i, string s) {
return 1;
}
}
public class B : A
{
public new bool Test (int i, string s2) {
return true;
}
}
public class Test
{
public static int Main ()
{
B p = new B ();
$p.Test($
return 0;
}
}
");
Assert.AreEqual (1, provider.Count);
}
}
}
Loading…
Cancel
Save