private BoundExpression VisitInitializer(BoundExpression node, out InitializerKind kind) { switch (node.Kind) { case BoundKind.ObjectInitializerExpression: { var oi = (BoundObjectInitializerExpression)node; var builder = ArrayBuilder <BoundExpression> .GetInstance(); foreach (BoundAssignmentOperator a in oi.Initializers) { var sym = ((BoundObjectInitializerMember)a.Left).MemberSymbol; // An error is reported in diagnostics pass when a dynamic object initializer is encountered in an ET: Debug.Assert((object)sym != null); InitializerKind elementKind; var value = VisitInitializer(a.Right, out elementKind); switch (elementKind) { case InitializerKind.CollectionInitializer: { var left = InitializerMemberGetter(sym); builder.Add(ExprFactory("ListBind", left, value)); break; } case InitializerKind.Expression: { var left = InitializerMemberSetter(sym); builder.Add(ExprFactory("Bind", left, value)); break; } case InitializerKind.MemberInitializer: { var left = InitializerMemberGetter(sym); builder.Add(ExprFactory("MemberBind", left, value)); break; } default: throw ExceptionUtilities.UnexpectedValue(elementKind); } } kind = InitializerKind.MemberInitializer; return(_bound.ArrayOrEmpty(MemberBindingType, builder.ToImmutableAndFree())); } case BoundKind.CollectionInitializerExpression: { var ci = (BoundCollectionInitializerExpression)node; Debug.Assert(ci.Initializers.Length != 0); kind = InitializerKind.CollectionInitializer; var builder = ArrayBuilder <BoundExpression> .GetInstance(); // The method invocation must be a static call. // Dynamic calls are not allowed in ETs, an error is reported in diagnostics pass. foreach (BoundCollectionElementInitializer i in ci.Initializers) { BoundExpression elementInit = ExprFactory("ElementInit", _bound.MethodInfo(i.AddMethod), Expressions(i.Arguments)); builder.Add(elementInit); } return(_bound.ArrayOrEmpty(ElementInitType, builder.ToImmutableAndFree())); } default: { kind = InitializerKind.Expression; return(Visit(node)); } } }
private BoundExpression VisitInitializer(BoundExpression node, out InitializerKind kind) { switch (node.Kind) { case BoundKind.ObjectInitializerExpression: { var oi = (BoundObjectInitializerExpression)node; var builder = ArrayBuilder<BoundExpression>.GetInstance(); foreach (BoundAssignmentOperator a in oi.Initializers) { var sym = ((BoundObjectInitializerMember)a.Left).MemberSymbol; // An error is reported in diagnostics pass when a dynamic object initializer is encountered in an ET: Debug.Assert((object)sym != null); InitializerKind elementKind; var value = VisitInitializer(a.Right, out elementKind); switch (elementKind) { case InitializerKind.CollectionInitializer: { var left = InitializerMemberGetter(sym); builder.Add(ExprFactory("ListBind", left, value)); break; } case InitializerKind.Expression: { var left = InitializerMemberSetter(sym); builder.Add(ExprFactory("Bind", left, value)); break; } case InitializerKind.MemberInitializer: { var left = InitializerMemberGetter(sym); builder.Add(ExprFactory("MemberBind", left, value)); break; } default: throw ExceptionUtilities.UnexpectedValue(elementKind); } } kind = InitializerKind.MemberInitializer; return _bound.Array(MemberBindingType, builder.ToImmutableAndFree()); } case BoundKind.CollectionInitializerExpression: { var ci = (BoundCollectionInitializerExpression)node; Debug.Assert(ci.Initializers.Length != 0); kind = InitializerKind.CollectionInitializer; var builder = ArrayBuilder<BoundExpression>.GetInstance(); // The method invocation must be a static call. // Dynamic calls are not allowed in ETs, an error is reported in diagnostics pass. foreach (BoundCollectionElementInitializer i in ci.Initializers) { BoundExpression elementInit = ExprFactory("ElementInit", _bound.MethodInfo(i.AddMethod), Expressions(i.Arguments)); builder.Add(elementInit); } return _bound.Array(ElementInitType, builder.ToImmutableAndFree()); } default: { kind = InitializerKind.Expression; return Visit(node); } } }
public CodeConstructorInitializer(InitializerKind kind, IEnumerable <CodeExpression> arguments) { Kind = kind; Arguments.AddRange(arguments); }