Browse Source

r7314@daniel-notebook (orig r3345): daniel | 2008-08-14 11:39:56 +0200

Fixed SD2-1399: Lambda type inference fails when using a lambda in an object initializer


git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3347 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
8d910894e5
  1. 19
      src/Main/Base/Test/NRefactoryResolverTests.cs
  2. 33
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

19
src/Main/Base/Test/NRefactoryResolverTests.cs

@ -2236,6 +2236,25 @@ class TestClass { @@ -2236,6 +2236,25 @@ class TestClass {
Assert.AreEqual("System.Int32", lrr.ResolvedType.DotNetName);
}
[Test]
public void LambdaInObjectInitializerTest()
{
string program = @"using System;
class X {
void SomeMethod() {
Helper h = new Helper {
F = i => i.ToString()
};
}
}
class Helper {
public Converter<int, string> F;
}
";
var lrr = Resolve<LocalResolveResult>(program, "i", 5, 13, ExpressionContext.Default);
Assert.AreEqual("System.Int32", lrr.ResolvedType.DotNetName);
}
[Test]
public void IncompleteLambdaTest()
{

33
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

@ -759,19 +759,24 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -759,19 +759,24 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
List<IMember> ObjectInitializerCtrlSpace(CompilationUnit parsedCu, NR.Location location, out bool isCollectionInitializer)
{
List<IMember> results = new List<IMember>();
isCollectionInitializer = true;
FindObjectInitializerExpressionContainingCaretVisitor v = new FindObjectInitializerExpressionContainingCaretVisitor(location);
parsedCu.AcceptVisitor(v, null);
if (v.result != null) {
ObjectCreateExpression oce = v.result.Parent as ObjectCreateExpression;
NamedArgumentExpression nae = v.result.Parent as NamedArgumentExpression;
return ObjectInitializerCtrlSpace(v.result, out isCollectionInitializer);
}
List<IMember> ObjectInitializerCtrlSpace(CollectionInitializerExpression collectionInitializer, out bool isCollectionInitializer)
{
isCollectionInitializer = true;
List<IMember> results = new List<IMember>();
if (collectionInitializer != null) {
ObjectCreateExpression oce = collectionInitializer.Parent as ObjectCreateExpression;
NamedArgumentExpression nae = collectionInitializer.Parent as NamedArgumentExpression;
if (oce != null && !oce.IsAnonymousType) {
IReturnType resolvedType = TypeVisitor.CreateReturnType(oce.CreateType, this);
ObjectInitializerCtrlSpaceInternal(results, resolvedType, out isCollectionInitializer);
} else if (nae != null) {
bool tmp;
IMember member = ObjectInitializerCtrlSpace(parsedCu, nae.StartLocation, out tmp).Find(m => IsSameName(m.Name, nae.Name));
}
else if (nae != null) {
IMember member = ResolveNamedArgumentExpressionInObjectInitializer(nae);
if (member != null) {
ObjectInitializerCtrlSpaceInternal(results, member.ReturnType, out isCollectionInitializer);
}
@ -780,6 +785,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -780,6 +785,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
return results;
}
IMember ResolveNamedArgumentExpressionInObjectInitializer(NamedArgumentExpression nae)
{
CollectionInitializerExpression parentCI = nae.Parent as CollectionInitializerExpression;
bool tmp;
return ObjectInitializerCtrlSpace(parentCI, out tmp).Find(m => IsSameName(m.Name, nae.Name));
}
void ObjectInitializerCtrlSpaceInternal(List<IMember> results, IReturnType resolvedType, out bool isCollectionInitializer)
{
isCollectionInitializer = MemberLookupHelper.ConversionExists(resolvedType, new GetClassReturnType(projectContent, "System.Collections.IEnumerable", 0));
@ -1311,6 +1323,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -1311,6 +1323,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (rr != null)
return rr.ResolvedType;
}
if (expr.Parent is NamedArgumentExpression) {
IMember m = ResolveNamedArgumentExpressionInObjectInitializer((NamedArgumentExpression)expr.Parent);
if (m != null)
return m.ReturnType;
}
if (expr.Parent is CollectionInitializerExpression) {
IReturnType collectionType;
if (expr.Parent.Parent is ObjectCreateExpression)

Loading…
Cancel
Save