Browse Source

Fixed async lambda resolve bug.

Would be nice to have a newer c# language spec ...
pull/32/merge
Mike Krüger 13 years ago
parent
commit
916654c166
  1. 8
      ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
  2. 33
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs

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

@ -2601,6 +2601,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
for (int i = 0; i < returnValues.Count; i++) { for (int i = 0; i < returnValues.Count; i++) {
returnValues[i] = resolveResultCache[returnExpressions[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); TypeInference ti = new TypeInference(resolver.Compilation, resolver.conversions);
bool tiSuccess; bool tiSuccess;
inferredReturnType = ti.GetBestCommonType(returnValues, out tiSuccess); inferredReturnType = ti.GetBestCommonType(returnValues, out tiSuccess);

33
ICSharpCode.NRefactory.Tests/CSharp/Resolver/LambdaTests.cs

@ -635,5 +635,38 @@ class TestClass {
Assert.IsFalse(mrr.IsError); Assert.IsFalse(mrr.IsError);
Assert.AreEqual("System.Int32", mrr.Type.ReflectionName); 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<T> (Func<T> func)
{
return default (T);
}
}
";
var mrr = Resolve<CSharpInvocationResolveResult>(program);
Assert.IsFalse(mrr.IsError);
Assert.AreEqual("System.Threading.Tasks.Task", mrr.Type.ReflectionName);
}
} }
} }

Loading…
Cancel
Save