From 69b3bdfef9d40cb69cc707245d03f84d8e525135 Mon Sep 17 00:00:00 2001 From: Roman Ivanov Date: Thu, 29 Apr 2021 10:08:01 +0700 Subject: [PATCH] JavaParser: remove outdated special casing for yield, prefer stmt GitOrigin-RevId: fb804d972a8a2280146bfad740d92c93fd20861a --- .../lang/java/parser/StatementParser.java | 44 ++----------------- .../switchExpressions/YieldStatements.java | 2 +- .../statements/YieldCallNonQualified.txt | 16 +++---- .../YieldCallNonQualifiedWithLambda.txt | 34 +++++++------- .../com/intellij/java/psi/JavaPsiTest.groovy | 10 ----- .../java/JavaFormatterSpaceTest.java | 2 +- 6 files changed, 27 insertions(+), 81 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java index ead25c8c7369..7f94cf0682f7 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/StatementParser.java @@ -265,47 +265,9 @@ public class StatementParser { } private static boolean isStmtYieldToken(@NotNull PsiBuilder builder, IElementType tokenType) { - if (!(tokenType == JavaTokenType.IDENTIFIER && - PsiKeyword.YIELD.equals(builder.getTokenText()) && - getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_14))) { - return false; - } - IElementType next = builder.lookAhead(1); - if (YIELD_EXPR_INDICATOR_TOKENS.contains(next)) return false; - // yield () -> 10; is valid - // yield(); is not - if (isSemiAfterBalancedParensNext(builder)) return false; - return !JavaTokenType.PLUSPLUS.equals(next) && !JavaTokenType.MINUSMINUS.equals(next) || - !JavaTokenType.SEMICOLON.equals(builder.lookAhead(2)); - } - - private static boolean isSemiAfterBalancedParensNext(@NotNull PsiBuilder builder) { - PsiBuilder.Marker maybeYieldCall = builder.mark(); - boolean result = isSemiAfterBalancedParensNextInternal(builder); - maybeYieldCall.rollbackTo(); - return result; - } - - private static boolean isSemiAfterBalancedParensNextInternal(@NotNull PsiBuilder builder) { - builder.advanceLexer(); // skip yield ref - if (!expect(builder, JavaTokenType.LPARENTH)) return false; - int unbalancedLpars = 1; - while (true) { - final IElementType token = builder.getTokenType(); - if (token == null) return false; - if (token == JavaTokenType.RPARENTH) { - unbalancedLpars--; - } - if (token == JavaTokenType.LPARENTH) { - unbalancedLpars++; - } - if (unbalancedLpars == 0) { - break; - } - builder.advanceLexer(); - } - builder.advanceLexer(); - return builder.getTokenType() == JavaTokenType.SEMICOLON; + return tokenType == JavaTokenType.IDENTIFIER && + PsiKeyword.YIELD.equals(builder.getTokenText()) && + getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_14); } private static void skipQualifiedName(PsiBuilder builder) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/YieldStatements.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/YieldStatements.java index 7c382642b380..41c0c395c427 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/YieldStatements.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/switchExpressions/YieldStatements.java @@ -14,7 +14,7 @@ class YieldStatements { case 1 -> { while (true) yield ref; } case 2 -> { while (true) break wtf; } case 3 -> { yield ref; } - case 4 -> { yield (ref); } + case 4 -> { yield (ref); } case 5 -> { break wtf; } case 6 -> { int a = 0; diff --git a/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualified.txt b/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualified.txt index 219da4746fc3..f7c9c0fe79aa 100644 --- a/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualified.txt +++ b/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualified.txt @@ -1,11 +1,9 @@ PsiJavaFile:YieldCallNonQualified.java - PsiExpressionStatement - PsiMethodCallExpression:yield() - PsiReferenceExpression:yield - PsiReferenceParameterList - - PsiIdentifier:yield('yield') - PsiExpressionList - PsiJavaToken:LPARENTH('(') - PsiJavaToken:RPARENTH(')') + PsiYieldStatement + PsiKeyword:yield('yield') + PsiParenthesizedExpression:() + PsiJavaToken:LPARENTH('(') + PsiErrorElement:Expression expected + + PsiJavaToken:RPARENTH(')') PsiJavaToken:SEMICOLON(';') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualifiedWithLambda.txt b/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualifiedWithLambda.txt index 720ae40b8175..c3fe2e981b31 100644 --- a/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualifiedWithLambda.txt +++ b/java/java-tests/testData/psi/parser-partial/statements/YieldCallNonQualifiedWithLambda.txt @@ -1,21 +1,17 @@ PsiJavaFile:YieldCallNonQualifiedWithLambda.java - PsiExpressionStatement - PsiMethodCallExpression:yield(() -> {}) - PsiReferenceExpression:yield - PsiReferenceParameterList - - PsiIdentifier:yield('yield') - PsiExpressionList - PsiJavaToken:LPARENTH('(') - PsiLambdaExpression - PsiParameterList:() - PsiJavaToken:LPARENTH('(') - PsiJavaToken:RPARENTH(')') - PsiWhiteSpace(' ') - PsiJavaToken:ARROW('->') - PsiWhiteSpace(' ') - PsiCodeBlock - PsiJavaToken:LBRACE('{') - PsiJavaToken:RBRACE('}') - PsiJavaToken:RPARENTH(')') + PsiYieldStatement + PsiKeyword:yield('yield') + PsiParenthesizedExpression:(() -> {}) + PsiJavaToken:LPARENTH('(') + PsiLambdaExpression + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiJavaToken:ARROW('->') + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiJavaToken:RPARENTH(')') PsiJavaToken:SEMICOLON(';') \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/psi/JavaPsiTest.groovy b/java/java-tests/testSrc/com/intellij/java/psi/JavaPsiTest.groovy index ebe0455ceccb..f364765a280b 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/JavaPsiTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/psi/JavaPsiTest.groovy @@ -112,16 +112,6 @@ class JavaPsiTest extends LightJavaCodeInsightFixtureTestCase { PsiTestUtil.checkPsiMatchesTextIgnoringNonCode(file) } - void "test yield method is consistent"() { - def file = configureFile("class A{ void m() { Thread.yield();}}") - runCommand { - def statement = file.classes.first().methods.first().getBody().statements.first() as PsiExpressionStatement - def reference = statement.expression as PsiMethodCallExpression - reference.methodExpression.qualifier.delete() - } - PsiTestUtil.checkPsiMatchesTextIgnoringNonCode(file) - } - void testTextBlockLiteralValue() { def file = configureFile(""" class C { diff --git a/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterSpaceTest.java b/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterSpaceTest.java index 74df93ca12c3..95181687b19c 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterSpaceTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/formatter/java/JavaFormatterSpaceTest.java @@ -763,7 +763,7 @@ public class JavaFormatterSpaceTest extends AbstractJavaFormatterTest { " case 4: yield ;\n" + "}", "String s = switch (i) {\n" + - " case 0: yield(foo);\n" + + " case 0: yield (foo);\n" + " case 1: yield 42;\n" + " case 3: yield label;\n" + " case 4: yield ;\n" +