Пример #1
0
        private CodeExpression ParseUnadornedMethodInvoke(ParserContext parserContext, string methodName, bool assignIsEquality)
        {
            System.Diagnostics.Debug.Assert(parserContext.CurrentToken.TokenID == TokenID.LParen);

            Type thisType = Validator.ThisType;

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

            if (parserContext.CurrentToken.TokenID == TokenID.EndOfInput && parserContext.provideIntellisense)
            {
                parserContext.SetMethodCompletions(thisType, thisType, methodName, true, true, validation);
                return null;
            }

            List<CodeExpression> arguments = ParseArgumentList(parserContext);

            // 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.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Instance;
            ValidationError error = null;
            RuleMethodInvokeExpressionInfo methodInvokeInfo = validation.ResolveMethod(thisType, methodName, bindingFlags, arguments, out error);

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

            MethodInfo mi = methodInvokeInfo.MethodInfo;

            CodeExpression primaryExpr = null;
            if (mi.IsStatic)
                primaryExpr = new CodeTypeReferenceExpression(thisType);
            else
                primaryExpr = new CodeThisReferenceExpression();

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

            return postfixExpr;
        }
 private CodeExpression ParseMethodInvoke(ParserContext parserContext, CodeExpression postfixExpr, string methodName, bool assignIsEquality)
 {
     int startPosition = parserContext.CurrentToken.StartPosition;
     parserContext.NextToken();
     if ((parserContext.CurrentToken.TokenID == TokenID.EndOfInput) && parserContext.provideIntellisense)
     {
         bool includeStatic = postfixExpr is CodeTypeReferenceExpression;
         parserContext.SetMethodCompletions(this.validation.ExpressionInfo(postfixExpr).ExpressionType, this.validation.ThisType, methodName, includeStatic, !includeStatic, this.validation);
         return null;
     }
     List<CodeExpression> list = this.ParseArgumentList(parserContext);
     postfixExpr = new CodeMethodInvokeExpression(postfixExpr, methodName, list.ToArray());
     parserContext.exprPositions[postfixExpr] = startPosition;
     this.ValidateExpression(parserContext, postfixExpr, assignIsEquality, ValueCheck.Read);
     return postfixExpr;
 }
Пример #3
0
        private CodeExpression ParseMethodInvoke(ParserContext parserContext, CodeExpression postfixExpr, string methodName, bool assignIsEquality)
        {
            System.Diagnostics.Debug.Assert(parserContext.CurrentToken.TokenID == TokenID.LParen);

            // Start of a method call parameter list.
            int lparenPosition = parserContext.CurrentToken.StartPosition;

            parserContext.NextToken();

            if (parserContext.CurrentToken.TokenID == TokenID.EndOfInput && parserContext.provideIntellisense)
            {
                bool isStatic = postfixExpr is CodeTypeReferenceExpression;
                parserContext.SetMethodCompletions(validation.ExpressionInfo(postfixExpr).ExpressionType, validation.ThisType, methodName, isStatic, !isStatic, validation);
                return null;
            }

            List<CodeExpression> arguments = ParseArgumentList(parserContext);

            postfixExpr = new CodeMethodInvokeExpression(postfixExpr, methodName, arguments.ToArray());
            parserContext.exprPositions[postfixExpr] = lparenPosition;
            ValidateExpression(parserContext, postfixExpr, assignIsEquality, ValueCheck.Read);

            return postfixExpr;
        }
 private CodeExpression ParseUnadornedMethodInvoke(ParserContext parserContext, string methodName, bool assignIsEquality)
 {
     Type thisType = this.Validator.ThisType;
     int startPosition = parserContext.CurrentToken.StartPosition;
     parserContext.NextToken();
     if ((parserContext.CurrentToken.TokenID == TokenID.EndOfInput) && parserContext.provideIntellisense)
     {
         parserContext.SetMethodCompletions(thisType, thisType, methodName, true, true, this.validation);
         return null;
     }
     List<CodeExpression> argumentExprs = this.ParseArgumentList(parserContext);
     BindingFlags methodBindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
     ValidationError error = null;
     RuleMethodInvokeExpressionInfo info = this.validation.ResolveMethod(thisType, methodName, methodBindingFlags, argumentExprs, out error);
     if (info == null)
     {
         throw new RuleSyntaxException(error.ErrorNumber, error.ErrorText, startPosition);
     }
     MethodInfo methodInfo = info.MethodInfo;
     CodeExpression targetObject = null;
     if (methodInfo.IsStatic)
     {
         targetObject = new CodeTypeReferenceExpression(thisType);
     }
     else
     {
         targetObject = new CodeThisReferenceExpression();
     }
     CodeExpression expression = new CodeMethodInvokeExpression(targetObject, methodName, argumentExprs.ToArray());
     parserContext.exprPositions[expression] = startPosition;
     this.ValidateExpression(parserContext, expression, assignIsEquality, ValueCheck.Read);
     return expression;
 }