Browse Source

Fix "find references" for method group conversions in delegate creation expressions "new Action(MyMethod)"

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
cfe807ab73
  1. 20
      ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs
  2. 13
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
  3. 8
      ICSharpCode.NRefactory.ConsistencyCheck/Program.cs
  4. 20
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs

20
ICSharpCode.NRefactory.CSharp/Resolver/OverloadResolution.cs

@ -301,20 +301,12 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -301,20 +301,12 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
internal void LogCandidateAddingResult(string text, IParameterizedMember method, OverloadResolutionErrors errors)
{
#if DEBUG
StringBuilder b = new StringBuilder(text);
b.Append(' ');
b.Append(method);
b.Append(" = ");
if (errors == OverloadResolutionErrors.None)
b.Append("Success");
else
b.Append(errors);
if (this.BestCandidate == method) {
b.Append(" (best candidate so far)");
} else if (this.BestCandidateAmbiguousWith == method) {
b.Append(" (ambiguous)");
}
Log.WriteLine(b.ToString());
Log.WriteLine(string.Format("{0} {1} = {2}{3}",
text, method,
errors == OverloadResolutionErrors.None ? "Success" : errors.ToString(),
this.BestCandidate == method ? " (best candidate so far)" :
this.BestCandidateAmbiguousWith == method ? " (ambiguous)" : ""
));
#endif
}
#endregion

13
ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs

@ -1321,13 +1321,18 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1321,13 +1321,18 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ResolveResult[] arguments = GetArguments(objectCreateExpression.Arguments, out argumentNames);
ResolveResult rr = resolver.ResolveObjectCreation(type, arguments, argumentNames);
if (arguments.Length == 1) {
if (arguments.Length == 1 && rr.Type.Kind == TypeKind.Delegate) {
// process conversion in case it's a delegate creation
ProcessConversionResult(objectCreateExpression.Arguments.Single(), rr as ConversionResolveResult);
// wrap the result so that the delegate creation is not handled as a reference
// to the target method - otherwise FindReferencedEntities would produce two results for
// the same delegate creation.
return WrapResult(rr);
} else {
// process conversions in all other cases
ProcessConversionsInInvocation(null, objectCreateExpression.Arguments, rr as CSharpInvocationResolveResult);
return rr;
}
// process conversions in all other cases
ProcessConversionsInInvocation(null, objectCreateExpression.Arguments, rr as CSharpInvocationResolveResult);
return rr;
} else {
ScanChildren(objectCreateExpression);
return null;

8
ICSharpCode.NRefactory.ConsistencyCheck/Program.cs

@ -36,9 +36,9 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck @@ -36,9 +36,9 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
@"C:\Program Files (x86)\GtkSharp\2.12\lib\Mono.Posix",
@"C:\work\SD\src\Tools\NUnit"
};
public const string SolutionFile = @"C:\work\NRefactory\NRefactory.sln";
//public const string SolutionFile = @"C:\work\NRefactory\NRefactory.sln";
//public const string SolutionFile = @"C:\work\SD\SharpDevelop.sln";
//public const string SolutionFile = @"C:\work\ILSpy\ILSpy.sln";
public const string SolutionFile = @"C:\work\ILSpy\ILSpy.sln";
public const string TempPath = @"C:\temp";
@ -57,8 +57,8 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck @@ -57,8 +57,8 @@ namespace ICSharpCode.NRefactory.ConsistencyCheck
solution.Projects.Count);
//RunTestOnAllFiles("Roundtripping test", RoundtripTest.RunTest);
//RunTestOnAllFiles("Resolver test", ResolverTest.RunTest);
//RunTestOnAllFiles("Resolver test (randomized order)", RandomizedOrderResolverTest.RunTest);
RunTestOnAllFiles("Resolver test", ResolverTest.RunTest);
RunTestOnAllFiles("Resolver test (randomized order)", RandomizedOrderResolverTest.RunTest);
new FindReferencesConsistencyCheck(solution).Run();
Console.Write("Press any key to continue . . . ");

20
ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs

@ -87,5 +87,25 @@ class Test { @@ -87,5 +87,25 @@ class Test {
Assert.AreEqual(new [] { new TextLocation(4, 13), new TextLocation(7, 2) },
FindReferences(m_string).Select(n => n.StartLocation).ToArray());
}
[Test]
public void FindMethodGroupReferenceInExplicitDelegateCreation()
{
Init(@"using System;
class Test {
static void T(Action<int> a, Action<string> b) {
this.T(new Action<int>(M), new Action<string>(M));
}
static void M(int a) {}
static void M(string a) {}
}");
var test = compilation.MainAssembly.TopLevelTypeDefinitions.Single();
var m_int = test.Methods.Single(m => m.Name == "M" && m.Parameters.Single().Type.Name == "Int32");
var m_string = test.Methods.Single(m => m.Name == "M" && m.Parameters.Single().Type.Name == "String");
Assert.AreEqual(new [] { new TextLocation(4, 26), new TextLocation(6, 2) },
FindReferences(m_int).Select(n => n.StartLocation).ToArray());
Assert.AreEqual(new [] { new TextLocation(4, 49), new TextLocation(7, 2) },
FindReferences(m_string).Select(n => n.StartLocation).ToArray());
}
}
}

Loading…
Cancel
Save