Пример #1
0
        private ExpressionNode parseLambdaExpression() {
            switch (lexicalUnit) {
            case ContextualKeyword:
            case VerbatimIdentifier:
            case Identifier: {
                int sp = scanner.StartPosition;
                int len = getLexicalUnitLength();
                saveScannerState();
                if (nextLexicalUnit(false) == LexicalUnit.Lambda) {
                    var lambda = new LambdaExpressionNode();
                    setSavedScannerState(lambda);
                    var param = new ParameterNode { NameOffset = sp, NameLength = len };
                    setSavedScannerState(param);
                    param.EndPosition = sp + len;
                    lambda.Parameters.add(param);
                    if (nextLexicalUnit(true) == LexicalUnit.OpenBrace) {
                        lambda.Body = parseBlockStatement();
                    } else {
                    	var expression = parseExpression();
                    	var expressionStatement = new ExpressionStatementNode { Expression = expression };
                    	copyScannerState(expression, expressionStatement);
                        lambda.Body = expressionStatement;
                    }
                    lambda.EndPosition = lambda.Body.EndPosition;
                    return lambda;
                }
	            break;
            }

            default: {
                var implicitSignature = true;
                var prev = LexicalUnit.Comma;
                var restorePoint = this.createRestorePoint();
                while (nextLexicalUnit(false) != LexicalUnit.CloseParenthesis) {
                    switch (lexicalUnit) {
                    case Identifier:
                    case ContextualKeyword:
                    case VerbatimIdentifier:
                        if (implicitSignature) {
                            if (prev != LexicalUnit.Comma) {
                                implicitSignature = false;
                            }
                        }
                        break;

                    case Comma:
                        if (implicitSignature) {
                            if (!isIdentifier(prev)) {
                                implicitSignature = false;
                            }
                        }
                        break;

                    case Keyword:
                        switch (scanner.Keyword) {
                        case Byte:
                        case Char:
                        case Short:
                        case Int:
                        case Long:
                        case Boolean:
                        case Double:
                        case Float:
                        case Void:
						case String:
                            break;

                        default:
                            return null;
                        }
                        implicitSignature = false;
                        break;

                    case GreaterThan:
                    case LessThan:
                    case Dot:
                    case OpenBracket:
                    case CloseBracket:
                    case QuestionMark:
                        implicitSignature = false;
                        break;

                    default:
                        return null;
                    }
                    prev = lexicalUnit;
                }
                if (nextLexicalUnit(false) != LexicalUnit.Lambda) {
                    return null;
                }
                this.restore(restorePoint);
                nextLexicalUnit(true);
                var lambda = new LambdaExpressionNode();
                setScannerState(lambda);
                if (implicitSignature) {
                    parseImplicitAnonymousFunctionSignature(lambda.Parameters);
                } else {
                    parseExplicitAnonymousFunctionSignature(lambda.Parameters);
                }
                if (nextLexicalUnit(true) == LexicalUnit.OpenBrace) {
                    lambda.Body = parseBlockStatement();
                } else {
                	var expression = parseExpression();
                	var expressionStatement = new ExpressionStatementNode { Expression = expression };
                	copyScannerState(expression, expressionStatement);
                    lambda.Body = expressionStatement;
                }
                lambda.EndPosition = lambda.Body.EndPosition;
                return lambda;
            }
            }
            return null;
        }
		public void enterLambda(LambdaExpressionNode declaration) {
			methodInfos.add(declaration.getUserData(typeof(MethodInfo)));
		}
Пример #3
0
 protected virtual TResult handleLambda(LambdaExpressionNode lambda, TSource source, bool nested)
 {
     return(defaultHandler());
 }