IDEA-359853 update java parser tests

GitOrigin-RevId: 193dcd64366ee4cf583967ce77852830a21342de
This commit is contained in:
Max Medvedev
2025-04-01 00:38:44 +00:00
committed by intellij-monorepo-bot
parent 3884c82ddb
commit f89994558f
13 changed files with 94 additions and 151 deletions
@@ -4,8 +4,10 @@ package com.intellij.java.parser;
import com.intellij.PathJavaTestUtil;
import com.intellij.lang.Language;
import com.intellij.lang.LanguageExtension;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.parser.BasicJavaParserUtil;
import com.intellij.platform.backend.workspace.WorkspaceModelTopics;
import com.intellij.platform.syntax.psi.LanguageSyntaxDefinitions;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.DebugUtil;
@@ -14,7 +16,6 @@ import com.intellij.testFramework.TestDataFile;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.function.Consumer;
public abstract class AbstractBasicJavaParsingTestCase extends ParsingTestCase {
@@ -34,6 +35,7 @@ public abstract class AbstractBasicJavaParsingTestCase extends ParsingTestCase {
protected void setUp() throws Exception {
super.setUp();
getProject().registerService(WorkspaceModelTopics.class, new WorkspaceModelTopics());
addExplicit(LanguageSyntaxDefinitions.getINSTANCE(), JavaLanguage.INSTANCE, myConfigurator.getJavaSyntaxDefinition());
myConfigurator.setUp(this);
}
@@ -54,7 +56,7 @@ public abstract class AbstractBasicJavaParsingTestCase extends ParsingTestCase {
}
protected void doParserTest(Consumer<PsiBuilder> parser) {
protected void doParserTest(BasicJavaParserUtil.@NotNull ParserWrapper parser) {
String name = getTestName(false);
try {
doParserTest(loadFile(name + "." + myFileExt), parser);
@@ -78,7 +80,7 @@ public abstract class AbstractBasicJavaParsingTestCase extends ParsingTestCase {
DebugUtil.nodeTreeAsElementTypeToString(file.getNode(), !skipSpaces()).trim());
}
protected void doParserTest(String text, Consumer<PsiBuilder> parser) {
protected void doParserTest(String text, BasicJavaParserUtil.@NotNull ParserWrapper parser) {
String name = getTestName(false);
myFile = myConfigurator.createPsiFile(this, name, text, parser);
try {
@@ -2,16 +2,17 @@
package com.intellij.java.parser;
import com.intellij.lang.ParserDefinition;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.parser.BasicJavaParserUtil;
import com.intellij.platform.syntax.psi.LanguageSyntaxDefinition;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
public interface AbstractBasicJavaParsingTestConfigurator {
ParserDefinition getJavaParserDefinition();
LanguageSyntaxDefinition getJavaSyntaxDefinition();
void setUp(@NotNull AbstractBasicJavaParsingTestCase thinJavaParsingTestCase);
void configure(@NotNull PsiFile file);
@@ -20,7 +21,7 @@ public interface AbstractBasicJavaParsingTestConfigurator {
PsiFile createPsiFile(@NotNull AbstractBasicJavaParsingTestCase thinJavaParsingTestCase,
@NotNull String name,
@NotNull String text,
@NotNull Consumer<PsiBuilder> parser);
@NotNull BasicJavaParserUtil.ParserWrapper parser);
boolean checkPsi();
@@ -2,42 +2,22 @@
package com.intellij.java.parser;
import com.intellij.JavaTestUtil;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LanguageASTFactory;
import com.intellij.lang.ParserDefinition;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.JavaParserDefinition;
import com.intellij.lang.java.parser.JavaParserUtil;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.roots.impl.LanguageLevelProjectExtensionImpl;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.SingleRootFileViewProvider;
import com.intellij.psi.impl.source.PsiJavaFileImpl;
import com.intellij.psi.impl.source.tree.FileElement;
import com.intellij.psi.impl.source.tree.JavaASTFactory;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.util.PsiUtil;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.testFramework.ParsingTestCase;
import com.intellij.platform.backend.workspace.WorkspaceModelTopics;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.function.Consumer;
public abstract class JavaParsingTestCase extends ParsingTestCase {
private LanguageLevel myLanguageLevel;
@SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors")
public JavaParsingTestCase(String dataPath) {
this(dataPath, "java", new JavaParserDefinition());
}
public JavaParsingTestCase(String dataPath, String fileExt, ParserDefinition... parserDefinitions) {
super("psi/" + dataPath, fileExt, parserDefinitions);
}
@@ -61,76 +41,4 @@ public abstract class JavaParsingTestCase extends ParsingTestCase {
protected void setLanguageLevel(@NotNull LanguageLevel languageLevel) {
myLanguageLevel = languageLevel;
}
protected void doParserTest(Consumer<PsiBuilder> parser) {
String name = getTestName(false);
try {
doParserTest(loadFile(name + "." + myFileExt), parser);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
protected void doParserTest(String text, Consumer<PsiBuilder> parser) {
String name = getTestName(false);
myFile = createPsiFile(name, text, parser);
myFile.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, myLanguageLevel);
try {
checkResult(name, myFile);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
private static IFileElementType TEST_FILE_ELEMENT_TYPE = null;
private static Consumer<PsiBuilder> TEST_PARSER;
private PsiFile createPsiFile(String name, String text, Consumer<PsiBuilder> parser) {
if (TEST_FILE_ELEMENT_TYPE == null) {
TEST_FILE_ELEMENT_TYPE = new MyIFileElementType();
}
TEST_PARSER = parser;
LightVirtualFile virtualFile = new LightVirtualFile(name + '.' + myFileExt, JavaFileType.INSTANCE, text, -1);
FileViewProvider viewProvider = new SingleRootFileViewProvider(PsiManager.getInstance(getProject()), virtualFile, true);
return new PsiJavaFileImpl(viewProvider) {
@NotNull
@Override
protected FileElement createFileElement(@NotNull CharSequence text) {
return new FileElement(TEST_FILE_ELEMENT_TYPE, text);
}
};
}
private static PsiBuilder createBuilder(ASTNode chameleon) {
PsiBuilder builder = JavaParserUtil.createBuilder(chameleon);
builder.setDebugMode(true);
return builder;
}
private static class MyIFileElementType extends IFileElementType {
MyIFileElementType() {
super("test.java.file", JavaLanguage.INSTANCE);
}
@Override
public ASTNode parseContents(@NotNull ASTNode chameleon) {
PsiBuilder builder = createBuilder(chameleon);
PsiBuilder.Marker root = builder.mark();
TEST_PARSER.accept(builder);
if (!builder.eof()) {
PsiBuilder.Marker unparsed = builder.mark();
while (!builder.eof()) builder.advanceLexer();
unparsed.error("Unparsed tokens");
}
root.done(this);
ASTNode rootNode = builder.getTreeBuilt();
return rootNode.getFirstChildNode();
}
}
}
@@ -3,15 +3,18 @@ package com.intellij.java.parser;
import com.intellij.JavaTestUtil;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LanguageASTFactory;
import com.intellij.lang.ParserDefinition;
import com.intellij.lang.PsiBuilder;
import com.intellij.java.frontback.psi.impl.syntax.JavaSyntaxDefinitionExtension;
import com.intellij.lang.*;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.JavaParserDefinition;
import com.intellij.lang.java.parser.BasicJavaParserUtil;
import com.intellij.lang.java.parser.JavaParserUtil;
import com.intellij.lang.java.syntax.JavaElementTypeConverterExtension;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.roots.impl.LanguageLevelProjectExtensionImpl;
import com.intellij.platform.syntax.SyntaxElementType;
import com.intellij.platform.syntax.parser.SyntaxTreeBuilder;
import com.intellij.platform.syntax.psi.*;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiFile;
@@ -23,10 +26,9 @@ import com.intellij.psi.impl.source.tree.JavaASTFactory;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.util.PsiUtil;
import com.intellij.testFramework.LightVirtualFile;
import kotlin.Pair;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
public class JavaParsingTestConfigurator implements AbstractBasicJavaParsingTestConfigurator {
private LanguageLevel myLanguageLevel = JavaTestUtil.getMaxRegisteredLanguageLevel();
@@ -35,28 +37,42 @@ public class JavaParsingTestConfigurator implements AbstractBasicJavaParsingTest
return new JavaParserDefinition();
}
@Override
public LanguageSyntaxDefinition getJavaSyntaxDefinition() {
return new JavaSyntaxDefinitionExtension();
}
@Override
public void setUp(@NotNull AbstractBasicJavaParsingTestCase thinJavaParsingTestCase) {
thinJavaParsingTestCase.getProject()
.registerService(LanguageLevelProjectExtension.class, new LanguageLevelProjectExtensionImpl(thinJavaParsingTestCase.getProject()));
thinJavaParsingTestCase.addExplicit(LanguageASTFactory.INSTANCE, JavaLanguage.INSTANCE, new JavaASTFactory());
JavaLanguage language = JavaLanguage.INSTANCE;
LanguageASTFactory languageASTFactory = LanguageASTFactory.INSTANCE;
thinJavaParsingTestCase.addExplicit(languageASTFactory, language, new JavaASTFactory());
LanguageExtension<ElementTypeConverterFactory> elementTypeConverters = ElementTypeConverters.getInstance();
thinJavaParsingTestCase.addExplicit(elementTypeConverters, language, new JavaElementTypeConverterExtension());
thinJavaParsingTestCase.addExplicit(elementTypeConverters, language, new JavaTestElementTypeConverterExtension());
thinJavaParsingTestCase.clearCachesOfLanguageExtension(language, languageASTFactory);
thinJavaParsingTestCase.clearCachesOfLanguageExtension(language, elementTypeConverters);
}
@Override
public void configure(@NotNull PsiFile file) {
file.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, myLanguageLevel);
LANGUAGE_LEVEL = myLanguageLevel;
}
private static IFileElementType TEST_FILE_ELEMENT_TYPE = null;
private static Consumer<PsiBuilder> TEST_PARSER;
private static final MyIFileElementType myTestFileElementType = new MyIFileElementType();
private static final SyntaxElementType mySyntaxElementType = new SyntaxElementType("test.java.file");
private static BasicJavaParserUtil.ParserWrapper TEST_PARSER;
private static LanguageLevel LANGUAGE_LEVEL;
@Override
public @NotNull PsiFile createPsiFile(@NotNull AbstractBasicJavaParsingTestCase thinJavaParsingTestCase, @NotNull String name, @NotNull String text, @NotNull Consumer<PsiBuilder> parser) {
if (TEST_FILE_ELEMENT_TYPE == null) {
TEST_FILE_ELEMENT_TYPE = new MyIFileElementType();
}
public @NotNull PsiFile createPsiFile(@NotNull AbstractBasicJavaParsingTestCase thinJavaParsingTestCase, @NotNull String name, @NotNull String text, BasicJavaParserUtil.@NotNull ParserWrapper parser) {
TEST_PARSER = parser;
LightVirtualFile virtualFile = new LightVirtualFile(name + '.' + "java", JavaFileType.INSTANCE, text, -1);
@@ -66,7 +82,7 @@ public class JavaParsingTestConfigurator implements AbstractBasicJavaParsingTest
@NotNull
@Override
protected FileElement createFileElement(@NotNull CharSequence text) {
return new FileElement(TEST_FILE_ELEMENT_TYPE, text);
return new FileElement(myTestFileElementType, text);
}
};
configure(file);
@@ -79,12 +95,12 @@ public class JavaParsingTestConfigurator implements AbstractBasicJavaParsingTest
}
@Override
public void setLanguageLevel(@NotNull LanguageLevel level) {
public void setLanguageLevel(@NotNull com.intellij.pom.java.LanguageLevel level) {
myLanguageLevel = level;
}
private static PsiBuilder createBuilder(ASTNode chameleon) {
PsiBuilder builder = JavaParserUtil.createBuilder(chameleon);
private static PsiSyntaxBuilder createBuilder(ASTNode chameleon) {
PsiSyntaxBuilder builder = JavaParserUtil.createSyntaxBuilder(chameleon).getFirst();
builder.setDebugMode(true);
return builder;
}
@@ -96,19 +112,29 @@ public class JavaParsingTestConfigurator implements AbstractBasicJavaParsingTest
@Override
public ASTNode parseContents(@NotNull ASTNode chameleon) {
PsiBuilder builder = createBuilder(chameleon);
PsiBuilder.Marker root = builder.mark();
TEST_PARSER.accept(builder);
PsiSyntaxBuilder psiBuilder = createBuilder(chameleon);
SyntaxTreeBuilder builder = psiBuilder.getSyntaxTreeBuilder();
SyntaxTreeBuilder.Marker root = builder.mark();
TEST_PARSER.parse(builder, LANGUAGE_LEVEL);
if (!builder.eof()) {
PsiBuilder.Marker unparsed = builder.mark();
SyntaxTreeBuilder.@NotNull Marker unparsed = builder.mark();
while (!builder.eof()) builder.advanceLexer();
unparsed.error("Unparsed tokens");
}
root.done(this);
root.done(mySyntaxElementType);
ASTNode rootNode = builder.getTreeBuilt();
ASTNode rootNode = psiBuilder.getTreeBuilt();
return rootNode.getFirstChildNode();
}
}
private static class JavaTestElementTypeConverterExtension implements ElementTypeConverterFactory {
public static final @NotNull ElementTypeConverter CONVERTER =
ElementTypeConverterKt.elementTypeConverterOf(new Pair<>(mySyntaxElementType, myTestFileElementType));
@Override
public @NotNull ElementTypeConverter getElementTypeConverter() {
return CONVERTER;
}
}
}
@@ -16,7 +16,7 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
public class AnnotationParserTest extends AbstractBasicAnnotationParserTest {
public AnnotationParserTest() {
@@ -25,6 +25,6 @@ public class AnnotationParserTest extends AbstractBasicAnnotationParserTest {
@Override
protected void doParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getDeclarationParser().parseAnnotations(builder));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getDeclarationParser().parseAnnotations(builder));
}
}
@@ -2,7 +2,7 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
public class DeclarationParserTest extends AbstractBasicDeclarationParserTest {
@@ -12,6 +12,6 @@ public class DeclarationParserTest extends AbstractBasicDeclarationParserTest {
@Override
protected void doParserTest(String text, boolean isAnnotation, boolean isEnum) {
doParserTest(text, builder -> JavaParser.INSTANCE.getDeclarationParser().parseClassBodyWithBraces(builder, isAnnotation, isEnum));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getDeclarationParser().parseClassBodyWithBraces(builder, isAnnotation, isEnum));
}
}
@@ -2,7 +2,7 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
public class ExpressionParserTest extends AbstractBasicExpressionParserTest {
public ExpressionParserTest() {
@@ -11,11 +11,11 @@ public class ExpressionParserTest extends AbstractBasicExpressionParserTest {
@Override
protected void doParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getExpressionParser().parse(builder));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getExpressionParser().parse(builder));
}
@Override
protected void doParserTest() {
doParserTest(builder -> JavaParser.INSTANCE.getExpressionParser().parse(builder));
doParserTest((builder, languageLevel) -> new JavaParser(languageLevel).getExpressionParser().parse(builder));
}
}
@@ -16,7 +16,7 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
public class FileParserTest extends AbstractBasicFileParserTest {
public FileParserTest() {
@@ -25,6 +25,6 @@ public class FileParserTest extends AbstractBasicFileParserTest {
@Override
protected void doParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getFileParser().parse(builder));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getFileParser().parse(builder));
}
}
@@ -16,7 +16,7 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
public class ModuleParserTest extends AbstractBasicModuleParserTest {
public ModuleParserTest() {
@@ -25,6 +25,6 @@ public class ModuleParserTest extends AbstractBasicModuleParserTest {
@Override
protected void doParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getFileParser().parse(builder));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getFileParser().parse(builder));
}
}
@@ -2,8 +2,8 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.lang.java.parser.PatternParser;
import com.intellij.java.syntax.parser.JavaParser;
import com.intellij.java.syntax.parser.PatternParser;
public class PatternParserTest extends AbstractBasicPatternParserTest {
public PatternParserTest() {
@@ -12,8 +12,8 @@ public class PatternParserTest extends AbstractBasicPatternParserTest {
@Override
protected void doParserTest(String text) {
doParserTest(text, builder -> {
PatternParser parser = JavaParser.INSTANCE.getPatternParser();
doParserTest(text, (builder, languageLevel) -> {
PatternParser parser = new JavaParser(languageLevel).getPatternParser();
if (!parser.isPattern(builder)) {
throw new IllegalArgumentException("Pattern is not expected");
}
@@ -2,8 +2,8 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.BasicReferenceParser;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
import com.intellij.java.syntax.parser.ReferenceParser;
public class ReferenceParserTest extends AbstractBasicReferenceParserTest {
public ReferenceParserTest() {
@@ -12,17 +12,17 @@ public class ReferenceParserTest extends AbstractBasicReferenceParserTest {
@Override
protected void doRefParserTest(String text, boolean incomplete) {
doParserTest(text, builder -> JavaParser.INSTANCE.getReferenceParser().parseJavaCodeReference(builder, incomplete, false, false, false));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getReferenceParser().parseJavaCodeReference(builder, incomplete, false, false, false));
}
@Override
protected void doTypeParserTest(String text) {
int flags = BasicReferenceParser.ELLIPSIS | BasicReferenceParser.DIAMONDS | BasicReferenceParser.DISJUNCTIONS;
doParserTest(text, builder -> JavaParser.INSTANCE.getReferenceParser().parseType(builder, flags));
int flags = ReferenceParser.ELLIPSIS | ReferenceParser.DIAMONDS | ReferenceParser.DISJUNCTIONS;
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getReferenceParser().parseType(builder, flags));
}
@Override
protected void doTypeParamsParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getReferenceParser().parseTypeParameters(builder));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getReferenceParser().parseTypeParameters(builder));
}
}
@@ -2,7 +2,7 @@
package com.intellij.java.parser.partial;
import com.intellij.java.parser.JavaParsingTestConfigurator;
import com.intellij.lang.java.parser.JavaParser;
import com.intellij.java.syntax.parser.JavaParser;
public class StatementParserTest extends AbstractBasicStatementParserTest {
public StatementParserTest() {
@@ -11,11 +11,11 @@ public class StatementParserTest extends AbstractBasicStatementParserTest {
@Override
protected void doBlockParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getStatementParser().parseCodeBlockDeep(builder, true));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getStatementParser().parseCodeBlockDeep(builder, true));
}
@Override
protected void doParserTest(String text) {
doParserTest(text, builder -> JavaParser.INSTANCE.getStatementParser().parseStatements(builder));
doParserTest(text, (builder, languageLevel) -> new JavaParser(languageLevel).getStatementParser().parseStatements(builder));
}
}
@@ -46,6 +46,7 @@ import com.intellij.util.SystemProperties;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.pico.DefaultPicoContainer;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.picocontainer.ComponentAdapter;
@@ -156,8 +157,13 @@ public abstract class ParsingTestCase extends UsefulTestCase {
return definition;
}
});
LanguageParserDefinitions.INSTANCE.clearCache(language);
disposeOnTearDown(() -> LanguageParserDefinitions.INSTANCE.clearCache(language));
clearCachesOfLanguageExtension(language, LanguageParserDefinitions.INSTANCE);
}
@ApiStatus.Internal
public final void clearCachesOfLanguageExtension(Language language, LanguageExtension<?> instance) {
instance.clearCache(language);
disposeOnTearDown(() -> instance.clearCache(language));
}
public void configureFromParserDefinition(@NotNull ParserDefinition definition, String extension) {