Beispiel #1
0
        private CodeExpression ParseConstructorArguments(ParserContext parserContext, Type type, bool assignIsEquality)
        {
            System.Diagnostics.Debug.Assert(parserContext.CurrentToken.TokenID == TokenID.LParen);

            // Start of a constructor parameter list.
            int lparenPosition = parserContext.CurrentToken.StartPosition;
            parserContext.NextToken();

            if (parserContext.CurrentToken.TokenID == TokenID.EndOfInput && parserContext.provideIntellisense)
            {
                parserContext.SetConstructorCompletions(type, Validator.ThisType);
                return null;
            }

            List<CodeExpression> arguments = ParseArgumentList(parserContext);

            if ((type.IsValueType) && (arguments.Count == 0))
            {
                // this is always allowed
            }
            else if (type.IsAbstract)
            {
                // this is not allowed
                string message = string.Format(CultureInfo.CurrentCulture,
                    Messages.UnknownConstructor,
                    RuleDecompiler.DecompileType(type));
                throw new RuleSyntaxException(ErrorNumbers.Error_MethodNotExists, message, lparenPosition);
            }
            else
            {
                // Binding flags include all public & non-public, all instance, and all static.
                // All are possible candidates for unadorned method references.
                BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.Instance;
                if (type.Assembly == validation.ThisType.Assembly)
                    bindingFlags |= BindingFlags.NonPublic;
                ValidationError error = null;
                RuleConstructorExpressionInfo constructorInvokeInfo = validation.ResolveConstructor(type, bindingFlags, arguments, out error);

                if (constructorInvokeInfo == null)
                    throw new RuleSyntaxException(error.ErrorNumber, error.ErrorText, lparenPosition);
            }

            CodeExpression postfixExpr = new CodeObjectCreateExpression(type, arguments.ToArray());
            parserContext.exprPositions[postfixExpr] = lparenPosition;
            ValidateExpression(parserContext, postfixExpr, assignIsEquality, ValueCheck.Read);

            return postfixExpr;
        }
 private CodeExpression ParseConstructorArguments(ParserContext parserContext, Type type, bool assignIsEquality)
 {
     int startPosition = parserContext.CurrentToken.StartPosition;
     parserContext.NextToken();
     if ((parserContext.CurrentToken.TokenID == TokenID.EndOfInput) && parserContext.provideIntellisense)
     {
         parserContext.SetConstructorCompletions(type, this.Validator.ThisType);
         return null;
     }
     List<CodeExpression> argumentExprs = this.ParseArgumentList(parserContext);
     if (!type.IsValueType || (argumentExprs.Count != 0))
     {
         if (type.IsAbstract)
         {
             string message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) });
             throw new RuleSyntaxException(0x137, message, startPosition);
         }
         BindingFlags constructorBindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance;
         if (type.Assembly == this.validation.ThisType.Assembly)
         {
             constructorBindingFlags |= BindingFlags.NonPublic;
         }
         ValidationError error = null;
         if (this.validation.ResolveConstructor(type, constructorBindingFlags, argumentExprs, out error) == null)
         {
             throw new RuleSyntaxException(error.ErrorNumber, error.ErrorText, startPosition);
         }
     }
     CodeExpression expression = new CodeObjectCreateExpression(type, argumentExprs.ToArray());
     parserContext.exprPositions[expression] = startPosition;
     this.ValidateExpression(parserContext, expression, assignIsEquality, ValueCheck.Read);
     return expression;
 }