diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 8d12014a5b..21e7ad2426 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -954,6 +954,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return wrapper.Result; } + 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, ITypeDefinition type, string modifiers, ITypeDefinition curType, int declarationBegin) { if (curType == null) @@ -966,9 +974,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion continue; var data = factory.CreateNewOverrideCompletionData (declarationBegin, type, m); - string text = m.ReflectionName; //TODO:correct ? + string text = GetNameWithParamCount (m); + // check if the member is already implemented - bool foundMember = type.Members.Any (cm => cm.ReflectionName /*amb.GetString (ctx, cm, OutputFlags.ClassBrowserEntries)*/ == text); + bool foundMember = type.Members.Any (cm => GetNameWithParamCount (cm) == text); if (!foundMember && !alreadyInserted.ContainsKey (text)) { alreadyInserted [text] = true; data.CompletionCategory = col.GetCompletionCategory (curType); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index c55953fa82..a43fc8cf5d 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -151,7 +151,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion public ICompletionData CreateNewOverrideCompletionData (int declarationBegin, ICSharpCode.NRefactory.TypeSystem.ITypeDefinition type, ICSharpCode.NRefactory.TypeSystem.IMember m) { - return new CompletionData (type.Name); + return new CompletionData (m.Name); } public System.Collections.Generic.IEnumerable CreateCodeTemplateCompletionData () @@ -1104,27 +1104,22 @@ namespace CCTests { CompletionDataList provider = CreateProvider ( @" -namespace System { - public class Object - { - public virtual int GetHashCode () - { - } - protected virtual void Finalize () - { - } - } -} public class TestMe : System.Object { $override $ + + public override string ToString () + { + return null; + } }"); Assert.IsNotNull (provider, "provider not found."); - Assert.AreEqual (1, provider.Count); + Assert.AreEqual (2, provider.Count); Assert.IsNull (provider.Find ("Finalize"), "method 'Finalize' found, but shouldn't."); Assert.IsNotNull (provider.Find ("GetHashCode"), "method 'GetHashCode' not found."); + Assert.IsNotNull (provider.Find ("Equals"), "method 'Equals' not found."); } - + /// /// Bug 457003 - code completion shows variables out of scope ///