diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index d3539b53541..d658275d4dc 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -271,16 +271,11 @@ public class JavacParser implements Parser { /** When terms are parsed, the mode determines which is expected: * mode = EXPR : an expression * mode = TYPE : a type - * mode = NOPARAMS : no parameters allowed for type - * mode = TYPEARG : type argument - * mode |= NOLAMBDA : lambdas are not allowed + * mode = NOLAMBDA : lambdas are not allowed */ protected static final int EXPR = 1 << 0; protected static final int TYPE = 1 << 1; - protected static final int NOPARAMS = 1 << 2; - protected static final int TYPEARG = 1 << 3; - protected static final int DIAMOND = 1 << 4; - protected static final int NOLAMBDA = 1 << 5; + protected static final int NOLAMBDA = 1 << 2; protected void setMode(int mode) { this.mode = mode; @@ -1439,12 +1434,6 @@ public class JavacParser implements Parser { int startMode = mode; List typeArgs = typeArgumentsOpt(EXPR); switch (token.kind) { - case QUES: - if (isMode(TYPE) && isMode(TYPEARG) && !isMode(NOPARAMS)) { - selectTypeMode(); - return typeArgument(); - } else - return illegal(); case PLUSPLUS: case SUBSUB: case BANG: case TILDE: case PLUS: case SUB: if (typeArgs == null && isMode(EXPR)) { TokenKind tk = token.kind; @@ -1522,7 +1511,7 @@ public class JavacParser implements Parser { if (isMode(EXPR)) { selectExprMode(); nextToken(); - if (token.kind == LT) typeArgs = typeArguments(false); + if (token.kind == LT) typeArgs = typeArguments(); t = creator(pos, typeArgs); typeArgs = null; } else return illegal(); @@ -1625,7 +1614,6 @@ public class JavacParser implements Parser { return illegal(); } int prevmode = mode; - setMode(mode & ~NOPARAMS); typeArgs = typeArgumentsOpt(EXPR); setMode(prevmode); if (isMode(EXPR)) { @@ -1653,7 +1641,7 @@ public class JavacParser implements Parser { selectExprMode(); int pos1 = token.pos; nextToken(); - if (token.kind == LT) typeArgs = typeArguments(false); + if (token.kind == LT) typeArgs = typeArguments(); t = innerCreator(pos1, typeArgs, t); typeArgs = null; break loop; @@ -1704,7 +1692,7 @@ public class JavacParser implements Parser { nextToken(); selectTypeMode(); t = toP(F.at(token.pos).Select(t, ident())); - t = typeArgumentsOpt(t); + t = typeApplyOpt(t); } t = bracketsOpt(t); if (token.kind != COLCOL) { @@ -1721,7 +1709,7 @@ public class JavacParser implements Parser { } } if (typeArgs != null) illegal(); - t = typeArgumentsOpt(t); + t = typeApplyOpt(t); break; case BYTE: case SHORT: case CHAR: case INT: case LONG: case FLOAT: case DOUBLE: case BOOLEAN: @@ -1880,7 +1868,7 @@ public class JavacParser implements Parser { selectExprMode(); int pos2 = token.pos; nextToken(); - if (token.kind == LT) typeArgs = typeArguments(false); + if (token.kind == LT) typeArgs = typeArguments(); t = innerCreator(pos2, typeArgs, t); typeArgs = null; } else { @@ -1900,7 +1888,7 @@ public class JavacParser implements Parser { if (tyannos != null && tyannos.nonEmpty()) { t = toP(F.at(tyannos.head.pos).AnnotatedType(tyannos, t)); } - t = argumentsOpt(typeArgs, typeArgumentsOpt(t)); + t = argumentsOpt(typeArgs, typeApplyOpt(t)); typeArgs = null; } } else if (isMode(EXPR) && token.kind == COLCOL) { @@ -2302,7 +2290,7 @@ public class JavacParser implements Parser { } else { int pos = token.pos; accept(DOT); - typeArgs = (token.kind == LT) ? typeArguments(false) : null; + typeArgs = (token.kind == LT) ? typeArguments() : null; t = toP(F.at(pos).Select(t, ident())); t = argumentsOpt(typeArgs, t); } @@ -2373,12 +2361,11 @@ public class JavacParser implements Parser { /** TypeArgumentsOpt = [ TypeArguments ] */ - JCExpression typeArgumentsOpt(JCExpression t) { + JCExpression typeApplyOpt(JCExpression t) { if (token.kind == LT && - isMode(TYPE) && - !isMode(NOPARAMS)) { + isMode(TYPE)) { selectTypeMode(); - return typeArguments(t, false); + return typeApply(t); } else { return t; } @@ -2389,12 +2376,11 @@ public class JavacParser implements Parser { List typeArgumentsOpt(int useMode) { if (token.kind == LT) { - if (!isMode(useMode) || - isMode(NOPARAMS)) { + if (!isMode(useMode)) { illegal(); } setMode(useMode); - return typeArguments(false); + return typeArguments(); } return null; } @@ -2404,35 +2390,29 @@ public class JavacParser implements Parser { * TypeArguments = "<" TypeArgument {"," TypeArgument} ">" * } */ - List typeArguments(boolean diamondAllowed) { + List typeArguments() { if (token.kind == LT) { nextToken(); - if (token.kind == GT && diamondAllowed) { - setMode(mode | DIAMOND); + ListBuffer args = new ListBuffer<>(); + args.append(!isMode(EXPR) ? typeArgument() : parseType()); + while (token.kind == COMMA) { nextToken(); - return List.nil(); - } else { - ListBuffer args = new ListBuffer<>(); args.append(!isMode(EXPR) ? typeArgument() : parseType()); - while (token.kind == COMMA) { - nextToken(); - args.append(!isMode(EXPR) ? typeArgument() : parseType()); - } - switch (token.kind) { - - case GTGTGTEQ: case GTGTEQ: case GTEQ: - case GTGTGT: case GTGT: - token = S.split(); - break; - case GT: - nextToken(); - break; - default: - args.append(syntaxError(token.pos, Errors.Expected2(GT, COMMA))); - break; - } - return args.toList(); } + switch (token.kind) { + + case GTGTGTEQ: case GTGTEQ: case GTEQ: + case GTGTGT: case GTGT: + token = S.split(); + break; + case GT: + nextToken(); + break; + default: + args.append(syntaxError(token.pos, Errors.Expected2(GT, COMMA))); + break; + } + return args.toList(); } else { return List.of(syntaxError(token.pos, Errors.Expected(LT))); } @@ -2480,12 +2460,23 @@ public class JavacParser implements Parser { return result; } - JCTypeApply typeArguments(JCExpression t, boolean diamondAllowed) { + JCTypeApply typeApply(JCExpression t) { int pos = token.pos; - List args = typeArguments(diamondAllowed); + List args = typeArguments(); return toP(F.at(pos).TypeApply(t, args)); } + JCTypeApply typeApplyOrDiamond(JCExpression t) { + if (peekToken(GT)) { + int pos = token.pos; + accept(LT); + accept(GT); + return toP(F.at(pos).TypeApply(t, List.nil())); + } else { + return typeApply(t); + } + } + /** * BracketsOpt = { [Annotations] "[" "]" }* * @@ -2585,7 +2576,7 @@ public class JavacParser implements Parser { selectExprMode(); List typeArgs = null; if (token.kind == LT) { - typeArgs = typeArguments(false); + typeArgs = typeArguments(); } Name refName; ReferenceMode refMode; @@ -2622,15 +2613,13 @@ public class JavacParser implements Parser { int prevmode = mode; selectTypeMode(); - boolean diamondFound = false; int lastTypeargsPos = -1; if (token.kind == LT) { lastTypeargsPos = token.pos; - t = typeArguments(t, true); - diamondFound = isMode(DIAMOND); + t = typeApplyOrDiamond(t); } while (token.kind == DOT) { - if (diamondFound) { + if (TreeInfo.isDiamond(t)) { //cannot select after a diamond illegal(); } @@ -2645,8 +2634,7 @@ public class JavacParser implements Parser { if (token.kind == LT) { lastTypeargsPos = token.pos; - t = typeArguments(t, true); - diamondFound = isMode(DIAMOND); + t = typeApplyOrDiamond(t); } } setMode(prevmode); @@ -2657,7 +2645,7 @@ public class JavacParser implements Parser { } JCExpression e = arrayCreatorRest(newpos, t); - if (diamondFound) { + if (TreeInfo.isDiamond(t)) { reportSyntaxError(lastTypeargsPos, Errors.CannotCreateArrayWithDiamond); return toP(F.at(newpos).Erroneous(List.of(e))); } @@ -2702,7 +2690,7 @@ public class JavacParser implements Parser { if (token.kind == LT) { int prevmode = mode; - t = typeArguments(t, true); + t = typeApplyOrDiamond(t); setMode(prevmode); } return classCreatorRest(newpos, encl, typeArgs, t);