Browse Source

Fixed bug in override completion.

newNRvisualizers
mike 14 years ago
parent
commit
f78b052fb1
  1. 22
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 25
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

22
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -1562,7 +1562,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
IEnumerable<ICompletionData> GetOverrideCompletionData(IUnresolvedTypeDefinition type, string modifiers) IEnumerable<ICompletionData> GetOverrideCompletionData(IUnresolvedTypeDefinition type, string modifiers)
{ {
var wrapper = new CompletionDataWrapper (this); var wrapper = new CompletionDataWrapper (this);
var alreadyInserted = new Dictionary<string, bool> (); var alreadyInserted = new List<IMember> ();
//bool addedVirtuals = false; //bool addedVirtuals = false;
int declarationBegin = offset; int declarationBegin = offset;
@ -1644,16 +1644,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null; return null;
} }
static string GetNameWithParamCount(IMember member) void AddVirtuals(List<IMember> alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin)
{
var e = member as IMethod;
if (e == null || e.TypeParameters.Count == 0) {
return member.Name;
}
return e.Name + "`" + e.TypeParameters.Count;
}
void AddVirtuals(Dictionary<string, bool> alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin)
{ {
if (curType == null) { if (curType == null) {
return; return;
@ -1668,17 +1659,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
var data = factory.CreateNewOverrideCompletionData(declarationBegin, currentType, m); var data = factory.CreateNewOverrideCompletionData(declarationBegin, currentType, m);
string text = GetNameWithParamCount(m);
// check if the member is already implemented // 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) { if (foundMember) {
continue; continue;
} }
if (alreadyInserted.ContainsKey(text)) { if (alreadyInserted.Any(cm => SignatureComparer.Ordinal.Equals(cm, m)))
continue; continue;
} alreadyInserted.Add (m);
alreadyInserted [text] = true;
data.CompletionCategory = col.GetCompletionCategory(curType); data.CompletionCategory = col.GetCompletionCategory(curType);
col.Add(data); col.Add(data);
} }

25
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -4765,5 +4765,30 @@ class MainClass
Assert.IsNull (provider.Find ("IEnumerable"), "'IEnumerable' found."); Assert.IsNull (provider.Find ("IEnumerable"), "'IEnumerable' found.");
} }
/// <summary>
/// Bug 3957 - [New Resolver]Override completion doesn't work well for overloaded methods
/// </summary>
[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 ());
}
} }
} }

Loading…
Cancel
Save