langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
changeset 11143 9dbe313bfb74
parent 11055 ec1418effa77
child 11144 8a4ae514eedf
equal deleted inserted replaced
11142:45d0ec1e7463 11143:9dbe313bfb74
   108         this.allowAnnotations = source.allowAnnotations();
   108         this.allowAnnotations = source.allowAnnotations();
   109         this.allowTWR = source.allowTryWithResources();
   109         this.allowTWR = source.allowTryWithResources();
   110         this.allowDiamond = source.allowDiamond();
   110         this.allowDiamond = source.allowDiamond();
   111         this.allowMulticatch = source.allowMulticatch();
   111         this.allowMulticatch = source.allowMulticatch();
   112         this.allowStringFolding = fac.options.getBoolean("allowStringFolding", true);
   112         this.allowStringFolding = fac.options.getBoolean("allowStringFolding", true);
       
   113         this.allowLambda = source.allowLambda() &&
       
   114                 fac.options.isSet("allowLambda");
   113         this.keepDocComments = keepDocComments;
   115         this.keepDocComments = keepDocComments;
   114         docComments = keepDocComments ? new HashMap<JCTree,String>() : null;
   116         docComments = keepDocComments ? new HashMap<JCTree,String>() : null;
   115         this.keepLineMap = keepLineMap;
   117         this.keepLineMap = keepLineMap;
   116         this.errorTree = F.Erroneous();
   118         this.errorTree = F.Erroneous();
   117         endPosTable = newEndPosTable(keepEndPositions);
   119         endPosTable = newEndPosTable(keepEndPositions);
   164 
   166 
   165     /** Switch: should we fold strings?
   167     /** Switch: should we fold strings?
   166      */
   168      */
   167     boolean allowStringFolding;
   169     boolean allowStringFolding;
   168 
   170 
       
   171     /** Switch: should we recognize lambda expressions?
       
   172      */
       
   173     boolean allowLambda;
       
   174 
   169     /** Switch: should we keep docComments?
   175     /** Switch: should we keep docComments?
   170      */
   176      */
   171     boolean keepDocComments;
   177     boolean keepDocComments;
   172 
   178 
   173     /** Switch: should we keep line table?
   179     /** Switch: should we keep line table?
   199     protected Token token;
   205     protected Token token;
   200 
   206 
   201     protected void nextToken() {
   207     protected void nextToken() {
   202         S.nextToken();
   208         S.nextToken();
   203         token = S.token();
   209         token = S.token();
       
   210     }
       
   211 
       
   212     protected boolean peekToken(TokenKind tk) {
       
   213         return S.token(1).kind == tk;
       
   214     }
       
   215 
       
   216     protected boolean peekToken(TokenKind tk1, TokenKind tk2) {
       
   217         return S.token(1).kind == tk1 &&
       
   218                 S.token(2).kind == tk2;
       
   219     }
       
   220 
       
   221     protected boolean peekToken(TokenKind tk1, TokenKind tk2, TokenKind tk3) {
       
   222         return S.token(1).kind == tk1 &&
       
   223                 S.token(2).kind == tk2 &&
       
   224                 S.token(3).kind == tk3;
       
   225     }
       
   226 
       
   227     protected boolean peekToken(TokenKind... kinds) {
       
   228         for (int lookahead = 0 ; lookahead < kinds.length ; lookahead++) {
       
   229             if (S.token(lookahead + 1).kind != kinds[lookahead]) {
       
   230                 return false;
       
   231             }
       
   232         }
       
   233         return true;
   204     }
   234     }
   205 
   235 
   206     /* ---------- error recovery -------------- */
   236     /* ---------- error recovery -------------- */
   207 
   237 
   208     private JCErroneous errorTree;
   238     private JCErroneous errorTree;
   847      *  Primary        = "(" Expression ")"
   877      *  Primary        = "(" Expression ")"
   848      *                 | Literal
   878      *                 | Literal
   849      *                 | [TypeArguments] THIS [Arguments]
   879      *                 | [TypeArguments] THIS [Arguments]
   850      *                 | [TypeArguments] SUPER SuperSuffix
   880      *                 | [TypeArguments] SUPER SuperSuffix
   851      *                 | NEW [TypeArguments] Creator
   881      *                 | NEW [TypeArguments] Creator
       
   882      *                 | "(" Arguments ")" "->" ( Expression | Block )
       
   883      *                 | Ident "->" ( Expression | Block )
   852      *                 | Ident { "." Ident }
   884      *                 | Ident { "." Ident }
   853      *                   [ "[" ( "]" BracketsOpt "." CLASS | Expression "]" )
   885      *                   [ "[" ( "]" BracketsOpt "." CLASS | Expression "]" )
   854      *                   | Arguments
   886      *                   | Arguments
   855      *                   | "." ( CLASS | THIS | [TypeArguments] SUPER Arguments | NEW [TypeArguments] InnerCreator )
   887      *                   | "." ( CLASS | THIS | [TypeArguments] SUPER Arguments | NEW [TypeArguments] InnerCreator )
   856      *                   ]
   888      *                   ]
   895                 }
   927                 }
   896             } else return illegal();
   928             } else return illegal();
   897             break;
   929             break;
   898         case LPAREN:
   930         case LPAREN:
   899             if (typeArgs == null && (mode & EXPR) != 0) {
   931             if (typeArgs == null && (mode & EXPR) != 0) {
   900                 nextToken();
   932                 if (peekToken(FINAL) ||
   901                 mode = EXPR | TYPE | NOPARAMS;
   933                         peekToken(RPAREN) ||
   902                 t = term3();
   934                         peekToken(IDENTIFIER, COMMA) ||
   903                 if ((mode & TYPE) != 0 && token.kind == LT) {
   935                         peekToken(IDENTIFIER, RPAREN, ARROW)) {
   904                     // Could be a cast to a parameterized type
   936                     //implicit n-ary lambda
   905                     JCTree.Tag op = JCTree.Tag.LT;
   937                     t = lambdaExpressionOrStatement(true, peekToken(FINAL), pos);
   906                     int pos1 = token.pos;
   938                     break;
       
   939                 } else {
   907                     nextToken();
   940                     nextToken();
   908                     mode &= (EXPR | TYPE);
   941                     mode = EXPR | TYPE | NOPARAMS;
   909                     mode |= TYPEARG;
   942                     t = term3();
   910                     JCExpression t1 = term3();
   943                     if ((mode & TYPE) != 0 && token.kind == LT) {
   911                     if ((mode & TYPE) != 0 &&
   944                         // Could be a cast to a parameterized type
   912                         (token.kind == COMMA || token.kind == GT)) {
   945                         JCTree.Tag op = JCTree.Tag.LT;
   913                         mode = TYPE;
   946                         int pos1 = token.pos;
   914                         ListBuffer<JCExpression> args = new ListBuffer<JCExpression>();
   947                         nextToken();
   915                         args.append(t1);
   948                         mode &= (EXPR | TYPE);
   916                         while (token.kind == COMMA) {
   949                         mode |= TYPEARG;
       
   950                         JCExpression t1 = term3();
       
   951                         if ((mode & TYPE) != 0 &&
       
   952                             (token.kind == COMMA || token.kind == GT)) {
       
   953                             mode = TYPE;
       
   954                             ListBuffer<JCExpression> args = new ListBuffer<JCExpression>();
       
   955                             args.append(t1);
       
   956                             while (token.kind == COMMA) {
       
   957                                 nextToken();
       
   958                                 args.append(typeArgument());
       
   959                             }
       
   960                             accept(GT);
       
   961                             t = toP(F.at(pos1).TypeApply(t, args.toList()));
       
   962                             checkGenerics();
       
   963                             mode = EXPR | TYPE; //could be a lambda or a method ref or a cast to a type
       
   964                             t = term3Rest(t, typeArgs);
       
   965                             if (token.kind == IDENTIFIER || token.kind == ELLIPSIS) {
       
   966                                 //explicit lambda (w/ generic type)
       
   967                                 mode = EXPR;
       
   968                                 JCModifiers mods = F.at(token.pos).Modifiers(Flags.PARAMETER);
       
   969                                 if (token.kind == ELLIPSIS) {
       
   970                                     mods.flags = Flags.VARARGS;
       
   971                                     t = to(F.at(token.pos).TypeArray(t));
       
   972                                     nextToken();
       
   973                                 }
       
   974                                 t = lambdaExpressionOrStatement(variableDeclaratorId(mods, t), pos);
       
   975                                 break;
       
   976                             }
       
   977                         } else {
       
   978                             Assert.check((mode & EXPR) != 0);
       
   979                             mode = EXPR;
       
   980                             JCExpression e = term2Rest(t1, TreeInfo.shiftPrec);
       
   981                             t = F.at(pos1).Binary(op, t, e);
       
   982                             t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec)));
       
   983                         }
       
   984                     } else if ((mode & TYPE) != 0 &&
       
   985                             (token.kind == IDENTIFIER || token.kind == ELLIPSIS)) {
       
   986                         //explicit lambda (w/ non-generic type)
       
   987                         mode = EXPR;
       
   988                         JCModifiers mods = F.at(token.pos).Modifiers(Flags.PARAMETER);
       
   989                         if (token.kind == ELLIPSIS) {
       
   990                             mods.flags = Flags.VARARGS;
       
   991                             t = to(F.at(token.pos).TypeArray(t));
   917                             nextToken();
   992                             nextToken();
   918                             args.append(typeArgument());
       
   919                         }
   993                         }
   920                         accept(GT);
   994                         t = lambdaExpressionOrStatement(variableDeclaratorId(mods, t), pos);
   921                         t = toP(F.at(pos1).TypeApply(t, args.toList()));
   995                         break;
   922                         checkGenerics();
   996                     } else {
   923                         while (token.kind == DOT) {
       
   924                             nextToken();
       
   925                             mode = TYPE;
       
   926                             t = toP(F.at(token.pos).Select(t, ident()));
       
   927                             t = typeArgumentsOpt(t);
       
   928                         }
       
   929                         t = bracketsOpt(toP(t));
       
   930                     } else if ((mode & EXPR) != 0) {
       
   931                         mode = EXPR;
       
   932                         JCExpression e = term2Rest(t1, TreeInfo.shiftPrec);
       
   933                         t = F.at(pos1).Binary(op, t, e);
       
   934                         t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec)));
   997                         t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec)));
   935                     } else {
       
   936                         accept(GT);
       
   937                     }
   998                     }
   938                 }
   999                 }
   939                 else {
  1000 
   940                     t = termRest(term1Rest(term2Rest(t, TreeInfo.orPrec)));
       
   941                 }
       
   942                 accept(RPAREN);
  1001                 accept(RPAREN);
   943                 lastmode = mode;
  1002                 lastmode = mode;
   944                 mode = EXPR;
  1003                 mode = EXPR;
   945                 if ((lastmode & EXPR) == 0) {
  1004                 if ((lastmode & EXPR) == 0) {
   946                     JCExpression t1 = term3();
  1005                     JCExpression t1 = term3();
   951                     case BANG: case TILDE:
  1010                     case BANG: case TILDE:
   952                     case LPAREN: case THIS: case SUPER:
  1011                     case LPAREN: case THIS: case SUPER:
   953                     case INTLITERAL: case LONGLITERAL: case FLOATLITERAL:
  1012                     case INTLITERAL: case LONGLITERAL: case FLOATLITERAL:
   954                     case DOUBLELITERAL: case CHARLITERAL: case STRINGLITERAL:
  1013                     case DOUBLELITERAL: case CHARLITERAL: case STRINGLITERAL:
   955                     case TRUE: case FALSE: case NULL:
  1014                     case TRUE: case FALSE: case NULL:
   956                     case NEW: case IDENTIFIER: case ASSERT: case ENUM:
  1015                         case NEW: case IDENTIFIER: case ASSERT: case ENUM:
   957                     case BYTE: case SHORT: case CHAR: case INT:
  1016                     case BYTE: case SHORT: case CHAR: case INT:
   958                     case LONG: case FLOAT: case DOUBLE: case BOOLEAN: case VOID:
  1017                     case LONG: case FLOAT: case DOUBLE: case BOOLEAN: case VOID:
   959                         JCExpression t1 = term3();
  1018                         JCExpression t1 = term3();
   960                         return F.at(pos).TypeCast(t, t1);
  1019                         return F.at(pos).TypeCast(t, t1);
   961                     }
  1020                     }
   962                 }
  1021                 }
   963             } else return illegal();
  1022             } else {
       
  1023                 return illegal();
       
  1024             }
   964             t = toP(F.at(pos).Parens(t));
  1025             t = toP(F.at(pos).Parens(t));
   965             break;
  1026             break;
   966         case THIS:
  1027         case THIS:
   967             if ((mode & EXPR) != 0) {
  1028             if ((mode & EXPR) != 0) {
   968                 mode = EXPR;
  1029                 mode = EXPR;
  1001                 typeArgs = null;
  1062                 typeArgs = null;
  1002             } else return illegal();
  1063             } else return illegal();
  1003             break;
  1064             break;
  1004         case IDENTIFIER: case ASSERT: case ENUM:
  1065         case IDENTIFIER: case ASSERT: case ENUM:
  1005             if (typeArgs != null) return illegal();
  1066             if (typeArgs != null) return illegal();
  1006             t = toP(F.at(token.pos).Ident(ident()));
  1067             if ((mode & EXPR) != 0 && peekToken(ARROW)) {
  1007             loop: while (true) {
  1068                 t = lambdaExpressionOrStatement(false, false, pos);
  1008                 pos = token.pos;
  1069             } else {
  1009                 switch (token.kind) {
  1070                 t = toP(F.at(token.pos).Ident(ident()));
  1010                 case LBRACKET:
  1071                 loop: while (true) {
  1011                     nextToken();
  1072                     pos = token.pos;
  1012                     if (token.kind == RBRACKET) {
  1073                     switch (token.kind) {
       
  1074                     case LBRACKET:
  1013                         nextToken();
  1075                         nextToken();
  1014                         t = bracketsOpt(t);
  1076                         if (token.kind == RBRACKET) {
  1015                         t = toP(F.at(pos).TypeArray(t));
  1077                             nextToken();
  1016                         t = bracketsSuffix(t);
  1078                             t = bracketsOpt(t);
  1017                     } else {
  1079                             t = toP(F.at(pos).TypeArray(t));
       
  1080                             t = bracketsSuffix(t);
       
  1081                         } else {
       
  1082                             if ((mode & EXPR) != 0) {
       
  1083                                 mode = EXPR;
       
  1084                                 JCExpression t1 = term();
       
  1085                                 t = to(F.at(pos).Indexed(t, t1));
       
  1086                             }
       
  1087                             accept(RBRACKET);
       
  1088                         }
       
  1089                         break loop;
       
  1090                     case LPAREN:
  1018                         if ((mode & EXPR) != 0) {
  1091                         if ((mode & EXPR) != 0) {
  1019                             mode = EXPR;
  1092                             mode = EXPR;
  1020                             JCExpression t1 = term();
  1093                             t = arguments(typeArgs, t);
  1021                             t = to(F.at(pos).Indexed(t, t1));
  1094                             typeArgs = null;
  1022                         }
  1095                         }
  1023                         accept(RBRACKET);
  1096                         break loop;
       
  1097                     case DOT:
       
  1098                         nextToken();
       
  1099                         int oldmode = mode;
       
  1100                         mode &= ~NOPARAMS;
       
  1101                         typeArgs = typeArgumentsOpt(EXPR);
       
  1102                         mode = oldmode;
       
  1103                         if ((mode & EXPR) != 0) {
       
  1104                             switch (token.kind) {
       
  1105                             case CLASS:
       
  1106                                 if (typeArgs != null) return illegal();
       
  1107                                 mode = EXPR;
       
  1108                                 t = to(F.at(pos).Select(t, names._class));
       
  1109                                 nextToken();
       
  1110                                 break loop;
       
  1111                             case THIS:
       
  1112                                 if (typeArgs != null) return illegal();
       
  1113                                 mode = EXPR;
       
  1114                                 t = to(F.at(pos).Select(t, names._this));
       
  1115                                 nextToken();
       
  1116                                 break loop;
       
  1117                             case SUPER:
       
  1118                                 mode = EXPR;
       
  1119                                 t = to(F.at(pos).Select(t, names._super));
       
  1120                                 t = superSuffix(typeArgs, t);
       
  1121                                 typeArgs = null;
       
  1122                                 break loop;
       
  1123                             case NEW:
       
  1124                                 if (typeArgs != null) return illegal();
       
  1125                                 mode = EXPR;
       
  1126                                 int pos1 = token.pos;
       
  1127                                 nextToken();
       
  1128                                 if (token.kind == LT) typeArgs = typeArguments(false);
       
  1129                                 t = innerCreator(pos1, typeArgs, t);
       
  1130                                 typeArgs = null;
       
  1131                                 break loop;
       
  1132                             }
       
  1133                         }
       
  1134                         // typeArgs saved for next loop iteration.
       
  1135                         t = toP(F.at(pos).Select(t, ident()));
       
  1136                         break;
       
  1137                     default:
       
  1138                         break loop;
  1024                     }
  1139                     }
  1025                     break loop;
       
  1026                 case LPAREN:
       
  1027                     if ((mode & EXPR) != 0) {
       
  1028                         mode = EXPR;
       
  1029                         t = arguments(typeArgs, t);
       
  1030                         typeArgs = null;
       
  1031                     }
       
  1032                     break loop;
       
  1033                 case DOT:
       
  1034                     nextToken();
       
  1035                     int oldmode = mode;
       
  1036                     mode &= ~NOPARAMS;
       
  1037                     typeArgs = typeArgumentsOpt(EXPR);
       
  1038                     mode = oldmode;
       
  1039                     if ((mode & EXPR) != 0) {
       
  1040                         switch (token.kind) {
       
  1041                         case CLASS:
       
  1042                             if (typeArgs != null) return illegal();
       
  1043                             mode = EXPR;
       
  1044                             t = to(F.at(pos).Select(t, names._class));
       
  1045                             nextToken();
       
  1046                             break loop;
       
  1047                         case THIS:
       
  1048                             if (typeArgs != null) return illegal();
       
  1049                             mode = EXPR;
       
  1050                             t = to(F.at(pos).Select(t, names._this));
       
  1051                             nextToken();
       
  1052                             break loop;
       
  1053                         case SUPER:
       
  1054                             mode = EXPR;
       
  1055                             t = to(F.at(pos).Select(t, names._super));
       
  1056                             t = superSuffix(typeArgs, t);
       
  1057                             typeArgs = null;
       
  1058                             break loop;
       
  1059                         case NEW:
       
  1060                             if (typeArgs != null) return illegal();
       
  1061                             mode = EXPR;
       
  1062                             int pos1 = token.pos;
       
  1063                             nextToken();
       
  1064                             if (token.kind == LT) typeArgs = typeArguments(false);
       
  1065                             t = innerCreator(pos1, typeArgs, t);
       
  1066                             typeArgs = null;
       
  1067                             break loop;
       
  1068                         }
       
  1069                     }
       
  1070                     // typeArgs saved for next loop iteration.
       
  1071                     t = toP(F.at(pos).Select(t, ident()));
       
  1072                     break;
       
  1073                 default:
       
  1074                     break loop;
       
  1075                 }
  1140                 }
  1076             }
  1141             }
  1077             if (typeArgs != null) illegal();
  1142             if (typeArgs != null) illegal();
  1078             t = typeArgumentsOpt(t);
  1143             t = typeArgumentsOpt(t);
  1079             break;
  1144             break;
  1103             }
  1168             }
  1104             break;
  1169             break;
  1105         default:
  1170         default:
  1106             return illegal();
  1171             return illegal();
  1107         }
  1172         }
       
  1173         return term3Rest(t, typeArgs);
       
  1174     }
       
  1175 
       
  1176     JCExpression term3Rest(JCExpression t, List<JCExpression> typeArgs) {
  1108         if (typeArgs != null) illegal();
  1177         if (typeArgs != null) illegal();
  1109         while (true) {
  1178         while (true) {
  1110             int pos1 = token.pos;
  1179             int pos1 = token.pos;
  1111             if (token.kind == LBRACKET) {
  1180             if (token.kind == LBRACKET) {
  1112                 nextToken();
  1181                 nextToken();
  1158             t = to(F.at(token.pos).Unary(
  1227             t = to(F.at(token.pos).Unary(
  1159                   token.kind == PLUSPLUS ? POSTINC : POSTDEC, t));
  1228                   token.kind == PLUSPLUS ? POSTINC : POSTDEC, t));
  1160             nextToken();
  1229             nextToken();
  1161         }
  1230         }
  1162         return toP(t);
  1231         return toP(t);
       
  1232     }
       
  1233 
       
  1234     JCExpression lambdaExpressionOrStatement(JCVariableDecl firstParam, int pos) {
       
  1235         ListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();
       
  1236         params.append(firstParam);
       
  1237         JCVariableDecl lastParam = firstParam;
       
  1238         while ((lastParam.mods.flags & Flags.VARARGS) == 0 && token.kind == COMMA) {
       
  1239             nextToken();
       
  1240             params.append(lastParam = formalParameter());
       
  1241         }
       
  1242         accept(RPAREN);
       
  1243         return lambdaExpressionOrStatementRest(params.toList(), pos);
       
  1244     }
       
  1245 
       
  1246     JCExpression lambdaExpressionOrStatement(boolean hasParens, boolean explicitParams, int pos) {
       
  1247         List<JCVariableDecl> params = explicitParams ?
       
  1248                 formalParameters() :
       
  1249                 implicitParameters(hasParens);
       
  1250 
       
  1251         return lambdaExpressionOrStatementRest(params, pos);
       
  1252     }
       
  1253 
       
  1254     JCExpression lambdaExpressionOrStatementRest(List<JCVariableDecl> args, int pos) {
       
  1255         if (token.kind != ARROW) {
       
  1256             //better error recovery
       
  1257             return F.at(pos).Erroneous(args);
       
  1258         }
       
  1259 
       
  1260         checkLambda();
       
  1261         accept(ARROW);
       
  1262 
       
  1263         return token.kind == LBRACE ?
       
  1264             lambdaStatement(args, pos, pos) :
       
  1265             lambdaExpression(args, pos);
       
  1266     }
       
  1267 
       
  1268     JCExpression lambdaStatement(List<JCVariableDecl> args, int pos, int pos2) {
       
  1269         JCBlock block = block(pos2, 0);
       
  1270         return toP(F.at(pos).Lambda(args, block));
       
  1271     }
       
  1272 
       
  1273     JCExpression lambdaExpression(List<JCVariableDecl> args, int pos) {
       
  1274         JCTree expr = parseExpression();
       
  1275         return toP(F.at(pos).Lambda(args, expr));
  1163     }
  1276     }
  1164 
  1277 
  1165     /** SuperSuffix = Arguments | "." [TypeArguments] Ident [Arguments]
  1278     /** SuperSuffix = Arguments | "." [TypeArguments] Ident [Arguments]
  1166      */
  1279      */
  1167     JCExpression superSuffix(List<JCExpression> typeArgs, JCExpression t) {
  1280     JCExpression superSuffix(List<JCExpression> typeArgs, JCExpression t) {
  2777         }
  2890         }
  2778         accept(RPAREN);
  2891         accept(RPAREN);
  2779         return params.toList();
  2892         return params.toList();
  2780     }
  2893     }
  2781 
  2894 
       
  2895     List<JCVariableDecl> implicitParameters(boolean hasParens) {
       
  2896         if (hasParens) {
       
  2897             accept(LPAREN);
       
  2898         }
       
  2899         ListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();
       
  2900         if (token.kind != RPAREN && token.kind != ARROW) {
       
  2901             params.append(implicitParameter());
       
  2902             while (token.kind == COMMA) {
       
  2903                 nextToken();
       
  2904                 params.append(implicitParameter());
       
  2905             }
       
  2906         }
       
  2907         if (hasParens) {
       
  2908             accept(RPAREN);
       
  2909         }
       
  2910         return params.toList();
       
  2911     }
       
  2912 
  2782     JCModifiers optFinal(long flags) {
  2913     JCModifiers optFinal(long flags) {
  2783         JCModifiers mods = modifiersOpt();
  2914         JCModifiers mods = modifiersOpt();
  2784         checkNoMods(mods.flags & ~(Flags.FINAL | Flags.DEPRECATED));
  2915         checkNoMods(mods.flags & ~(Flags.FINAL | Flags.DEPRECATED));
  2785         mods.flags |= flags;
  2916         mods.flags |= flags;
  2786         return mods;
  2917         return mods;
  2797             mods.flags |= Flags.VARARGS;
  2928             mods.flags |= Flags.VARARGS;
  2798             type = to(F.at(token.pos).TypeArray(type));
  2929             type = to(F.at(token.pos).TypeArray(type));
  2799             nextToken();
  2930             nextToken();
  2800         }
  2931         }
  2801         return variableDeclaratorId(mods, type);
  2932         return variableDeclaratorId(mods, type);
       
  2933     }
       
  2934 
       
  2935     protected JCVariableDecl implicitParameter() {
       
  2936         JCModifiers mods = F.at(token.pos).Modifiers(Flags.PARAMETER);
       
  2937         return variableDeclaratorId(mods, null);
  2802     }
  2938     }
  2803 
  2939 
  2804 /* ---------- auxiliary methods -------------- */
  2940 /* ---------- auxiliary methods -------------- */
  2805 
  2941 
  2806     void error(int pos, String key, Object ... args) {
  2942     void error(int pos, String key, Object ... args) {
  3022         if (!allowTWR) {
  3158         if (!allowTWR) {
  3023             error(token.pos, "try.with.resources.not.supported.in.source", source.name);
  3159             error(token.pos, "try.with.resources.not.supported.in.source", source.name);
  3024             allowTWR = true;
  3160             allowTWR = true;
  3025         }
  3161         }
  3026     }
  3162     }
       
  3163     void checkLambda() {
       
  3164         if (!allowLambda) {
       
  3165             log.error(token.pos, "lambda.not.supported.in.source", source.name);
       
  3166             allowLambda = true;
       
  3167         }
       
  3168     }
  3027 
  3169 
  3028     /*
  3170     /*
  3029      * a functional source tree and end position mappings
  3171      * a functional source tree and end position mappings
  3030      */
  3172      */
  3031     protected class SimpleEndPosTable extends AbstractEndPosTable {
  3173     protected class SimpleEndPosTable extends AbstractEndPosTable {