diff --git a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs index 98caa9f636..5ff1c9f7d8 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs @@ -417,6 +417,9 @@ namespace ICSharpCode.SharpDevelop.Debugging } if (result is MixedResolveResult) return GetText(((MixedResolveResult)result).PrimaryResult, expression, out debuggerCanShowValue); + else if (result is DelegateCallResolveResult) + return GetText(((DelegateCallResolveResult)result).Target, expression, out debuggerCanShowValue); + IAmbience ambience = AmbienceService.GetCurrentAmbience(); ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.UseFullyQualifiedMemberNames; if (result is MemberResolveResult) { diff --git a/src/Main/Base/Test/NRefactoryResolverTests.cs b/src/Main/Base/Test/NRefactoryResolverTests.cs index 18fe855de6..9adeb6d0ad 100644 --- a/src/Main/Base/Test/NRefactoryResolverTests.cs +++ b/src/Main/Base/Test/NRefactoryResolverTests.cs @@ -2109,6 +2109,22 @@ class TestClass { Assert.AreEqual("System.Int32", lrr.ResolvedType.DotNetName); } + [Test] + public void LambdaInGenericConstructorTest() + { + string program = @"using System; +class TestClass { + static void Main() { + var t = new SomeClass(i => Console.WriteLine(i)); + } +} +class SomeClass { + public SomeClass(Action ac) { } +}"; + var lrr = Resolve(program, "i", 4, 33, ExpressionContext.Default); + Assert.AreEqual("System.String", lrr.ResolvedType.DotNetName); + } + [Test] public void IncompleteLambdaTest() { diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs index ed6f484b93..6e88cee8e2 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs @@ -258,7 +258,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver // call to constructor return ResolveConstructorOverload(resolver.CallingClass, invocationExpression.Arguments); } else if (invocationExpression.TargetObject is BaseReferenceExpression) { - return ResolveConstructorOverload(resolver.CallingClass.BaseClass, invocationExpression.Arguments); + return ResolveConstructorOverload(resolver.CallingClass.BaseType, invocationExpression.Arguments); } } @@ -430,7 +430,18 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { if (rt == null) return null; - ResolveResult rr = ResolveConstructorOverload(rt.GetUnderlyingClass(), arguments); + + List methods = rt.GetMethods().Where(m => m.IsConstructor && !m.IsStatic).ToList(); + IReturnType[] argumentTypes = arguments.Select(ResolveType).ToArray(); + bool resultIsAcceptable; + IMethod result = MemberLookupHelper.FindOverload(methods, argumentTypes, out resultIsAcceptable); + + if (result == null) { + IClass c = rt.GetUnderlyingClass(); + if (c != null) + result = Constructor.CreateDefault(c); + } + ResolveResult rr = CreateMemberResolveResult(result); if (rr != null) rr.ResolvedType = rt; return rr; @@ -440,12 +451,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { if (c == null) return null; - - List methods = c.Methods.Where(m => m.IsConstructor && !m.IsStatic).ToList(); - IReturnType[] argumentTypes = arguments.Select(ResolveType).ToArray(); - bool resultIsAcceptable; - IMethod result = MemberLookupHelper.FindOverload(methods, argumentTypes, out resultIsAcceptable); - return CreateMemberResolveResult(result ?? Constructor.CreateDefault(c)); + else + return ResolveConstructorOverload(c.DefaultReturnType, arguments); } DefaultClass CreateAnonymousTypeClass(CollectionInitializerExpression initializer) @@ -454,9 +461,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver List fieldNames = new List(); foreach (Expression expr in initializer.CreateExpressions) { - if (expr is AssignmentExpression) { + if (expr is NamedArgumentExpression) { // use right part only - fieldTypes.Add( ResolveType(((AssignmentExpression)expr).Right) ); + fieldTypes.Add( ResolveType(((NamedArgumentExpression)expr).Expression) ); } else { fieldTypes.Add( ResolveType(expr) ); } @@ -491,11 +498,9 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { if (expr is MemberReferenceExpression) { return ((MemberReferenceExpression)expr).MemberName; - } - if (expr is AssignmentExpression) { - expr = ((AssignmentExpression)expr).Left; // use left side if it is an IdentifierExpression - } - if (expr is IdentifierExpression) { + } else if (expr is NamedArgumentExpression) { + return ((NamedArgumentExpression)expr).Name; + } else if (expr is IdentifierExpression) { return ((IdentifierExpression)expr).Identifier; } else { return "?";