示例#1
0
        public override Expression DoResolve(ParseContext parseContext)
        {
            _typeExpression = _typeExpression.ResolveAsTypeStep(parseContext, false);

            if (_typeExpression == null)
            {
                return(null);
            }

            Type = _typeExpression.Type;

            return(this);
        }
示例#2
0
        public override Expression DoResolve(Runtime.ParseContext parseContext)
        {
            var typeExpression = _objectType = _objectType.ResolveAsTypeStep(parseContext, false);

            if (typeExpression == null)
            {
                return(base.DoResolve(parseContext));
            }

            _arguments.Resolve(parseContext);

            Type = typeExpression.Type;

            var initializer = Initializer;

            if (initializer == null)
            {
                return(new NewExpression(
                           _objectType,
                           _arguments,
                           Span).Resolve(parseContext));
            }

            if (initializer is CollectionInitializerExpression)
            {
                var genericInterfaces = TypeManager.DropGenericTypeArguments(Type).GetInterfaces()
                                        .Where(o => o.IsGenericType)
                                        .Select(o => o.GetGenericTypeDefinition());

                if (!genericInterfaces.Contains(TypeManager.CoreTypes.GenericEnumerableInterface))
                {
                    parseContext.ReportError(
                        1925,
                        string.Format(
                            "Cannot initialize object of type '{0}' with a collection initializer.",
                            TypeManager.GetCSharpName(Type)),
                        Span);
                }
            }

            return(new NewInitExpression(
                       _objectType,
                       _arguments,
                       initializer,
                       Span).Resolve(parseContext));
        }