[java-highlighting] IDEA-323955 Record patterns support available only for Java 20 preview. Change lexer and parser

GitOrigin-RevId: 1897f9dfb0cb33b1249bd903831cfbb4203570de
This commit is contained in:
Mikhail Pyltsin
2023-07-04 14:11:36 +02:00
committed by intellij-monorepo-bot
parent 26e5f2d5dc
commit 770e5e4e90
17 changed files with 51 additions and 481 deletions

View File

@@ -40,7 +40,7 @@ public final class JavaLexer extends LexerBase {
level.isAtLeast(LanguageLevel.JDK_16) && RECORD.contentEquals(id) ||
level.isAtLeast(LanguageLevel.JDK_14) && YIELD.contentEquals(id) ||
level.isAtLeast(LanguageLevel.JDK_17) && (SEALED.contentEquals(id) || PERMITS.contentEquals(id)) ||
level.isAtLeast(LanguageLevel.JDK_19_PREVIEW) && WHEN.contentEquals(id);
level.isAtLeast(LanguageLevel.JDK_20_PREVIEW) && WHEN.contentEquals(id);
}
private final _JavaLexer myFlexLexer;

View File

@@ -64,19 +64,7 @@ public class PatternParser {
}
private PsiBuilder.@NotNull Marker parsePattern(final PsiBuilder builder, boolean expectVar) {
PsiBuilder.Marker guardPattern = builder.mark();
PsiBuilder.Marker primaryPattern = parsePrimaryPattern(builder, expectVar);
if (builder.getTokenType() != JavaTokenType.ANDAND) {
guardPattern.drop();
return primaryPattern;
}
builder.advanceLexer();
PsiBuilder.Marker guardingExpression = myParser.getExpressionParser().parseConditionalAndForbiddingLambda(builder);
if (guardingExpression == null) {
error(builder, JavaPsiBundle.message("expected.expression"));
}
done(guardPattern, JavaElementType.GUARDED_PATTERN);
return guardPattern;
return parsePrimaryPattern(builder, expectVar);
}
PsiBuilder.@NotNull Marker parsePrimaryPattern(final PsiBuilder builder, boolean expectVar) {

View File

@@ -1,37 +0,0 @@
PsiJavaFile:InstanceOfPattern5.java
PsiInstanceofExpression
PsiReferenceExpression:x
PsiReferenceParameterList
<empty list>
PsiIdentifier:x('x')
PsiWhiteSpace(' ')
PsiKeyword:instanceof('instanceof')
PsiWhiteSpace(' ')
PsiParenthesizedPattern
PsiJavaToken:LPARENTH('(')
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:v
PsiModifierList:
<empty list>
PsiTypeElement:Foo
PsiJavaCodeReferenceElement:Foo
PsiIdentifier:Foo('Foo')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:v('v')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiBinaryExpression:v > 10
PsiReferenceExpression:v
PsiReferenceParameterList
<empty list>
PsiIdentifier:v('v')
PsiWhiteSpace(' ')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiJavaToken:RPARENTH(')')

View File

@@ -1,85 +0,0 @@
PsiJavaFile:InstanceOfPattern6.java
PsiInstanceofExpression
PsiReferenceExpression:x
PsiReferenceParameterList
<empty list>
PsiIdentifier:x('x')
PsiWhiteSpace(' ')
PsiKeyword:instanceof('instanceof')
PsiWhiteSpace(' ')
PsiParenthesizedPattern
PsiJavaToken:LPARENTH('(')
PsiGuardedPattern
PsiParenthesizedPattern
PsiJavaToken:LPARENTH('(')
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:a
PsiModifierList:
<empty list>
PsiTypeElement:A
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:a('a')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiInstanceofExpression
PsiReferenceExpression:a.b
PsiReferenceExpression:a
PsiReferenceParameterList
<empty list>
PsiIdentifier:a('a')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:b('b')
PsiWhiteSpace(' ')
PsiKeyword:instanceof('instanceof')
PsiWhiteSpace(' ')
PsiParenthesizedPattern
PsiJavaToken:LPARENTH('(')
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:b
PsiModifierList:
<empty list>
PsiTypeElement:B
PsiJavaCodeReferenceElement:B
PsiIdentifier:B('B')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:b('b')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiBinaryExpression:b > 0
PsiReferenceExpression:b
PsiReferenceParameterList
<empty list>
PsiIdentifier:b('b')
PsiWhiteSpace(' ')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiLiteralExpression:0
PsiJavaToken:INTEGER_LITERAL('0')
PsiJavaToken:RPARENTH(')')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiBinaryExpression:a > 10
PsiReferenceExpression:a
PsiReferenceParameterList
<empty list>
PsiIdentifier:a('a')
PsiWhiteSpace(' ')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiJavaToken:RPARENTH(')')

View File

@@ -1,43 +0,0 @@
PsiJavaFile:SwitchLabelsWithPattern.java
PsiSwitchLabelStatement
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:ia
PsiModifierList:
<empty list>
PsiTypeElement:int[]
PsiTypeElement:int
PsiKeyword:int('int')
PsiJavaToken:LBRACKET('[')
PsiJavaToken:RBRACKET(']')
PsiWhiteSpace(' ')
PsiIdentifier:ia('ia')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiBinaryExpression:ia.length > 10
PsiReferenceExpression:ia.length
PsiReferenceExpression:ia
PsiReferenceParameterList
<empty list>
PsiIdentifier:ia('ia')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:length('length')
PsiWhiteSpace(' ')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiWhiteSpace(' ')
PsiJavaToken:COLON(':')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')

View File

@@ -1,49 +0,0 @@
PsiJavaFile:SwitchRules15.java
PsiSwitchLabeledRule
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:a
PsiModifierList:
<empty list>
PsiTypeElement:A
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:a('a')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiMethodCallExpression:x.foo(() -> true)
PsiReferenceExpression:x.foo
PsiReferenceExpression:x
PsiReferenceParameterList
<empty list>
PsiIdentifier:x('x')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiLambdaExpression
PsiParameterList:()
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiLiteralExpression:true
PsiJavaToken:TRUE_KEYWORD('true')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')

View File

@@ -1,31 +0,0 @@
PsiJavaFile:SwitchRules16.java
PsiSwitchLabeledRule
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:a
PsiModifierList:
<empty list>
PsiTypeElement:A
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:a('a')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiReferenceExpression:b
PsiReferenceParameterList
<empty list>
PsiIdentifier:b('b')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')

View File

@@ -1,24 +0,0 @@
PsiJavaFile:SwitchRulesWithPattern0.java
PsiSwitchLabeledRule
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')

View File

@@ -3,31 +3,17 @@ PsiJavaFile:SwitchRulesWithPattern2.java
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiBinaryExpression:i > 10
PsiReferenceExpression:i
PsiReferenceParameterList
<empty list>
PsiIdentifier:i('i')
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')

View File

@@ -3,43 +3,31 @@ PsiJavaFile:SwitchRulesWithPattern3.java
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiParenthesizedPattern
PsiJavaToken:LPARENTH('(')
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiBinaryExpression:i > 10
PsiReferenceExpression:i
PsiPatternGuard
PsiTypeTestPattern
PsiPatternVariable:when
PsiModifierList:
<empty list>
PsiTypeElement:A
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:GT('>')
PsiWhiteSpace(' ')
PsiLiteralExpression:10
PsiJavaToken:INTEGER_LITERAL('10')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiIdentifier:when('when')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiKeyword:when('when')
PsiWhiteSpace(' ')
PsiMethodCallExpression:boolExpr()
PsiReferenceExpression:boolExpr
PsiMethodCallExpression:when.foo()
PsiReferenceExpression:when.foo
PsiReferenceExpression:when
PsiReferenceParameterList
<empty list>
PsiIdentifier:when('when')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:boolExpr('boolExpr')
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
@@ -49,5 +37,4 @@ PsiJavaFile:SwitchRulesWithPattern3.java
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')

View File

@@ -1,40 +0,0 @@
PsiJavaFile:SwitchRulesWithPattern9.java
PsiSwitchLabeledRule
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiPatternGuard
PsiTypeTestPattern
PsiPatternVariable:when
PsiModifierList:
<empty list>
PsiTypeElement:A
PsiJavaCodeReferenceElement:A
PsiIdentifier:A('A')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:when('when')
PsiWhiteSpace(' ')
PsiKeyword:when('when')
PsiWhiteSpace(' ')
PsiMethodCallExpression:when.foo()
PsiReferenceExpression:when.foo
PsiReferenceExpression:when
PsiReferenceParameterList
<empty list>
PsiIdentifier:when('when')
PsiJavaToken:DOT('.')
PsiReferenceParameterList
<empty list>
PsiIdentifier:foo('foo')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiJavaToken:RBRACE('}')

View File

@@ -1,29 +0,0 @@
PsiJavaFile:SwitchRulesWithPatternIncomplete0.java
PsiSwitchLabeledRule
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')

View File

@@ -3,38 +3,22 @@ PsiJavaFile:SwitchRulesWithPatternIncomplete3.java
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiGuardedPattern
PsiParenthesizedPattern
PsiJavaToken:LPARENTH('(')
PsiGuardedPattern
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
PsiPatternGuard
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:RPARENTH(')')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiJavaToken:ANDAND('&&')
PsiWhiteSpace(' ')
PsiMethodCallExpression:boolExpr()
PsiReferenceExpression:boolExpr
PsiReferenceParameterList
<empty list>
PsiIdentifier:boolExpr('boolExpr')
PsiExpressionList
PsiJavaToken:LPARENTH('(')
PsiJavaToken:RPARENTH(')')
PsiKeyword:when('when')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')

View File

@@ -1,29 +0,0 @@
PsiJavaFile:SwitchRulesWithPatternIncomplete4.java
PsiSwitchLabeledRule
PsiKeyword:case('case')
PsiWhiteSpace(' ')
PsiCaseLabelElementList
PsiPatternGuard
PsiTypeTestPattern
PsiPatternVariable:i
PsiModifierList:
<empty list>
PsiTypeElement:Integer
PsiJavaCodeReferenceElement:Integer
PsiIdentifier:Integer('Integer')
PsiReferenceParameterList
<empty list>
PsiWhiteSpace(' ')
PsiIdentifier:i('i')
PsiWhiteSpace(' ')
PsiKeyword:when('when')
PsiErrorElement:Expression expected
<empty list>
PsiWhiteSpace(' ')
PsiJavaToken:ARROW('->')
PsiWhiteSpace(' ')
PsiBlockStatement
PsiCodeBlock
PsiJavaToken:LBRACE('{')
PsiWhiteSpace(' ')
PsiJavaToken:RBRACE('}')

View File

@@ -19,8 +19,10 @@ class JavaKeywordsTest {
assertTrue(JavaLexer.isSoftKeyword("sealed", LanguageLevel.JDK_17))
assertFalse(JavaLexer.isKeyword("permits", LanguageLevel.JDK_17))
assertTrue(JavaLexer.isSoftKeyword("permits", LanguageLevel.JDK_17))
assertFalse(JavaLexer.isKeyword("when", LanguageLevel.JDK_19_PREVIEW))
assertTrue(JavaLexer.isSoftKeyword("when", LanguageLevel.JDK_19_PREVIEW))
assertFalse(JavaLexer.isKeyword("when", LanguageLevel.JDK_20_PREVIEW))
assertTrue(JavaLexer.isSoftKeyword("when", LanguageLevel.JDK_20_PREVIEW))
assertFalse(JavaLexer.isKeyword("when", LanguageLevel.JDK_21))
assertTrue(JavaLexer.isSoftKeyword("when", LanguageLevel.JDK_21))
}
@Test fun sequences() {

View File

@@ -3,7 +3,6 @@ package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestCase;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.pom.java.LanguageLevel;
public class ExpressionParserTest extends JavaParsingTestCase {
public ExpressionParserTest() {
@@ -38,8 +37,6 @@ public class ExpressionParserTest extends JavaParsingTestCase {
public void testInstanceOfPattern2() { doParserTest("x instanceof @Ann() final Foo v"); }
public void testInstanceOfPattern3() { doParserTest("x instanceof (Foo v)"); }
public void testInstanceOfPattern4() { doParserTest("x instanceof Foo v && v > 10"); }
public void testInstanceOfPattern5() { doParserTest("x instanceof (Foo v && v > 10)"); }
public void testInstanceOfPattern6() { doParserTest("x instanceof ((A a && a.b instanceof (B b && b > 0)) && a > 10)"); }
public void testNot0() { doParserTest("!!a"); }
public void testNot1() { doParserTest("!"); }

View File

@@ -124,7 +124,6 @@ public class StatementParserTest extends JavaParsingTestCase {
public void testSwitchIncomplete5() { doParserTest("switch(\n foo();"); }
public void testSwitchLabelsNormal() { doParserTest("case 1: break; default: break;"); }
public void testSwitchLabelsWithPattern() { doParserTest("case int[] ia && ia.length > 10 : { }"); }
public void testSwitchLabelsMultiple() { doParserTest("case 1, 2: break;"); }
public void testSwitchLabelsIncomplete0() { doParserTest("case"); }
public void testSwitchLabelsIncomplete1() { doParserTest("case 2"); }
@@ -148,24 +147,18 @@ public class StatementParserTest extends JavaParsingTestCase {
public void testSwitchRules12() { doParserTest("case 1, -> { }"); }
public void testSwitchRules13() { doParserTest("case null, default -> { }"); }
public void testSwitchRules14() { doParserTest("case default -> { }"); }
public void testSwitchRules15() { doParserTest("case A a && x.foo(() -> true) -> {}"); }
public void testSwitchRules16() { doParserTest("case A a && b -> {}"); }
public void testSwitchRulesWithPattern0() { doParserTest("case Integer i -> { }"); }
public void testSwitchRulesWithPattern1() { doParserTest("case int[] ia -> { }"); }
public void testSwitchRulesWithPattern2() { doParserTest("case Integer i && i > 10 -> { }"); }
public void testSwitchRulesWithPattern3() { doParserTest("case (Integer i && i > 10) && boolExpr() -> { }"); }
public void testSwitchRulesWithPattern2() { doParserTest("case Integer i -> { }"); }
public void testSwitchRulesWithPattern3() { doParserTest("case A when when when.foo() -> {}"); }
public void testSwitchRulesWithPattern4() { doParserTest("case null, default -> { }"); }
public void testSwitchRulesWithPattern5() { doParserTest("case null -> { }"); }
public void testSwitchRulesWithPattern6() { doParserTest("case Integer i when true -> { }"); }
public void testSwitchRulesWithPattern7() { doParserTest("case R(int i) when true -> {}"); }
public void testSwitchRulesWithPattern8() { doParserTest("case R(int i) when a < b -> {}"); }
public void testSwitchRulesWithPattern9() { doParserTest("case A when when when.foo() -> {}"); }
public void testSwitchRulesWithPatternIncomplete0() { doParserTest("case Integer i && -> { }"); }
public void testSwitchRulesWithPatternIncomplete1() { doParserTest("case (Integer i -> { }"); }
public void testSwitchRulesWithPatternIncomplete2() { doParserTest("case Integer i, -> { }"); }
public void testSwitchRulesWithPatternIncomplete3() { doParserTest("case (Integer i && ) && boolExpr() -> { }"); }
public void testSwitchRulesWithPatternIncomplete4() { doParserTest("case Integer i when -> { }"); }
public void testSwitchRulesWithPatternIncomplete3() { doParserTest("case Integer i when -> { }"); }
public void testSyncNormal() { doParserTest("synchronized(o){}"); }
public void testSyncIncomplete0() { doParserTest("synchronized"); }