diff --git a/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs b/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs index 74a3bb9e8..8bf4338ff 100644 --- a/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs +++ b/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs @@ -180,7 +180,7 @@ class $A "; CollectMembers(code, "A"); } - + [Test] public void TestShadowedMember () { @@ -201,6 +201,32 @@ public int Prop + + [Test] + public void TestShadowedMemberCase2 () + { + var code = @"interface IA +{ + int $Prop { get; set; } +} + +class A : IA +{ + public int $Prop + { get; set; } +} + +class B : A, IA +{ + public int $Prop + { get; set; } +} +"; + CollectMembers(code, "A.Prop"); + } + + + } } diff --git a/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs b/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs index fdd7408d0..9c2cf6085 100644 --- a/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs +++ b/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs @@ -118,36 +118,38 @@ public IEnumerable GetRelatedSymbols(TypeGraph g, ISymbol m) case SymbolKind.Indexer: case SymbolKind.Event: case SymbolKind.Property: - return new ISymbol[] { m }; - - case SymbolKind.Method: - var method = (IMethod)m; + case SymbolKind.Method: { + var member = (IMember)m; List symbols = new List (); - if (method.ImplementedInterfaceMembers.Count > 0) { - foreach (var m2 in method.ImplementedInterfaceMembers) { + if (member.ImplementedInterfaceMembers.Count > 0) { + foreach (var m2 in member.ImplementedInterfaceMembers) { symbols.AddRange (GetRelatedSymbols (g, m2)); } } else { - symbols.Add (method); + symbols.Add (member); } - if (method.DeclaringType.Kind == TypeKind.Interface) { - foreach (var derivedType in g.GetNode (method.DeclaringTypeDefinition).DerivedTypes) { - var member = SearchMember (derivedType.TypeDefinition, method); - if (member != null) - symbols.Add (member); + if (member.DeclaringType.Kind == TypeKind.Interface) { + foreach (var derivedType in g.GetNode (member.DeclaringTypeDefinition).DerivedTypes) { + var mem = SearchMember (derivedType.TypeDefinition, member); + if (mem != null) + symbols.Add (mem); } } if (IncludeOverloads) { IncludeOverloads = false; - foreach (var m3 in CollectOverloads (g, method)) { - symbols.AddRange (GetRelatedSymbols (g, m3)); + if (member is IMethod) { + foreach (var m3 in CollectOverloads (g, (IMethod)member)) { + symbols.AddRange (GetRelatedSymbols (g, m3)); + } + } else if (member.SymbolKind == SymbolKind.Indexer) { + symbols.AddRange (member.DeclaringTypeDefinition.GetProperties (p => p.IsIndexer)); } } return MakeUnique (symbols); - + } case SymbolKind.Namespace: // TODO? return new ISymbol[] { m };