Browse Source

ResolveAtLocation: when resolving a method name within a delegate creation, produce MemberResolveResult instead of MethodGroupResolveResult.

pull/32/merge
Daniel Grunwald 13 years ago
parent
commit
b3c2b0ce9d
  1. 17
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs
  2. 40
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs

17
ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs

@ -102,10 +102,19 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -102,10 +102,19 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
// TODO: I think we should provide an overload so that an existing CSharpAstResolver can be reused
CSharpAstResolver resolver = new CSharpAstResolver(compilation.Value, syntaxTree, unresolvedFile);
ResolveResult rr = resolver.Resolve(node, cancellationToken);
if (rr is MethodGroupResolveResult && parentInvocation != null)
return resolver.Resolve(parentInvocation);
else
return rr;
MethodGroupResolveResult mgrr = rr as MethodGroupResolveResult;
if (mgrr != null) {
// For method groups, resolve the parent invocation instead.
if (parentInvocation != null)
return resolver.Resolve(parentInvocation);
if (node is Expression) {
// If it's not an invocation, try if it's a conversion to a delegate type:
Conversion c = resolver.GetConversion((Expression)node, cancellationToken);
if (c.IsMethodGroupConversion)
return new MemberResolveResult(mgrr.TargetResult, c.Method);
}
}
return rr;
}
}
}

40
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs

@ -136,7 +136,7 @@ class A { public A() : ba$se() {} }"); @@ -136,7 +136,7 @@ class A { public A() : ba$se() {} }");
[Test]
public void TestBug5114()
{
var rr = ResolveAtLocation<MethodGroupResolveResult>(
var rr = ResolveAtLocation<MemberResolveResult>(
@"using System;
namespace Bug5114
@ -159,7 +159,7 @@ namespace Bug5114 @@ -159,7 +159,7 @@ namespace Bug5114
}
}
");
Assert.AreEqual("HandleLongPressGesture", rr.MethodName);
Assert.AreEqual("HandleLongPressGesture", rr.Member.Name);
}
[Test]
@ -202,5 +202,41 @@ namespace TestCrash @@ -202,5 +202,41 @@ namespace TestCrash
Assert.AreEqual("A", rr.Type.Name);
}
[Test]
public void CreateDelegateFromOverloadedMethod()
{
var rr = ResolveAtLocation<MemberResolveResult>(
@"using System;
class Test {
public void Method() {}
public void Method(int a) {}
public Test() {
Action a = Meth$od;
}
}
");
Assert.AreEqual("Method", rr.Member.Name);
Assert.AreEqual(0, ((IMethod)rr.Member).Parameters.Count);
}
[Test]
public void ExplicitlyCreateDelegateFromOverloadedMethod()
{
var rr = ResolveAtLocation<MemberResolveResult>(
@"using System;
class Test {
public void Method() {}
public void Method(int a) {}
public Test() {
Action a = new Action(Meth$od);
}
}
");
Assert.AreEqual("Method", rr.Member.Name);
Assert.AreEqual(0, ((IMethod)rr.Member).Parameters.Count);
}
}
}

Loading…
Cancel
Save