JavaParser: remove outdated special casing for yield, prefer stmt

GitOrigin-RevId: fb804d972a8a2280146bfad740d92c93fd20861a
This commit is contained in:
Roman Ivanov
2021-04-29 05:45:30 +00:00
committed by intellij-monorepo-bot
parent 3aa97e08fa
commit 69b3bdfef9
6 changed files with 27 additions and 81 deletions
@@ -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) {
@@ -14,7 +14,7 @@ class YieldStatements {
case 1 -> { while (true) yield ref; }
case 2 -> { while (true) break <error descr="Undefined label: 'wtf'">wtf</error>; }
case 3 -> { yield ref; }
case 4 -> { <error descr="Illegal reference to restricted type 'yield'">yield</error> (ref); }
case 4 -> { yield (ref); }
case 5 -> { break <error descr="Undefined label: 'wtf'">wtf</error>; }
case 6 -> {
int a = 0;
@@ -1,11 +1,9 @@
PsiJavaFile:YieldCallNonQualified.java
PsiExpressionStatement
PsiMethodCallExpression:yield()
PsiReferenceExpression:yield
PsiReferenceParameterList
<empty list>
PsiIdentifier:yield('yield')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiYieldStatement
PsiKeyword:yield('yield')
PsiParenthesizedExpression:()
PsiJavaToken:LPARENTH('(')
PsiErrorElement:Expression expected
<empty list>
PsiJavaToken:RPARENTH(')')
PsiJavaToken:SEMICOLON(';')
@@ -1,21 +1,17 @@
PsiJavaFile:YieldCallNonQualifiedWithLambda.java
PsiExpressionStatement
PsiMethodCallExpression:yield(() -> {})
PsiReferenceExpression:yield
PsiReferenceParameterList
<empty list>
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(';')
@@ -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 {
@@ -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" +