mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
JavaParser: remove outdated special casing for yield, prefer stmt
GitOrigin-RevId: fb804d972a8a2280146bfad740d92c93fd20861a
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3aa97e08fa
commit
69b3bdfef9
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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(';')
|
||||
+15
-19
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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" +
|
||||
|
||||
Reference in New Issue
Block a user