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);
                    }
            }
        }
Beispiel #3
0
 public CodeConstructorInitializer(InitializerKind kind, IEnumerable <CodeExpression> arguments)
 {
     Kind = kind;
     Arguments.AddRange(arguments);
 }