diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java index c4c519c4a5a1..29326b853d2b 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/DeclarationParser.java @@ -408,7 +408,7 @@ public class DeclarationParser { return parseFieldOrLocalVariable(builder, declaration, declarationStart, context); } - private static boolean isRecordToken(PsiBuilder builder, IElementType tokenType) { + static boolean isRecordToken(PsiBuilder builder, IElementType tokenType) { return tokenType == JavaTokenType.IDENTIFIER && PsiKeyword.RECORD.equals(builder.getTokenText()) && builder.lookAhead(1) == JavaTokenType.IDENTIFIER && getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_14_PREVIEW); diff --git a/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java b/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java index df0b1316f75e..76ebf77a1e91 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/parser/FileParser.java @@ -86,7 +86,7 @@ public class FileParser { private static boolean stopImportListParsing(PsiBuilder b) { IElementType type = b.getTokenType(); - if (IMPORT_LIST_STOPPER_SET.contains(type)) return true; + if (IMPORT_LIST_STOPPER_SET.contains(type) || DeclarationParser.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-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java index 4333cc3bca72..dfeb60169a22 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java @@ -27,7 +27,9 @@ import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.codeStyle.PackageEntry; import com.intellij.psi.codeStyle.PackageEntryTable; import com.intellij.psi.codeStyle.modifier.CodeStyleSettingsModifier; +import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.ServiceContainerUtil; +import org.jetbrains.annotations.NotNull; public class OptimizeImportsTest extends OptimizeImportsTestCase { static final String BASE_PATH = PathManagerEx.getTestDataPath() + "/psi/optimizeImports"; @@ -91,6 +93,25 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase { myFixture.checkResult("class Foo {}"); } + @Override + protected @NotNull LightProjectDescriptor getProjectDescriptor() { + return JAVA_14; + } + + public void testNoStubPsiMismatchOnRecordInsideImportList() { + myFixture.enableInspections(new UnusedImportInspection()); + myFixture.configureByText("a.java", "import java.util.List;\n" + + "record foo.bar.Goo;\n" + + "import java.util.Collection;\n\n" + + "class Foo {}"); + myFixture.launchAction(myFixture.findSingleIntention("Optimize imports")); + + // whatever: main thing it didn't throw + myFixture.checkResult("record foo.bar.Goo;\n" + + "import java.util.Collection;\n\n" + + "class Foo {}"); + } + public void testPerFileImportSettings() { CodeStyle.dropTemporarySettings(getProject()); MockCodeStyleSettingsModifier modifier = new MockCodeStyleSettingsModifier(