[java] IDEA-365317 integrate JavaElementType

GitOrigin-RevId: c383a28a2aa8a36ea6f80dce165e443ea28a8ce5
This commit is contained in:
Mikhail Pyltsin
2025-11-20 12:44:52 +00:00
committed by intellij-monorepo-bot
parent de186d1625
commit e34ee2c23e
2 changed files with 263 additions and 394 deletions
@@ -1,50 +1,19 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.psi.impl.source;
import com.intellij.java.syntax.element.JavaSyntaxTokenType;
import com.intellij.java.syntax.lexer.JavaLexer;
import com.intellij.java.syntax.parser.JavaParser;
import com.intellij.java.syntax.parser.ReferenceParser;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.lang.LighterASTNode;
import com.intellij.lang.LighterLazyParseableNode;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.parser.BasicJavaParserUtil;
import com.intellij.lang.java.parser.PsiSyntaxBuilderWithLanguageLevel;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.platform.syntax.lexer.Lexer;
import com.intellij.platform.syntax.lexer.TokenList;
import com.intellij.platform.syntax.parser.SyntaxTreeBuilder;
import com.intellij.platform.syntax.psi.ParsingDiagnostics;
import com.intellij.platform.syntax.psi.PsiSyntaxBuilder;
import com.intellij.platform.syntax.util.parser.SyntaxBuilderUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.tree.CompositePsiElement;
import com.intellij.psi.impl.source.tree.ICodeFragmentElementType;
import com.intellij.psi.tree.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.psi.tree.java.IJavaElementType;
import com.intellij.util.diff.FlyweightCapableTreeStructure;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* @deprecated Use the new Java syntax library instead.
* See {@link com.intellij.java.syntax.parser.JavaParser}
* This class is planned to be removed.
* As a temporary solution, use {@link com.intellij.psi.impl.java.stubs.JavaStubElementTypes} and
* {@link com.intellij.psi.impl.source.tree.JavaElementType}.
* See {@link com.intellij.java.syntax.parser.JavaParser}
* This class is planned to be removed.
* As a temporary solution, use {@link com.intellij.psi.impl.java.stubs.JavaStubElementTypes} and
* {@link com.intellij.psi.impl.source.tree.JavaElementType}.
*/
@Deprecated
@ApiStatus.ScheduledForRemoval
@@ -233,217 +202,4 @@ public interface BasicJavaElementType {
BASIC_ENUM_CONSTANT, BASIC_ENUM_CONSTANT_INITIALIZER, BASIC_FIELD,
BASIC_METHOD, BASIC_RECORD_COMPONENT,
BASIC_TYPE_PARAMETER);
/**
* @deprecated Use the new Java syntax library instead.
* See {@link com.intellij.java.syntax.parser.JavaParser}
* This class is planned to be removed.
* As a temporary solution, use {@link com.intellij.psi.impl.source.tree.JavaElementType.JavaCompositeElementType}.
*/
@Deprecated
@ApiStatus.ScheduledForRemoval
class JavaCompositeElementType extends IJavaElementType implements ICompositeElementType, ParentProviderElementType {
private final Supplier<? extends ASTNode> myConstructor;
private final Set<IElementType> myParentElementTypes;
public JavaCompositeElementType(@NonNls @NotNull String debugName,
@NotNull Supplier<? extends ASTNode> constructor,
@NotNull IElementType parentElementType) {
this(debugName, constructor, false, parentElementType);
}
public JavaCompositeElementType(@NonNls @NotNull String debugName,
@NotNull Supplier<? extends ASTNode> constructor,
boolean leftBound,
@NotNull IElementType parentElementType) {
super(debugName, leftBound);
myConstructor = constructor;
myParentElementTypes = Collections.singleton(parentElementType);
}
@Override
public @NotNull ASTNode createCompositeNode() {
return myConstructor.get();
}
@Override
public @NotNull Set<IElementType> getParents() {
return myParentElementTypes;
}
}
@ApiStatus.Internal
final class JavaDummyElementType extends ILazyParseableElementType implements ICompositeElementType, ParentProviderElementType {
private static final Set<IElementType> PARENT_ELEMENT_TYPES = Collections.singleton(BASIC_DUMMY_ELEMENT);
public JavaDummyElementType() {
super("DUMMY_ELEMENT", JavaLanguage.INSTANCE);
}
@Override
public @NotNull ASTNode createCompositeNode() {
return new CompositePsiElement(this) {
};
}
@Override
public @Nullable ASTNode parseContents(final @NotNull ASTNode chameleon) {
assert chameleon instanceof BasicJavaDummyElement : chameleon;
final BasicJavaDummyElement dummyElement = (BasicJavaDummyElement)chameleon;
return BasicJavaParserUtil.parseFragment(chameleon, dummyElement.getParser(), dummyElement.consumeAll(),
dummyElement.getLanguageLevel()
);
}
@Override
public @NotNull Set<IElementType> getParents() {
return PARENT_ELEMENT_TYPES;
}
}
abstract class FrontBackICodeBlockElementType extends IErrorCounterReparseableElementType
implements ICompositeElementType, ILightLazyParseableElementType, ParentProviderElementType {
private static final Set<IElementType> PARENT_ELEMENT_TYPES = Collections.singleton(BASIC_CODE_BLOCK);
private final Function<PsiElement, LanguageLevel> languageLevelFunction;
private final Function<PsiFile, TokenList> psiAsLexer;
public FrontBackICodeBlockElementType(@NotNull Function<PsiElement, LanguageLevel> function,
@NotNull Function<PsiFile, TokenList> lexer) {
super("CODE_BLOCK", JavaLanguage.INSTANCE);
languageLevelFunction = function;
psiAsLexer = lexer;
}
@Override
public ASTNode parseContents(final @NotNull ASTNode chameleon) {
PsiSyntaxBuilderWithLanguageLevel
builderAndLevel = BasicJavaParserUtil.createSyntaxBuilder(chameleon, languageLevelFunction, psiAsLexer);
PsiSyntaxBuilder psiSyntaxBuilder = builderAndLevel.getBuilder();
LanguageLevel level = builderAndLevel.getLanguageLevel();
long startTime = System.nanoTime();
SyntaxTreeBuilder builder = psiSyntaxBuilder.getSyntaxTreeBuilder();
new JavaParser(level).getStatementParser().parseCodeBlockDeep(builder, true);
ASTNode node = psiSyntaxBuilder.getTreeBuilt().getFirstChildNode();
ParsingDiagnostics.registerParse(builder, getLanguage(), System.nanoTime() - startTime);
return node;
}
@Override
public @NotNull FlyweightCapableTreeStructure<LighterASTNode> parseContents(final @NotNull LighterLazyParseableNode chameleon) {
PsiSyntaxBuilderWithLanguageLevel builderAndLevel = BasicJavaParserUtil.createSyntaxBuilder(chameleon, languageLevelFunction);
PsiSyntaxBuilder psiSyntaxBuilder = builderAndLevel.getBuilder();
LanguageLevel level = builderAndLevel.getLanguageLevel();
long startTime = System.nanoTime();
SyntaxTreeBuilder builder = psiSyntaxBuilder.getSyntaxTreeBuilder();
new JavaParser(level).getStatementParser().parseCodeBlockDeep(builder, true);
FlyweightCapableTreeStructure<LighterASTNode> tree = psiSyntaxBuilder.getLightTree();
ParsingDiagnostics.registerParse(builder, getLanguage(), System.nanoTime() - startTime);
return tree;
}
@Override
public int getErrorsCount(final CharSequence seq, Language fileLanguage, final Project project) {
Lexer lexer = new JavaLexer(LanguageLevel.HIGHEST);
boolean hasProperBraceBalance = SyntaxBuilderUtil.hasProperBraceBalance(
seq, lexer, JavaSyntaxTokenType.LBRACE, JavaSyntaxTokenType.RBRACE,
() -> ProgressManager.checkCanceled()
);
return hasProperBraceBalance ? NO_ERRORS : FATAL_ERROR;
}
@Override
public boolean reuseCollapsedTokens() {
return true;
}
@Override
public @NotNull Set<IElementType> getParents() {
return PARENT_ELEMENT_TYPES;
}
}
class FrontBackTypeTextElementType extends ICodeFragmentElementType implements ParentProviderElementType {
private final int myFlags;
private final Set<IElementType> myParentElementTypes;
public FrontBackTypeTextElementType(@NonNls String debugName, int flags, @NotNull IElementType parentElementType) {
super(debugName, JavaLanguage.INSTANCE);
myFlags = flags;
myParentElementTypes = Collections.singleton(parentElementType);
}
private final BasicJavaParserUtil.ParserWrapper myParser = new BasicJavaParserUtil.ParserWrapper() {
@Override
public void parse(@NotNull SyntaxTreeBuilder builder, @NotNull LanguageLevel languageLevel) {
int flags = ReferenceParser.EAT_LAST_DOT | ReferenceParser.ELLIPSIS | ReferenceParser.WILDCARD | myFlags;
new JavaParser(languageLevel).getReferenceParser().parseType(builder, flags);
}
};
@Override
public @Nullable ASTNode parseContents(final @NotNull ASTNode chameleon) {
return BasicJavaParserUtil.parseFragmentWithHighestLanguageLevel(chameleon, myParser, JavaLexer::new);
}
@Override
public @NotNull Set<IElementType> getParents() {
return myParentElementTypes;
}
}
class StatementThinCodeFragmentElementType extends ThinCodeFragmentElementType {
public StatementThinCodeFragmentElementType() {
super("STATEMENTS", (builder, languageLevel) -> {
new JavaParser(languageLevel).getStatementParser().parseStatements(builder);
}, BASIC_STATEMENTS);
}
}
class MemberThinCodeFragmentElementType extends ThinCodeFragmentElementType {
public MemberThinCodeFragmentElementType() {
super("MEMBERS", (builder, languageLevel) -> {
new JavaParser(languageLevel).getDeclarationParser().parseClassBodyDeclarations(builder, false);
}, BASIC_MEMBERS);
}
}
class ExpressionThinCodeFragmentElementType extends ThinCodeFragmentElementType {
public ExpressionThinCodeFragmentElementType() {
super("EXPRESSION_TEXT", (builder, languageLevel) -> {
new JavaParser(languageLevel).getExpressionParser().parse(builder);
}, BASIC_EXPRESSION_TEXT);
}
}
class ReferenceThinCodeFragmentElementType extends ThinCodeFragmentElementType {
public ReferenceThinCodeFragmentElementType() {
super("REFERENCE_TEXT", (builder, languageLevel) -> {
new JavaParser(languageLevel).getReferenceParser().parseJavaCodeReference(builder, false, true, false, false);
}, BASIC_REFERENCE_TEXT);
}
}
class ThinCodeFragmentElementType extends ICodeFragmentElementType implements ParentProviderElementType {
private final BasicJavaParserUtil.ParserWrapper myParser;
private final Set<IElementType> parentElementTypes;
private ThinCodeFragmentElementType(@NotNull String debugName,
@NotNull BasicJavaParserUtil.ParserWrapper parser,
@NotNull IElementType parentElementType) {
super(debugName, JavaLanguage.INSTANCE);
myParser = parser;
this.parentElementTypes = Collections.singleton(parentElementType);
}
@Override
public @Nullable ASTNode parseContents(final @NotNull ASTNode chameleon) {
return BasicJavaParserUtil.parseFragmentWithHighestLanguageLevel(chameleon, myParser, JavaLexer::new);
}
@Override
public @NotNull Set<IElementType> getParents() {
return parentElementTypes;
}
}
}