Java: Pratt expression parser cleanup (IDEA-305898)

GitOrigin-RevId: 97465caee1ec49b759290fef92e48d7231bf4681
This commit is contained in:
Bas Leijdekkers
2024-08-01 12:35:28 +00:00
committed by intellij-monorepo-bot
parent c8215f8fbc
commit 5fe32f5f14
@@ -29,7 +29,6 @@ import static com.intellij.psi.impl.source.BasicElementTypes.*;
@SuppressWarnings("UnnecessarilyQualifiedStaticUsage")
@ApiStatus.Experimental
public class BasicPrattExpressionParser {
static final int FORBID_LAMBDA_MASK = 0x1;
private final Map<IElementType, ParserData> ourInfixParsers;
private static final TokenSet THIS_OR_SUPER = TokenSet.create(JavaTokenType.THIS_KEYWORD, JavaTokenType.SUPER_KEYWORD);
private static final TokenSet ID_OR_SUPER = TokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.SUPER_KEYWORD);
@@ -42,7 +41,6 @@ public class BasicPrattExpressionParser {
private static final TokenSet PREF_ARITHMETIC_OPS = TokenSet.orSet(POSTFIX_OPS, TokenSet.create(JavaTokenType.PLUS, JavaTokenType.MINUS));
private static final TokenSet PREFIX_OPS = TokenSet.orSet(PREF_ARITHMETIC_OPS, TokenSet.create(JavaTokenType.TILDE, JavaTokenType.EXCL));
private static final int MULTIPLICATION_PRECEDENCE = 2;
private static final int ADDITIVE_PRECEDENCE = 3;
private static final int SHIFT_PRECEDENCE = 4;
@@ -418,7 +416,7 @@ public class BasicPrattExpressionParser {
}
if (tokenType == JavaTokenType.LPARENTH) {
if (!BitUtil.isSet(mode, FORBID_LAMBDA_MASK)) {
if (!BitUtil.isSet(mode, BasicExpressionParser.FORBID_LAMBDA_MASK)) {
final PsiBuilder.Marker lambda = parseLambdaAfterParenth(builder);
if (lambda != null) {
return lambda;
@@ -433,10 +431,8 @@ public class BasicPrattExpressionParser {
error(builder, JavaPsiBundle.message("expected.expression"));
}
if (!expect(builder, JavaTokenType.RPARENTH)) {
if (inner != null) {
error(builder, JavaPsiBundle.message("expected.rparen"));
}
if (!expect(builder, JavaTokenType.RPARENTH) && inner != null) {
error(builder, JavaPsiBundle.message("expected.rparen"));
}
parenth.done(myJavaElementTypeContainer.PARENTH_EXPRESSION);
@@ -470,7 +466,7 @@ public class BasicPrattExpressionParser {
builder.remapCurrentToken(tokenType = JavaTokenType.IDENTIFIER);
}
if (tokenType == JavaTokenType.IDENTIFIER) {
if (!BitUtil.isSet(mode, FORBID_LAMBDA_MASK) && builder.lookAhead(1) == JavaTokenType.ARROW) {
if (!BitUtil.isSet(mode, BasicExpressionParser.FORBID_LAMBDA_MASK) && builder.lookAhead(1) == JavaTokenType.ARROW) {
return parseLambdaExpression(builder, false);
}
@@ -882,21 +878,17 @@ public class BasicPrattExpressionParser {
if (builder.rawLookup(1) == JavaTokenType.GT) {
if (builder.rawLookup(2) == JavaTokenType.GT) {
if (builder.rawLookup(3) == JavaTokenType.EQ) {
tokenType = JavaTokenType.GTGTGTEQ;
}
else {
tokenType = JavaTokenType.GTGTGT;
return JavaTokenType.GTGTGTEQ;
}
return JavaTokenType.GTGTGT;
}
else if (builder.rawLookup(2) == JavaTokenType.EQ) {
tokenType = JavaTokenType.GTGTEQ;
}
else {
tokenType = JavaTokenType.GTGT;
if (builder.rawLookup(2) == JavaTokenType.EQ) {
return JavaTokenType.GTGTEQ;
}
return JavaTokenType.GTGT;
}
else if (builder.rawLookup(1) == JavaTokenType.EQ) {
tokenType = JavaTokenType.GE;
return JavaTokenType.GE;
}
return tokenType;