diff --git a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicDeclarationParser.java b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicDeclarationParser.java index 032f5001d0b9..3c38ba6cbc2c 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicDeclarationParser.java +++ b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicDeclarationParser.java @@ -82,7 +82,10 @@ public class BasicDeclarationParser { IElementType keywordTokenType = builder.getTokenType(); final boolean isRecord = isRecordToken(builder, keywordTokenType); if (isRecord) { + builder.remapCurrentToken(JavaTokenType.RECORD_KEYWORD); if (builder.lookAhead(1) != JavaTokenType.IDENTIFIER) { + builder.advanceLexer(); + error(builder, JavaPsiBundle.message("expected.identifier")); declaration.drop(); return null; } @@ -96,7 +99,6 @@ public class BasicDeclarationParser { declaration.drop(); return null; } - builder.remapCurrentToken(JavaTokenType.RECORD_KEYWORD); keywordTokenType = JavaTokenType.RECORD_KEYWORD; } assert BASIC_CLASS_KEYWORD_BIT_SET.contains(keywordTokenType) : keywordTokenType; @@ -414,11 +416,17 @@ public class BasicDeclarationParser { return parseFieldOrLocalVariable(builder, declaration, declarationStart, context); } - static boolean isRecordToken(PsiBuilder builder, IElementType tokenType) { - if (tokenType == JavaTokenType.IDENTIFIER && PsiKeyword.RECORD.equals(builder.getTokenText()) && - builder.lookAhead(1) == JavaTokenType.IDENTIFIER) { - LanguageLevel level = getLanguageLevel(builder); - return JavaFeature.RECORDS.isSufficient(level); + boolean isRecordToken(PsiBuilder builder, IElementType tokenType) { + if (tokenType == JavaTokenType.IDENTIFIER && PsiKeyword.RECORD.equals(builder.getTokenText())) { + IElementType nextToken = builder.lookAhead(1); + if (nextToken == JavaTokenType.IDENTIFIER || + // The following tokens cannot be part of a valid record declaration, + // but we assume it to be a malformed record, rather than a malformed type. + BASIC_MODIFIER_BIT_SET.contains(nextToken) || BASIC_CLASS_KEYWORD_BIT_SET.contains(nextToken) || TYPE_START.contains(nextToken) || + nextToken == JavaTokenType.AT || nextToken == JavaTokenType.LBRACE || nextToken == JavaTokenType.RBRACE) { + LanguageLevel level = getLanguageLevel(builder); + return JavaFeature.RECORDS.isSufficient(level); + } } return false; } diff --git a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicFileParser.java b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicFileParser.java index ea02fe647906..0bbf9a9fce10 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicFileParser.java +++ b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicFileParser.java @@ -104,7 +104,7 @@ public class BasicFileParser { private boolean stopImportListParsing(PsiBuilder b) { IElementType type = b.getTokenType(); - if (IMPORT_LIST_STOPPER_SET.contains(type) || BasicDeclarationParser.isRecordToken(b, type)) return true; + if (IMPORT_LIST_STOPPER_SET.contains(type) || myParser.getDeclarationParser().isRecordToken(b, type)) return true; if (type == JavaTokenType.IDENTIFIER) { String text = b.getTokenText(); if (PsiKeyword.OPEN.equals(text) || PsiKeyword.MODULE.equals(text)) return true; diff --git a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicStatementParser.java b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicStatementParser.java index 218a5cf9f128..87bcad266fe2 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicStatementParser.java +++ b/java/java-frontback-psi-impl/src/com/intellij/lang/java/parser/BasicStatementParser.java @@ -213,6 +213,7 @@ public class BasicStatementParser { PsiBuilder.Marker pos = builder.mark(); PsiBuilder.Marker expr = myParser.getExpressionParser().parse(builder); + IElementType incompleteDeclarationRestrictedTokenType = null; if (expr != null) { int count = 1; @@ -242,7 +243,17 @@ public class BasicStatementParser { done(statement, myJavaElementTypeContainer.EXPRESSION_STATEMENT, myWhiteSpaceAndCommentSetHolder); return statement; } + boolean singleToken = expr.getEndIndex() - expr.getStartIndex() == 1; pos.rollbackTo(); + if (singleToken && builder.getTokenType() == JavaTokenType.IDENTIFIER) { + String text = builder.getTokenText(); + if (PsiKeyword.RECORD.equals(text) && JavaFeature.RECORDS.isSufficient(getLanguageLevel(builder))) { + incompleteDeclarationRestrictedTokenType = JavaTokenType.RECORD_KEYWORD; + } + if (PsiKeyword.VAR.equals(text) && JavaFeature.LVTI.isSufficient(getLanguageLevel(builder))) { + incompleteDeclarationRestrictedTokenType = JavaTokenType.VAR_KEYWORD; + } + } } else { pos.drop(); @@ -265,9 +276,18 @@ public class BasicStatementParser { if (expr != null) { PsiBuilder.Marker statement = builder.mark(); - myParser.getExpressionParser().parse(builder); - semicolon(builder); - done(statement, myJavaElementTypeContainer.EXPRESSION_STATEMENT, myWhiteSpaceAndCommentSetHolder); + IElementType statementType; + if (incompleteDeclarationRestrictedTokenType != null) { + builder.remapCurrentToken(incompleteDeclarationRestrictedTokenType); + builder.advanceLexer(); + error(builder, JavaPsiBundle.message("expected.identifier")); + statementType = myJavaElementTypeContainer.DECLARATION_STATEMENT; + } else { + myParser.getExpressionParser().parse(builder); + statementType = myJavaElementTypeContainer.EXPRESSION_STATEMENT; + semicolon(builder); + } + done(statement, statementType, myWhiteSpaceAndCommentSetHolder); return statement; } diff --git a/java/java-frontback-tests/testSrc/com/intellij/java/parser/declarationParsing/AbstractBasicClassParsingTest.java b/java/java-frontback-tests/testSrc/com/intellij/java/parser/declarationParsing/AbstractBasicClassParsingTest.java index c34c69ce0719..9becc7180eb8 100644 --- a/java/java-frontback-tests/testSrc/com/intellij/java/parser/declarationParsing/AbstractBasicClassParsingTest.java +++ b/java/java-frontback-tests/testSrc/com/intellij/java/parser/declarationParsing/AbstractBasicClassParsingTest.java @@ -86,8 +86,16 @@ public abstract class AbstractBasicClassParsingTest extends AbstractBasicJavaPar public void testRecordNoClosingTypeBracket() { doTest(true); } public void testRecordWithModifiers() { doTest(true); } + + public void testRecordIncomplete() { doTest(true); } public void testRecordInCodeBlock() { doTest(true); } + + public void testRecordInCodeBlockIncompleteBeforeDeclaration() { doTest(true); } + + public void testRecordInCodeBlockIncompleteBeforeIfStatement() { doTest(true); } + + public void testVarIncomplete() { doTest(true); } public void testLocalRecord() { doTest(true); } diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens.txt index 5a908f5d19f8..fb12d1d5c915 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens.txt @@ -37,7 +37,7 @@ PsiJavaFile:LocalRecordWithoutParens.java PsiDeclarationStatement PsiModifierList: - PsiIdentifier:record('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:R('R') PsiErrorElement:'<' or '(' expected diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens_node.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens_node.txt index 302c9113b22f..bca17cad2dba 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens_node.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/LocalRecordWithoutParens_node.txt @@ -37,7 +37,7 @@ java.FILE DECLARATION_STATEMENT MODIFIER_LIST - IDENTIFIER + RECORD WHITE_SPACE IDENTIFIER ERROR_ELEMENT diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration.java b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration.java new file mode 100644 index 000000000000..6fe889c9955f --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration.java @@ -0,0 +1,6 @@ +class A { + void test() { + record + String string = "hello"; + } +} diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration.txt new file mode 100644 index 000000000000..6bece4b064fd --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration.txt @@ -0,0 +1,61 @@ +PsiJavaFile:RecordInCodeBlockIncompleteBeforeDeclaration.java + PsiImportList + + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:test + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:test('test') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiModifierList: + + PsiKeyword:record('record') + PsiWhiteSpace('\n ') + PsiIdentifier:String('String') + PsiErrorElement:'<' or '(' expected + + PsiWhiteSpace(' ') + PsiExpressionStatement + PsiAssignmentExpression:string = "hello" + PsiReferenceExpression:string + PsiReferenceParameterList + + PsiIdentifier:string('string') + PsiWhiteSpace(' ') + PsiJavaToken:EQ('=') + PsiWhiteSpace(' ') + PsiLiteralExpression:"hello" + PsiJavaToken:STRING_LITERAL('"hello"') + PsiJavaToken:SEMICOLON(';') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration_node.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration_node.txt new file mode 100644 index 000000000000..b22c9198bb6f --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeDeclaration_node.txt @@ -0,0 +1,61 @@ +java.FILE + IMPORT_LIST + + CLASS + MODIFIER_LIST + + CLASS_KEYWORD + WHITE_SPACE + IDENTIFIER + TYPE_PARAMETER_LIST + + EXTENDS_LIST + + IMPLEMENTS_LIST + + WHITE_SPACE + LBRACE + WHITE_SPACE + METHOD + MODIFIER_LIST + + TYPE_PARAMETER_LIST + + TYPE + VOID_KEYWORD + WHITE_SPACE + IDENTIFIER + PARAMETER_LIST + LPARENTH + RPARENTH + THROWS_LIST + + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + DECLARATION_STATEMENT + MODIFIER_LIST + + RECORD + WHITE_SPACE + IDENTIFIER + ERROR_ELEMENT + + WHITE_SPACE + EXPRESSION_STATEMENT + ASSIGNMENT_EXPRESSION + REFERENCE_EXPRESSION + REFERENCE_PARAMETER_LIST + + IDENTIFIER + WHITE_SPACE + EQ + WHITE_SPACE + LITERAL_EXPRESSION + STRING_LITERAL + SEMICOLON + WHITE_SPACE + RBRACE + WHITE_SPACE + RBRACE \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement.java b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement.java new file mode 100644 index 000000000000..d0bea85012e9 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement.java @@ -0,0 +1,6 @@ +class A { + void test(int x) { + record + if (x > 0) {} + } +} diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement.txt new file mode 100644 index 000000000000..9f3698afe03c --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement.txt @@ -0,0 +1,72 @@ +PsiJavaFile:RecordInCodeBlockIncompleteBeforeIfStatement.java + PsiImportList + + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:test + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:test('test') + PsiParameterList:(int x) + PsiJavaToken:LPARENTH('(') + PsiParameter:x + PsiModifierList: + + PsiTypeElement:int + PsiKeyword:int('int') + PsiWhiteSpace(' ') + PsiIdentifier:x('x') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiKeyword:record('record') + PsiErrorElement:Identifier expected + + PsiWhiteSpace('\n ') + PsiIfStatement + PsiKeyword:if('if') + PsiWhiteSpace(' ') + PsiJavaToken:LPARENTH('(') + PsiBinaryExpression:x > 0 + PsiReferenceExpression:x + PsiReferenceParameterList + + PsiIdentifier:x('x') + PsiWhiteSpace(' ') + PsiJavaToken:GT('>') + PsiWhiteSpace(' ') + PsiLiteralExpression:0 + PsiJavaToken:INTEGER_LITERAL('0') + PsiJavaToken:RPARENTH(')') + PsiWhiteSpace(' ') + PsiBlockStatement + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement_node.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement_node.txt new file mode 100644 index 000000000000..d585e313d805 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordInCodeBlockIncompleteBeforeIfStatement_node.txt @@ -0,0 +1,72 @@ +java.FILE + IMPORT_LIST + + CLASS + MODIFIER_LIST + + CLASS_KEYWORD + WHITE_SPACE + IDENTIFIER + TYPE_PARAMETER_LIST + + EXTENDS_LIST + + IMPLEMENTS_LIST + + WHITE_SPACE + LBRACE + WHITE_SPACE + METHOD + MODIFIER_LIST + + TYPE_PARAMETER_LIST + + TYPE + VOID_KEYWORD + WHITE_SPACE + IDENTIFIER + PARAMETER_LIST + LPARENTH + PARAMETER + MODIFIER_LIST + + TYPE + INT_KEYWORD + WHITE_SPACE + IDENTIFIER + RPARENTH + THROWS_LIST + + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + DECLARATION_STATEMENT + RECORD + ERROR_ELEMENT + + WHITE_SPACE + IF_STATEMENT + IF_KEYWORD + WHITE_SPACE + LPARENTH + BINARY_EXPRESSION + REFERENCE_EXPRESSION + REFERENCE_PARAMETER_LIST + + IDENTIFIER + WHITE_SPACE + GT + WHITE_SPACE + LITERAL_EXPRESSION + INTEGER_LITERAL + RPARENTH + WHITE_SPACE + BLOCK_STATEMENT + CODE_BLOCK + LBRACE + RBRACE + WHITE_SPACE + RBRACE + WHITE_SPACE + RBRACE \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete.java b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete.java new file mode 100644 index 000000000000..1389d398b593 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete.java @@ -0,0 +1,3 @@ +class A { + record +} diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete.txt new file mode 100644 index 000000000000..bc731914599b --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete.txt @@ -0,0 +1,25 @@ +PsiJavaFile:RecordIncomplete.java + PsiImportList + + PsiClass:A + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:A('A') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiModifierList: + + PsiKeyword:record('record') + PsiErrorElement:Identifier expected + + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete_node.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete_node.txt new file mode 100644 index 000000000000..4f798407fbf9 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordIncomplete_node.txt @@ -0,0 +1,25 @@ +java.FILE + IMPORT_LIST + + CLASS + MODIFIER_LIST + + CLASS_KEYWORD + WHITE_SPACE + IDENTIFIER + TYPE_PARAMETER_LIST + + EXTENDS_LIST + + IMPLEMENTS_LIST + + WHITE_SPACE + LBRACE + WHITE_SPACE + MODIFIER_LIST + + RECORD + ERROR_ELEMENT + + WHITE_SPACE + RBRACE \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete.java b/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete.java new file mode 100644 index 000000000000..4045d60ec0b9 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete.java @@ -0,0 +1,5 @@ +class X { + void foo() { + var + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete.txt new file mode 100644 index 000000000000..03ed1eea0a46 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete.txt @@ -0,0 +1,44 @@ +PsiJavaFile:VarIncomplete.java + PsiImportList + + PsiClass:X + PsiModifierList: + + PsiKeyword:class('class') + PsiWhiteSpace(' ') + PsiIdentifier:X('X') + PsiTypeParameterList + + PsiReferenceList + + PsiReferenceList + + PsiWhiteSpace(' ') + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiMethod:foo + PsiModifierList: + + PsiTypeParameterList + + PsiTypeElement:void + PsiKeyword:void('void') + PsiWhiteSpace(' ') + PsiIdentifier:foo('foo') + PsiParameterList:() + PsiJavaToken:LPARENTH('(') + PsiJavaToken:RPARENTH(')') + PsiReferenceList + + PsiWhiteSpace(' ') + PsiCodeBlock + PsiJavaToken:LBRACE('{') + PsiWhiteSpace('\n ') + PsiDeclarationStatement + PsiKeyword:var('var') + PsiErrorElement:Identifier expected + + PsiWhiteSpace('\n ') + PsiJavaToken:RBRACE('}') + PsiWhiteSpace('\n') + PsiJavaToken:RBRACE('}') \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete_node.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete_node.txt new file mode 100644 index 000000000000..a83c2ac5ba16 --- /dev/null +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/VarIncomplete_node.txt @@ -0,0 +1,44 @@ +java.FILE + IMPORT_LIST + + CLASS + MODIFIER_LIST + + CLASS_KEYWORD + WHITE_SPACE + IDENTIFIER + TYPE_PARAMETER_LIST + + EXTENDS_LIST + + IMPLEMENTS_LIST + + WHITE_SPACE + LBRACE + WHITE_SPACE + METHOD + MODIFIER_LIST + + TYPE_PARAMETER_LIST + + TYPE + VOID_KEYWORD + WHITE_SPACE + IDENTIFIER + PARAMETER_LIST + LPARENTH + RPARENTH + THROWS_LIST + + WHITE_SPACE + CODE_BLOCK + LBRACE + WHITE_SPACE + DECLARATION_STATEMENT + VAR + ERROR_ELEMENT + + WHITE_SPACE + RBRACE + WHITE_SPACE + RBRACE \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0.txt b/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0.txt index c760fb4073b9..931fabc4265d 100644 --- a/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0.txt +++ b/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0.txt @@ -1,8 +1,5 @@ PsiJavaFile:ExprStatement0.java - PsiExpressionStatement - PsiReferenceExpression:var - PsiReferenceParameterList - - PsiIdentifier:var('var') - PsiErrorElement:';' expected + PsiDeclarationStatement + PsiKeyword:var('var') + PsiErrorElement:Identifier expected \ No newline at end of file diff --git a/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0_node.txt b/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0_node.txt index ee1954ab6895..609cfd45cef4 100644 --- a/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0_node.txt +++ b/java/java-tests/testData/psi/parser-partial/statements/ExprStatement0_node.txt @@ -1,8 +1,5 @@ test.java.file - EXPRESSION_STATEMENT - REFERENCE_EXPRESSION - REFERENCE_PARAMETER_LIST - - IDENTIFIER + DECLARATION_STATEMENT + VAR ERROR_ELEMENT \ No newline at end of file