IEnumerable<Attribute> GetAttributes(IEnumerable<Mono.CSharp.Attribute> optAttributes) { if (optAttributes == null) yield break; foreach (var attr in optAttributes) { var result = new Attribute(); result.Type = ConvertToType(attr.TypeNameExpression); var loc = LocationsBag.GetLocations(attr); result.HasArgumentList = loc != null; int pos = 0; if (loc != null) result.AddChild(new CSharpTokenNode(Convert(loc [pos++]), Roles.LPar), Roles.LPar); if (attr.PositionalArguments != null) { foreach (var arg in attr.PositionalArguments) { if (arg == null) continue; var na = arg as NamedArgument; if (na != null) { var newArg = new NamedArgumentExpression(); newArg.AddChild(Identifier.Create(na.Name, Convert(na.Location)), Roles.Identifier); var argLoc = LocationsBag.GetLocations(na); if (argLoc != null) newArg.AddChild(new CSharpTokenNode(Convert(argLoc [0]), Roles.Colon), Roles.Colon); if (na.Expr != null) newArg.AddChild((Expression)na.Expr.Accept(this), Roles.Expression); result.AddChild(newArg, Roles.Argument); } else { if (arg.Expr != null) result.AddChild((Expression)arg.Expr.Accept(this), Roles.Argument); } if (loc != null && pos + 1 < loc.Count) result.AddChild(new CSharpTokenNode(Convert(loc [pos++]), Roles.Comma), Roles.Comma); } } if (attr.NamedArguments != null) { foreach (var arg in attr.NamedArguments) { var na = (NamedArgument)arg; var newArg = new NamedExpression(); newArg.AddChild(Identifier.Create(na.Name, Convert(na.Location)), Roles.Identifier); var argLoc = LocationsBag.GetLocations(na); if (argLoc != null) newArg.AddChild(new CSharpTokenNode(Convert(argLoc [0]), Roles.Assign), Roles.Assign); if (na.Expr != null) newArg.AddChild((Expression)na.Expr.Accept(this), Roles.Expression); result.AddChild(newArg, Roles.Argument); if (loc != null && pos + 1 < loc.Count) result.AddChild(new CSharpTokenNode(Convert(loc [pos++]), Roles.Comma), Roles.Comma); } } if (loc != null && pos < loc.Count) result.AddChild(new CSharpTokenNode(Convert(loc [pos++]), Roles.RPar), Roles.RPar); yield return result; } }
void AddConvertCollectionOrObjectInitializers(Expression init, CollectionOrObjectInitializers minit) { var initLoc = LocationsBag.GetLocations(minit); var commaLoc = LocationsBag.GetLocations(minit.Initializers); int curComma = 0; init.AddChild(new CSharpTokenNode(Convert(minit.Location), Roles.LBrace), Roles.LBrace); foreach (var expr in minit.Initializers) { var collectionInit = expr as CollectionElementInitializer; if (collectionInit != null) { AstNode parent; // For ease of use purposes in the resolver the ast representation // of { a, b, c } is { {a}, {b}, {c} } - but the generated ArrayInitializerExpression // can be identified by expr.IsSingleElement. if (!collectionInit.IsSingle) { parent = new ArrayInitializerExpression(); parent.AddChild(new CSharpTokenNode(Convert(collectionInit.Location), Roles.LBrace), Roles.LBrace); } else { parent = ArrayInitializerExpression.CreateSingleElementInitializer(); } if (collectionInit.Arguments != null) { for (int i = 0; i < collectionInit.Arguments.Count; i++) { var arg = collectionInit.Arguments [i] as CollectionElementInitializer.ElementInitializerArgument; if (arg == null || arg.Expr == null) continue; parent.AddChild( (Expression)arg.Expr.Accept(this), Roles.Expression ); } } if (!collectionInit.IsSingle) { var braceLocs = LocationsBag.GetLocations(expr); if (braceLocs != null) parent.AddChild(new CSharpTokenNode(Convert(braceLocs [0]), Roles.RBrace), Roles.RBrace); } init.AddChild((ArrayInitializerExpression)parent, Roles.Expression); } else { var eleInit = expr as ElementInitializer; if (eleInit != null) { var nexpr = new NamedExpression(); nexpr.AddChild( Identifier.Create(eleInit.Name, Convert(eleInit.Location)), Roles.Identifier ); var assignLoc = LocationsBag.GetLocations(eleInit); if (assignLoc != null) nexpr.AddChild(new CSharpTokenNode(Convert(assignLoc [0]), Roles.Assign), Roles.Assign); if (eleInit.Source != null) { var colInit = eleInit.Source as CollectionOrObjectInitializers; if (colInit != null) { var arrInit = new ArrayInitializerExpression(); AddConvertCollectionOrObjectInitializers( arrInit, colInit ); nexpr.AddChild(arrInit, Roles.Expression); } else { nexpr.AddChild((Expression)eleInit.Source.Accept(this), Roles.Expression); } } init.AddChild(nexpr, Roles.Expression); } } if (commaLoc != null && curComma < commaLoc.Count) init.AddChild(new CSharpTokenNode(Convert(commaLoc [curComma++]), Roles.Comma), Roles.Comma); } if (initLoc != null) { if (initLoc.Count == 2) // optional comma init.AddChild(new CSharpTokenNode(Convert(initLoc [0]), Roles.Comma), Roles.Comma); init.AddChild(new CSharpTokenNode(Convert(initLoc [initLoc.Count - 1]), Roles.RBrace), Roles.RBrace); } }
public override object Visit(NewAnonymousType newAnonymousType) { var result = new AnonymousTypeCreateExpression(); var location = LocationsBag.GetLocations(newAnonymousType); result.AddChild(new CSharpTokenNode(Convert(newAnonymousType.Location), ObjectCreateExpression.NewKeywordRole), ObjectCreateExpression.NewKeywordRole); if (location != null) result.AddChild(new CSharpTokenNode(Convert(location [0]), Roles.LBrace), Roles.LBrace); if (newAnonymousType.Parameters != null) { foreach (var par in newAnonymousType.Parameters) { if (par == null) continue; var parLocation = LocationsBag.GetLocations(par); if (parLocation == null) { if (par.Expr != null) result.AddChild((Expression)par.Expr.Accept(this), Roles.Expression); } else { var namedExpression = new NamedExpression(); namedExpression.AddChild(Identifier.Create(par.Name, Convert(par.Location)), Roles.Identifier); namedExpression.AddChild(new CSharpTokenNode(Convert(parLocation [0]), Roles.Assign), Roles.Assign); if (par.Expr != null) namedExpression.AddChild((Expression)par.Expr.Accept(this), Roles.Expression); result.AddChild(namedExpression, Roles.Expression); } } } if (location != null && location.Count > 1) result.AddChild(new CSharpTokenNode(Convert(location [1]), Roles.RBrace), Roles.RBrace); return result; }
void AddConvertCollectionOrObjectInitializers (Expression init, CollectionOrObjectInitializers minit) { var initLoc = LocationsBag.GetLocations (minit); var commaLoc = LocationsBag.GetLocations (minit.Initializers); int curComma = 0; if (initLoc != null) init.AddChild (new CSharpTokenNode (Convert (initLoc [0]), 1), ArrayInitializerExpression.Roles.LBrace); foreach (var expr in minit.Initializers) { var collectionInit = expr as CollectionElementInitializer; if (collectionInit != null) { var parent = new ArrayInitializerExpression (); var braceLocs = LocationsBag.GetLocations (expr); if (braceLocs != null) parent.AddChild (new CSharpTokenNode (Convert (braceLocs [0]), 1), ArrayInitializerExpression.Roles.LBrace); for (int i = 0; i < collectionInit.Arguments.Count; i++) { var arg = collectionInit.Arguments [i] as CollectionElementInitializer.ElementInitializerArgument; if (arg == null) continue; parent.AddChild ((ICSharpCode.NRefactory.CSharp.Expression)arg.Expr.Accept (this), ArrayInitializerExpression.Roles.Expression); } if (braceLocs != null) parent.AddChild (new CSharpTokenNode (Convert (braceLocs [1]), 1), ArrayInitializerExpression.Roles.RBrace); init.AddChild (parent, ArrayInitializerExpression.Roles.Expression); } else { var eleInit = expr as ElementInitializer; if (eleInit != null) { var nexpr = new NamedExpression (); nexpr.AddChild (Identifier.Create (eleInit.Name, Convert (eleInit.Location)), NamedArgumentExpression.Roles.Identifier); var assignLoc = LocationsBag.GetLocations (eleInit); if (assignLoc != null) nexpr.AddChild (new CSharpTokenNode (Convert (assignLoc [0]), 1), NamedArgumentExpression.Roles.Assign); if (eleInit.Source != null) { if (eleInit.Source is CollectionOrObjectInitializers) { var arrInit = new ArrayInitializerExpression (); AddConvertCollectionOrObjectInitializers (arrInit, eleInit.Source as CollectionOrObjectInitializers); nexpr.AddChild (arrInit, NamedArgumentExpression.Roles.Expression); } else { nexpr.AddChild ((Expression)eleInit.Source.Accept (this), NamedArgumentExpression.Roles.Expression); } } init.AddChild (nexpr, ArrayInitializerExpression.Roles.Expression); } } if (commaLoc != null && curComma < commaLoc.Count) init.AddChild (new CSharpTokenNode (Convert (commaLoc [curComma++]), 1), ArrayInitializerExpression.Roles.Comma); } if (initLoc != null) { if (initLoc.Count == 3) // optional comma init.AddChild (new CSharpTokenNode (Convert (initLoc [1]), 1), ArrayInitializerExpression.Roles.Comma); init.AddChild (new CSharpTokenNode (Convert (initLoc [initLoc.Count - 1]), 1), ArrayInitializerExpression.Roles.RBrace); } }
public override object Visit (NewAnonymousType newAnonymousType) { var result = new AnonymousTypeCreateExpression (); if (newAnonymousType.Parameters == null) return result; foreach (var par in newAnonymousType.Parameters) { var location = LocationsBag.GetLocations (par); if (location == null) { if (par.Expr != null) result.AddChild ((Expression)par.Expr.Accept (this), AnonymousTypeCreateExpression.Roles.Expression); } else { var namedExpression = new NamedExpression (); namedExpression.AddChild (Identifier.Create (par.Name, Convert (par.Location)), AnonymousTypeCreateExpression.Roles.Identifier); namedExpression.AddChild (new CSharpTokenNode (Convert (location[0]), 1), AnonymousTypeCreateExpression.Roles.Assign); if (par.Expr != null) namedExpression.AddChild ((Expression)par.Expr.Accept (this), AnonymousTypeCreateExpression.Roles.Expression); result.AddChild (namedExpression, AnonymousTypeCreateExpression.Roles.Expression); } } return result; }
IEnumerable<Attribute> GetAttributes (List<Mono.CSharp.Attribute> optAttributes) { if (optAttributes == null) yield break; foreach (var attr in optAttributes) { Attribute result = new Attribute (); result.Type = ConvertToType (attr.TypeNameExpression); var loc = LocationsBag.GetLocations (attr); result.HasArgumentList = loc != null; if (loc != null) result.AddChild (new CSharpTokenNode (Convert (loc [0]), 1), AttributeSection.Roles.LPar); if (attr.PosArguments != null) { foreach (var arg in attr.PosArguments) { result.AddChild ((Expression)arg.Expr.Accept (this), Attribute.Roles.Argument); } } if (attr.NamedArguments != null) { foreach (NamedArgument na in attr.NamedArguments) { var newArg = new NamedExpression (); newArg.AddChild (Identifier.Create (na.Name, Convert (na.Location)), NamedExpression.Roles.Identifier); var argLoc = LocationsBag.GetLocations (na); if (argLoc != null) newArg.AddChild (new CSharpTokenNode (Convert (argLoc[0]), 1), NamedExpression.Roles.Assign); newArg.AddChild ((Expression)na.Expr.Accept (this), NamedExpression.Roles.Expression); result.AddChild (newArg, Attribute.Roles.Argument); } } if (loc != null) result.AddChild (new CSharpTokenNode (Convert (loc [1]), 1), AttributeSection.Roles.RPar); yield return result; } }