diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 0d122b1b33..4b284445e3 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -1562,7 +1562,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IEnumerable GetOverrideCompletionData(IUnresolvedTypeDefinition type, string modifiers) { var wrapper = new CompletionDataWrapper (this); - var alreadyInserted = new Dictionary (); + var alreadyInserted = new List (); //bool addedVirtuals = false; int declarationBegin = offset; @@ -1644,16 +1644,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - static string GetNameWithParamCount(IMember member) - { - var e = member as IMethod; - if (e == null || e.TypeParameters.Count == 0) { - return member.Name; - } - return e.Name + "`" + e.TypeParameters.Count; - } - - void AddVirtuals(Dictionary alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin) + void AddVirtuals(List alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin) { if (curType == null) { return; @@ -1668,17 +1659,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var data = factory.CreateNewOverrideCompletionData(declarationBegin, currentType, m); - string text = GetNameWithParamCount(m); - // check if the member is already implemented - bool foundMember = curType.GetMembers().Any(cm => GetNameWithParamCount(cm) == text && cm.DeclaringTypeDefinition == curType.GetDefinition()); + bool foundMember = curType.GetMembers().Any(cm => SignatureComparer.Ordinal.Equals(cm, m) && cm.DeclaringTypeDefinition == curType.GetDefinition()); if (foundMember) { continue; } - if (alreadyInserted.ContainsKey(text)) { + if (alreadyInserted.Any(cm => SignatureComparer.Ordinal.Equals(cm, m))) continue; - } - alreadyInserted [text] = true; + alreadyInserted.Add (m); data.CompletionCategory = col.GetCompletionCategory(curType); col.Add(data); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index cebaeaac37..5f4bd75469 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -4765,5 +4765,30 @@ class MainClass Assert.IsNull (provider.Find ("IEnumerable"), "'IEnumerable' found."); } + + /// + /// Bug 3957 - [New Resolver]Override completion doesn't work well for overloaded methods + /// + [Test()] + public void TestBug3957 () + { + var provider = CreateProvider ( +@"class A +{ + public virtual void Method() + {} + public virtual void Method(int i) + {} +} + +class B : A +{ + $override $ +} + +"); + Assert.AreEqual (2, provider.Data.Where (d => d.DisplayText == "Method").Count ()); + } + } }