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))); }
protected virtual TResult handleLambda(LambdaExpressionNode lambda, TSource source, bool nested) { return(defaultHandler()); }