Browse Source

fixed return types of anonymous type properties.

Re-used the var type reference for that.
newNRvisualizers
Mike Krüger 15 years ago
parent
commit
5c398f2698
  1. 40
      ICSharpCode.NRefactory/CSharp/Resolver/ResolveVisitor.cs

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

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
using System;
@ -550,36 +550,44 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -550,36 +550,44 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
throw new NotImplementedException();
}
static string GetAnonymousTypePropertyName (Expression expr)
static string GetAnonymousTypePropertyName(Expression expr, out Expression resolveExpr)
{
if (expr is NamedArgumentExpression)
return ((NamedArgumentExpression)expr).Identifier;
if (expr is NamedArgumentExpression) {
var namedArgExpr = (NamedArgumentExpression)expr;
resolveExpr = namedArgExpr.Expression;
return namedArgExpr.Identifier;
}
// no name given, so it's a projection initializer
if (expr is MemberReferenceExpression)
if (expr is MemberReferenceExpression) {
resolveExpr = expr;
return ((MemberReferenceExpression)expr).MemberName;
if (expr is IdentifierExpression)
}
if (expr is IdentifierExpression) {
resolveExpr = expr;
return ((IdentifierExpression)expr).Identifier;
}
resolveExpr = null;
return null;
}
public override ResolveResult VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression, object data)
{
// 7.6.10.6 Anonymous object creation expressions
var anonymousType = new DefaultTypeDefinition (resolver.CurrentTypeDefinition, "$Anonymous$");
// This is & the name is the only flag of anonymous types - maybe making an own anonymous type definition?
var anonymousType = new DefaultTypeDefinition(resolver.CurrentTypeDefinition, "$Anonymous$");
anonymousType.IsSynthetic = true;
foreach (var expr in anonymousTypeCreateExpression.Initializer) {
var name = GetAnonymousTypePropertyName (expr);
if (string.IsNullOrEmpty (name))
Expression resolveExpr;
var name = GetAnonymousTypePropertyName(expr, out resolveExpr);
if (string.IsNullOrEmpty(name))
continue;
var property = new DefaultProperty (anonymousType, name) {
var property = new DefaultProperty(anonymousType, name) {
Accessibility = Accessibility.Public,
ReturnType = Resolve (expr).Type
ReturnType = new VarTypeReference(this, resolver.Clone(), resolveExpr, false)
};
anonymousType.Properties.Add (property);
anonymousType.Properties.Add(property);
}
return new TypeResolveResult (anonymousType);
return new TypeResolveResult(anonymousType);
}
public override ResolveResult VisitArrayCreateExpression(ArrayCreateExpression arrayCreateExpression, object data)
@ -990,7 +998,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -990,7 +998,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ITypeReference type = MakeTypeReference(variableDeclarationStatement.Type,
firstInitializer != null ? firstInitializer.Initializer : null,
false);
int initializerCount = variableDeclarationStatement.Variables.Count;
ResolveResult result = null;
for (AstNode node = variableDeclarationStatement.FirstChild; node != null; node = node.NextSibling) {

Loading…
Cancel
Save