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); |
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; |
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; |