diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs index 74ab04cbbc..276569d1b0 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveAtLocation.cs @@ -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; } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs index a996956058..2ca96d9e06 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/ResolveAtLocationTests.cs @@ -136,7 +136,7 @@ class A { public A() : ba$se() {} }"); [Test] public void TestBug5114() { - var rr = ResolveAtLocation( + var rr = ResolveAtLocation( @"using System; 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 Assert.AreEqual("A", rr.Type.Name); } + + [Test] + public void CreateDelegateFromOverloadedMethod() + { + var rr = ResolveAtLocation( + @"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( + @"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); + } } }