948 } |
948 } |
949 } else return illegal(); |
949 } else return illegal(); |
950 break; |
950 break; |
951 case LPAREN: |
951 case LPAREN: |
952 if (typeArgs == null && (mode & EXPR) != 0) { |
952 if (typeArgs == null && (mode & EXPR) != 0) { |
953 if (peekToken(FINAL) || |
953 if (peekToken(MONKEYS_AT) || |
|
954 peekToken(FINAL) || |
954 peekToken(RPAREN) || |
955 peekToken(RPAREN) || |
955 peekToken(IDENTIFIER, COMMA) || |
956 peekToken(IDENTIFIER, COMMA) || |
956 peekToken(IDENTIFIER, RPAREN, ARROW)) { |
957 peekToken(IDENTIFIER, RPAREN, ARROW)) { |
957 //implicit n-ary lambda |
958 //implicit n-ary lambda |
958 t = lambdaExpressionOrStatement(true, peekToken(FINAL), pos); |
959 t = lambdaExpressionOrStatement(true, peekToken(MONKEYS_AT) || peekToken(FINAL), pos); |
959 break; |
960 break; |
960 } else { |
961 } else { |
961 nextToken(); |
962 nextToken(); |
962 mode = EXPR | TYPE | NOPARAMS; |
963 mode = EXPR | TYPE | NOPARAMS; |
963 t = term3(); |
964 t = term3(); |
1341 |
1342 |
1342 return lambdaExpressionOrStatementRest(params, pos); |
1343 return lambdaExpressionOrStatementRest(params, pos); |
1343 } |
1344 } |
1344 |
1345 |
1345 JCExpression lambdaExpressionOrStatementRest(List<JCVariableDecl> args, int pos) { |
1346 JCExpression lambdaExpressionOrStatementRest(List<JCVariableDecl> args, int pos) { |
1346 if (token.kind != ARROW) { |
|
1347 //better error recovery |
|
1348 return F.at(pos).Erroneous(args); |
|
1349 } |
|
1350 |
|
1351 checkLambda(); |
1347 checkLambda(); |
1352 accept(ARROW); |
1348 accept(ARROW); |
1353 |
1349 |
1354 return token.kind == LBRACE ? |
1350 return token.kind == LBRACE ? |
1355 lambdaStatement(args, pos, pos) : |
1351 lambdaStatement(args, pos, pos) : |