mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-09 20:42:52 +07:00
[java] IDEA-365317 integrate JavaElementType
GitOrigin-RevId: c383a28a2aa8a36ea6f80dce165e443ea28a8ce5
This commit is contained in:
committed by
intellij-monorepo-bot
parent
de186d1625
commit
e34ee2c23e
+6
-250
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user