From 916654c166e93d04248e5068e8d89c0dee7ffcb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Mon, 25 Feb 2013 10:50:26 +0100 Subject: [PATCH] Fixed async lambda resolve bug. Would be nice to have a newer c# language spec ... --- .../Resolver/ResolveVisitor.cs | 8 +++++ .../CSharp/Resolver/LambdaTests.cs | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs index 418b1347a5..12ccc00fd3 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs @@ -2601,6 +2601,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver for (int i = 0; i < returnValues.Count; i++) { returnValues[i] = resolveResultCache[returnExpressions[i]]; } + + // async lambdas without return statements are resolved as Task return types. + if (returnExpressions.Count == 0 && isAsync) { + inferredReturnType = resolver.Compilation.FindType(KnownTypeCode.Task); + Log.WriteLine("Lambda return type was inferred to: " + inferredReturnType); + return; + } + TypeInference ti = new TypeInference(resolver.Compilation, resolver.conversions); bool tiSuccess; inferredReturnType = ti.GetBestCommonType(returnValues, out tiSuccess); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs index fc07c48459..67766a4c31 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs @@ -635,5 +635,38 @@ class TestClass { Assert.IsFalse(mrr.IsError); Assert.AreEqual("System.Int32", mrr.Type.ReflectionName); } + + [Test] + public void AsyncLambdaWithAwait() + { + string program = @" +using System; +using System.Threading.Tasks; + +class A +{ + public Task OpenAsync () + { + return null; + } +} + +class C +{ + async void Foo () + { + await $Test (async () => { await new A().OpenAsync (); })$; + } + + T Test (Func func) + { + return default (T); + } +} +"; + var mrr = Resolve(program); + Assert.IsFalse(mrr.IsError); + Assert.AreEqual("System.Threading.Tasks.Task", mrr.Type.ReflectionName); + } } }