[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;
}
}
}
@@ -1,37 +1,65 @@
// Copyright 2000-2024 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.tree;
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.JavaParserUtil;
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.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.source.*;
import com.intellij.psi.impl.source.tree.java.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ILazyParseableElementType;
import com.intellij.psi.tree.*;
import com.intellij.psi.tree.java.IJavaElementType;
import com.intellij.psi.util.PsiUtil;
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.function.Function;
import java.util.function.Supplier;
import static com.intellij.psi.impl.source.BasicJavaElementType.*;
/**
* @see com.intellij.java.syntax.element.JavaSyntaxElementType
*/
public interface JavaElementType {
class JavaCompositeElementType extends BasicJavaElementType.JavaCompositeElementType {
public JavaCompositeElementType(@NotNull String debugName,
@NotNull Supplier<? extends ASTNode> constructor,
@NotNull IElementType parentElementType) {
super(debugName, constructor, parentElementType);
class JavaCompositeElementType extends IJavaElementType implements ICompositeElementType {
private final Supplier<? extends ASTNode> myConstructor;
public JavaCompositeElementType(@NonNls @NotNull String debugName,
@NotNull Supplier<? extends ASTNode> constructor) {
this(debugName, constructor, false);
}
public JavaCompositeElementType(@NotNull String debugName,
public JavaCompositeElementType(@NonNls @NotNull String debugName,
@NotNull Supplier<? extends ASTNode> constructor,
boolean leftBound,
@NotNull IElementType parentElementType) {
super(debugName, constructor, leftBound, parentElementType);
boolean leftBound) {
super(debugName, leftBound);
myConstructor = constructor;
}
@Override
public @NotNull ASTNode createCompositeNode() {
return myConstructor.get();
}
}
@@ -76,148 +104,87 @@ public interface JavaElementType {
IElementType PACKAGE_STATEMENT = JavaStubElementTypes.PACKAGE_STATEMENT;
IElementType IMPORT_STATIC_REFERENCE =
new JavaCompositeElementType("IMPORT_STATIC_REFERENCE", () -> new PsiImportStaticReferenceElementImpl(),
BASIC_IMPORT_STATIC_REFERENCE);
IElementType TYPE = new JavaCompositeElementType("TYPE", () -> new PsiTypeElementImpl(), BASIC_TYPE);
new JavaCompositeElementType("IMPORT_STATIC_REFERENCE", () -> new PsiImportStaticReferenceElementImpl());
IElementType TYPE = new JavaCompositeElementType("TYPE", () -> new PsiTypeElementImpl());
IElementType DIAMOND_TYPE =
new JavaCompositeElementType("DIAMOND_TYPE", () -> new PsiDiamondTypeElementImpl(), BASIC_DIAMOND_TYPE);
new JavaCompositeElementType("DIAMOND_TYPE", () -> new PsiDiamondTypeElementImpl());
IElementType REFERENCE_PARAMETER_LIST =
new JavaCompositeElementType("REFERENCE_PARAMETER_LIST", () -> new PsiReferenceParameterListImpl(), true,
BASIC_REFERENCE_PARAMETER_LIST);
IElementType JAVA_CODE_REFERENCE = new JavaCompositeElementType("JAVA_CODE_REFERENCE", () -> new PsiJavaCodeReferenceElementImpl(),
BASIC_JAVA_CODE_REFERENCE);
IElementType LOCAL_VARIABLE = new JavaCompositeElementType("LOCAL_VARIABLE", () -> new PsiLocalVariableImpl(),
BASIC_LOCAL_VARIABLE);
IElementType REFERENCE_EXPRESSION = new JavaCompositeElementType("REFERENCE_EXPRESSION", () -> new PsiReferenceExpressionImpl(),
BASIC_REFERENCE_EXPRESSION);
IElementType THIS_EXPRESSION = new JavaCompositeElementType("THIS_EXPRESSION", () -> new PsiThisExpressionImpl(),
BASIC_THIS_EXPRESSION);
IElementType SUPER_EXPRESSION = new JavaCompositeElementType("SUPER_EXPRESSION", () -> new PsiSuperExpressionImpl(),
BASIC_SUPER_EXPRESSION);
IElementType PARENTH_EXPRESSION = new JavaCompositeElementType("PARENTH_EXPRESSION", () -> new PsiParenthesizedExpressionImpl(),
BASIC_PARENTH_EXPRESSION);
IElementType METHOD_CALL_EXPRESSION = new JavaCompositeElementType("METHOD_CALL_EXPRESSION", () -> new PsiMethodCallExpressionImpl(),
BASIC_METHOD_CALL_EXPRESSION);
IElementType TYPE_CAST_EXPRESSION = new JavaCompositeElementType("TYPE_CAST_EXPRESSION", () -> new PsiTypeCastExpressionImpl(),
BASIC_TYPE_CAST_EXPRESSION);
IElementType PREFIX_EXPRESSION = new JavaCompositeElementType("PREFIX_EXPRESSION", () -> new PsiPrefixExpressionImpl(),
BASIC_PREFIX_EXPRESSION);
IElementType POSTFIX_EXPRESSION = new JavaCompositeElementType("POSTFIX_EXPRESSION", () -> new PsiPostfixExpressionImpl(),
BASIC_POSTFIX_EXPRESSION);
IElementType BINARY_EXPRESSION = new JavaCompositeElementType("BINARY_EXPRESSION", () -> new PsiBinaryExpressionImpl(),
BASIC_BINARY_EXPRESSION);
IElementType POLYADIC_EXPRESSION = new JavaCompositeElementType("POLYADIC_EXPRESSION", () -> new PsiPolyadicExpressionImpl(),
BASIC_POLYADIC_EXPRESSION);
IElementType CONDITIONAL_EXPRESSION = new JavaCompositeElementType("CONDITIONAL_EXPRESSION", () -> new PsiConditionalExpressionImpl(),
BASIC_CONDITIONAL_EXPRESSION);
IElementType ASSIGNMENT_EXPRESSION = new JavaCompositeElementType("ASSIGNMENT_EXPRESSION", () -> new PsiAssignmentExpressionImpl(),
BASIC_ASSIGNMENT_EXPRESSION);
IElementType NEW_EXPRESSION = new JavaCompositeElementType("NEW_EXPRESSION", () -> new PsiNewExpressionImpl(),
BASIC_NEW_EXPRESSION);
IElementType ARRAY_ACCESS_EXPRESSION = new JavaCompositeElementType("ARRAY_ACCESS_EXPRESSION", () -> new PsiArrayAccessExpressionImpl(),
BASIC_ARRAY_ACCESS_EXPRESSION);
new JavaCompositeElementType("REFERENCE_PARAMETER_LIST", () -> new PsiReferenceParameterListImpl(), true);
IElementType JAVA_CODE_REFERENCE = new JavaCompositeElementType("JAVA_CODE_REFERENCE", () -> new PsiJavaCodeReferenceElementImpl());
IElementType LOCAL_VARIABLE = new JavaCompositeElementType("LOCAL_VARIABLE", () -> new PsiLocalVariableImpl());
IElementType REFERENCE_EXPRESSION = new JavaCompositeElementType("REFERENCE_EXPRESSION", () -> new PsiReferenceExpressionImpl());
IElementType THIS_EXPRESSION = new JavaCompositeElementType("THIS_EXPRESSION", () -> new PsiThisExpressionImpl());
IElementType SUPER_EXPRESSION = new JavaCompositeElementType("SUPER_EXPRESSION", () -> new PsiSuperExpressionImpl());
IElementType PARENTH_EXPRESSION = new JavaCompositeElementType("PARENTH_EXPRESSION", () -> new PsiParenthesizedExpressionImpl());
IElementType METHOD_CALL_EXPRESSION = new JavaCompositeElementType("METHOD_CALL_EXPRESSION", () -> new PsiMethodCallExpressionImpl());
IElementType TYPE_CAST_EXPRESSION = new JavaCompositeElementType("TYPE_CAST_EXPRESSION", () -> new PsiTypeCastExpressionImpl());
IElementType PREFIX_EXPRESSION = new JavaCompositeElementType("PREFIX_EXPRESSION", () -> new PsiPrefixExpressionImpl());
IElementType POSTFIX_EXPRESSION = new JavaCompositeElementType("POSTFIX_EXPRESSION", () -> new PsiPostfixExpressionImpl());
IElementType BINARY_EXPRESSION = new JavaCompositeElementType("BINARY_EXPRESSION", () -> new PsiBinaryExpressionImpl());
IElementType POLYADIC_EXPRESSION = new JavaCompositeElementType("POLYADIC_EXPRESSION", () -> new PsiPolyadicExpressionImpl());
IElementType CONDITIONAL_EXPRESSION = new JavaCompositeElementType("CONDITIONAL_EXPRESSION", () -> new PsiConditionalExpressionImpl());
IElementType ASSIGNMENT_EXPRESSION = new JavaCompositeElementType("ASSIGNMENT_EXPRESSION", () -> new PsiAssignmentExpressionImpl());
IElementType NEW_EXPRESSION = new JavaCompositeElementType("NEW_EXPRESSION", () -> new PsiNewExpressionImpl());
IElementType ARRAY_ACCESS_EXPRESSION = new JavaCompositeElementType("ARRAY_ACCESS_EXPRESSION", () -> new PsiArrayAccessExpressionImpl());
IElementType ARRAY_INITIALIZER_EXPRESSION =
new JavaCompositeElementType("ARRAY_INITIALIZER_EXPRESSION", () -> new PsiArrayInitializerExpressionImpl(),
BASIC_ARRAY_INITIALIZER_EXPRESSION);
IElementType INSTANCE_OF_EXPRESSION = new JavaCompositeElementType("INSTANCE_OF_EXPRESSION", () -> new PsiInstanceOfExpressionImpl(),
BASIC_INSTANCE_OF_EXPRESSION);
new JavaCompositeElementType("ARRAY_INITIALIZER_EXPRESSION", () -> new PsiArrayInitializerExpressionImpl());
IElementType INSTANCE_OF_EXPRESSION = new JavaCompositeElementType("INSTANCE_OF_EXPRESSION", () -> new PsiInstanceOfExpressionImpl());
IElementType CLASS_OBJECT_ACCESS_EXPRESSION =
new JavaCompositeElementType("CLASS_OBJECT_ACCESS_EXPRESSION", () -> new PsiClassObjectAccessExpressionImpl(),
BASIC_CLASS_OBJECT_ACCESS_EXPRESSION);
IElementType TEMPLATE_EXPRESSION = new JavaCompositeElementType("TEMPLATE_EXPRESSION", () -> new PsiTemplateExpressionImpl(),
BASIC_TEMPLATE_EXPRESSION);
IElementType TEMPLATE = new JavaCompositeElementType("TEMPLATE", () -> new PsiTemplateImpl(),
BASIC_TEMPLATE);
IElementType EMPTY_EXPRESSION = new JavaCompositeElementType("EMPTY_EXPRESSION", () -> new PsiEmptyExpressionImpl(), true,
BASIC_EMPTY_EXPRESSION);
IElementType EXPRESSION_LIST = new JavaCompositeElementType("EXPRESSION_LIST", () -> new PsiExpressionListImpl(), true,
BASIC_EXPRESSION_LIST);
IElementType EMPTY_STATEMENT = new JavaCompositeElementType("EMPTY_STATEMENT", () -> new PsiEmptyStatementImpl(),
BASIC_EMPTY_STATEMENT);
IElementType BLOCK_STATEMENT = new JavaCompositeElementType("BLOCK_STATEMENT", () -> new PsiBlockStatementImpl(),
BASIC_BLOCK_STATEMENT);
IElementType EXPRESSION_STATEMENT = new JavaCompositeElementType("EXPRESSION_STATEMENT", () -> new PsiExpressionStatementImpl(),
BASIC_EXPRESSION_STATEMENT);
new JavaCompositeElementType("CLASS_OBJECT_ACCESS_EXPRESSION", () -> new PsiClassObjectAccessExpressionImpl());
IElementType TEMPLATE_EXPRESSION = new JavaCompositeElementType("TEMPLATE_EXPRESSION", () -> new PsiTemplateExpressionImpl());
IElementType TEMPLATE = new JavaCompositeElementType("TEMPLATE", () -> new PsiTemplateImpl());
IElementType EMPTY_EXPRESSION = new JavaCompositeElementType("EMPTY_EXPRESSION", () -> new PsiEmptyExpressionImpl(), true);
IElementType EXPRESSION_LIST = new JavaCompositeElementType("EXPRESSION_LIST", () -> new PsiExpressionListImpl(), true);
IElementType EMPTY_STATEMENT = new JavaCompositeElementType("EMPTY_STATEMENT", () -> new PsiEmptyStatementImpl());
IElementType BLOCK_STATEMENT = new JavaCompositeElementType("BLOCK_STATEMENT", () -> new PsiBlockStatementImpl());
IElementType EXPRESSION_STATEMENT = new JavaCompositeElementType("EXPRESSION_STATEMENT", () -> new PsiExpressionStatementImpl());
IElementType EXPRESSION_LIST_STATEMENT =
new JavaCompositeElementType("EXPRESSION_LIST_STATEMENT", () -> new PsiExpressionListStatementImpl(),
BASIC_EXPRESSION_LIST_STATEMENT);
IElementType DECLARATION_STATEMENT = new JavaCompositeElementType("DECLARATION_STATEMENT", () -> new PsiDeclarationStatementImpl(),
BASIC_DECLARATION_STATEMENT);
IElementType IF_STATEMENT = new JavaCompositeElementType("IF_STATEMENT", () -> new PsiIfStatementImpl(),
BASIC_IF_STATEMENT);
IElementType WHILE_STATEMENT = new JavaCompositeElementType("WHILE_STATEMENT", () -> new PsiWhileStatementImpl(),
BASIC_WHILE_STATEMENT);
IElementType FOR_STATEMENT = new JavaCompositeElementType("FOR_STATEMENT", () -> new PsiForStatementImpl(),
BASIC_FOR_STATEMENT);
IElementType FOREACH_STATEMENT = new JavaCompositeElementType("FOREACH_STATEMENT", () -> new PsiForeachStatementImpl(),
BASIC_FOREACH_STATEMENT);
new JavaCompositeElementType("EXPRESSION_LIST_STATEMENT", () -> new PsiExpressionListStatementImpl());
IElementType DECLARATION_STATEMENT = new JavaCompositeElementType("DECLARATION_STATEMENT", () -> new PsiDeclarationStatementImpl());
IElementType IF_STATEMENT = new JavaCompositeElementType("IF_STATEMENT", () -> new PsiIfStatementImpl());
IElementType WHILE_STATEMENT = new JavaCompositeElementType("WHILE_STATEMENT", () -> new PsiWhileStatementImpl());
IElementType FOR_STATEMENT = new JavaCompositeElementType("FOR_STATEMENT", () -> new PsiForStatementImpl());
IElementType FOREACH_STATEMENT = new JavaCompositeElementType("FOREACH_STATEMENT", () -> new PsiForeachStatementImpl());
IElementType FOREACH_PATTERN_STATEMENT =
new JavaCompositeElementType("FOREACH_PATTERN_STATEMENT", () -> new PsiForeachPatternStatementImpl(),
BASIC_FOREACH_PATTERN_STATEMENT);
IElementType DO_WHILE_STATEMENT = new JavaCompositeElementType("DO_WHILE_STATEMENT", () -> new PsiDoWhileStatementImpl(),
BASIC_DO_WHILE_STATEMENT);
IElementType SWITCH_STATEMENT = new JavaCompositeElementType("SWITCH_STATEMENT", () -> new PsiSwitchStatementImpl(),
BASIC_SWITCH_STATEMENT);
IElementType SWITCH_EXPRESSION = new JavaCompositeElementType("SWITCH_EXPRESSION", () -> new PsiSwitchExpressionImpl(),
BASIC_SWITCH_EXPRESSION);
IElementType SWITCH_LABEL_STATEMENT = new JavaCompositeElementType("SWITCH_LABEL_STATEMENT", () -> new PsiSwitchLabelStatementImpl(),
BASIC_SWITCH_LABEL_STATEMENT);
IElementType SWITCH_LABELED_RULE = new JavaCompositeElementType("SWITCH_LABELED_RULE", () -> new PsiSwitchLabeledRuleStatementImpl(),
BASIC_SWITCH_LABELED_RULE);
IElementType BREAK_STATEMENT = new JavaCompositeElementType("BREAK_STATEMENT", () -> new PsiBreakStatementImpl(),
BASIC_BREAK_STATEMENT);
IElementType YIELD_STATEMENT = new JavaCompositeElementType("YIELD_STATEMENT", () -> new PsiYieldStatementImpl(),
BASIC_YIELD_STATEMENT);
IElementType CONTINUE_STATEMENT = new JavaCompositeElementType("CONTINUE_STATEMENT", () -> new PsiContinueStatementImpl(),
BASIC_CONTINUE_STATEMENT);
IElementType RETURN_STATEMENT = new JavaCompositeElementType("RETURN_STATEMENT", () -> new PsiReturnStatementImpl(),
BASIC_RETURN_STATEMENT);
IElementType THROW_STATEMENT = new JavaCompositeElementType("THROW_STATEMENT", () -> new PsiThrowStatementImpl(),
BASIC_THROW_STATEMENT);
IElementType SYNCHRONIZED_STATEMENT = new JavaCompositeElementType("SYNCHRONIZED_STATEMENT", () -> new PsiSynchronizedStatementImpl(),
BASIC_SYNCHRONIZED_STATEMENT);
IElementType TRY_STATEMENT = new JavaCompositeElementType("TRY_STATEMENT", () -> new PsiTryStatementImpl(),
BASIC_TRY_STATEMENT);
IElementType RESOURCE_LIST = new JavaCompositeElementType("RESOURCE_LIST", () -> new PsiResourceListImpl(),
BASIC_RESOURCE_LIST);
IElementType RESOURCE_VARIABLE = new JavaCompositeElementType("RESOURCE_VARIABLE", () -> new PsiResourceVariableImpl(),
BASIC_RESOURCE_VARIABLE);
IElementType RESOURCE_EXPRESSION = new JavaCompositeElementType("RESOURCE_EXPRESSION", () -> new PsiResourceExpressionImpl(),
BASIC_RESOURCE_EXPRESSION);
IElementType CATCH_SECTION = new JavaCompositeElementType("CATCH_SECTION", () -> new PsiCatchSectionImpl(),
BASIC_CATCH_SECTION);
IElementType LABELED_STATEMENT = new JavaCompositeElementType("LABELED_STATEMENT", () -> new PsiLabeledStatementImpl(),
BASIC_LABELED_STATEMENT);
IElementType ASSERT_STATEMENT = new JavaCompositeElementType("ASSERT_STATEMENT", () -> new PsiAssertStatementImpl(),
BASIC_ASSERT_STATEMENT);
new JavaCompositeElementType("FOREACH_PATTERN_STATEMENT", () -> new PsiForeachPatternStatementImpl());
IElementType DO_WHILE_STATEMENT = new JavaCompositeElementType("DO_WHILE_STATEMENT", () -> new PsiDoWhileStatementImpl());
IElementType SWITCH_STATEMENT = new JavaCompositeElementType("SWITCH_STATEMENT", () -> new PsiSwitchStatementImpl());
IElementType SWITCH_EXPRESSION = new JavaCompositeElementType("SWITCH_EXPRESSION", () -> new PsiSwitchExpressionImpl());
IElementType SWITCH_LABEL_STATEMENT = new JavaCompositeElementType("SWITCH_LABEL_STATEMENT", () -> new PsiSwitchLabelStatementImpl());
IElementType SWITCH_LABELED_RULE = new JavaCompositeElementType("SWITCH_LABELED_RULE", () -> new PsiSwitchLabeledRuleStatementImpl());
IElementType BREAK_STATEMENT = new JavaCompositeElementType("BREAK_STATEMENT", () -> new PsiBreakStatementImpl());
IElementType YIELD_STATEMENT = new JavaCompositeElementType("YIELD_STATEMENT", () -> new PsiYieldStatementImpl());
IElementType CONTINUE_STATEMENT = new JavaCompositeElementType("CONTINUE_STATEMENT", () -> new PsiContinueStatementImpl());
IElementType RETURN_STATEMENT = new JavaCompositeElementType("RETURN_STATEMENT", () -> new PsiReturnStatementImpl());
IElementType THROW_STATEMENT = new JavaCompositeElementType("THROW_STATEMENT", () -> new PsiThrowStatementImpl());
IElementType SYNCHRONIZED_STATEMENT = new JavaCompositeElementType("SYNCHRONIZED_STATEMENT", () -> new PsiSynchronizedStatementImpl());
IElementType TRY_STATEMENT = new JavaCompositeElementType("TRY_STATEMENT", () -> new PsiTryStatementImpl());
IElementType RESOURCE_LIST = new JavaCompositeElementType("RESOURCE_LIST", () -> new PsiResourceListImpl());
IElementType RESOURCE_VARIABLE = new JavaCompositeElementType("RESOURCE_VARIABLE", () -> new PsiResourceVariableImpl());
IElementType RESOURCE_EXPRESSION = new JavaCompositeElementType("RESOURCE_EXPRESSION", () -> new PsiResourceExpressionImpl());
IElementType CATCH_SECTION = new JavaCompositeElementType("CATCH_SECTION", () -> new PsiCatchSectionImpl());
IElementType LABELED_STATEMENT = new JavaCompositeElementType("LABELED_STATEMENT", () -> new PsiLabeledStatementImpl());
IElementType ASSERT_STATEMENT = new JavaCompositeElementType("ASSERT_STATEMENT", () -> new PsiAssertStatementImpl());
IElementType ANNOTATION_ARRAY_INITIALIZER =
new JavaCompositeElementType("ANNOTATION_ARRAY_INITIALIZER", () -> new PsiArrayInitializerMemberValueImpl(),
BASIC_ANNOTATION_ARRAY_INITIALIZER);
IElementType RECEIVER_PARAMETER = new JavaCompositeElementType("RECEIVER", () -> new PsiReceiverParameterImpl(),
BASIC_RECEIVER_PARAMETER);
IElementType MODULE_REFERENCE = new JavaCompositeElementType("MODULE_REFERENCE", () -> new PsiJavaModuleReferenceElementImpl(),
BASIC_MODULE_REFERENCE);
new JavaCompositeElementType("ANNOTATION_ARRAY_INITIALIZER", () -> new PsiArrayInitializerMemberValueImpl());
IElementType RECEIVER_PARAMETER = new JavaCompositeElementType("RECEIVER", () -> new PsiReceiverParameterImpl());
IElementType MODULE_REFERENCE = new JavaCompositeElementType("MODULE_REFERENCE", () -> new PsiJavaModuleReferenceElementImpl());
IElementType UNNAMED_PATTERN =
new JavaCompositeElementType("UNNAMED_PATTERN", () -> new PsiUnnamedPatternImpl(), BASIC_UNNAMED_PATTERN);
new JavaCompositeElementType("UNNAMED_PATTERN", () -> new PsiUnnamedPatternImpl());
IElementType TYPE_TEST_PATTERN =
new JavaCompositeElementType("TYPE_TEST_PATTERN", () -> new PsiTypeTestPatternImpl(), BASIC_TYPE_TEST_PATTERN);
new JavaCompositeElementType("TYPE_TEST_PATTERN", () -> new PsiTypeTestPatternImpl());
IElementType PATTERN_VARIABLE =
new JavaCompositeElementType("PATTERN_VARIABLE", () -> new PsiPatternVariableImpl(), BASIC_PATTERN_VARIABLE);
new JavaCompositeElementType("PATTERN_VARIABLE", () -> new PsiPatternVariableImpl());
IElementType DECONSTRUCTION_PATTERN =
new JavaCompositeElementType("DECONSTRUCTION_PATTERN", () -> new PsiDeconstructionPatternImpl(),
BASIC_DECONSTRUCTION_PATTERN);
new JavaCompositeElementType("DECONSTRUCTION_PATTERN", () -> new PsiDeconstructionPatternImpl());
IElementType DECONSTRUCTION_LIST =
new JavaCompositeElementType("DECONSTRUCTION_LIST", () -> new PsiDeconstructionListImpl(),
BASIC_DECONSTRUCTION_LIST);
new JavaCompositeElementType("DECONSTRUCTION_LIST", () -> new PsiDeconstructionListImpl());
IElementType DECONSTRUCTION_PATTERN_VARIABLE =
new JavaCompositeElementType("DECONSTRUCTION_PATTERN_VARIABLE", () -> new PsiDeconstructionPatternVariableImpl(),
BASIC_DECONSTRUCTION_PATTERN_VARIABLE);
new JavaCompositeElementType("DECONSTRUCTION_PATTERN_VARIABLE", () -> new PsiDeconstructionPatternVariableImpl());
IElementType DEFAULT_CASE_LABEL_ELEMENT =
new JavaCompositeElementType("DEFAULT_CASE_LABEL_ELEMENT", () -> new PsiDefaultLabelElementImpl(),
BASIC_DEFAULT_CASE_LABEL_ELEMENT);
new JavaCompositeElementType("DEFAULT_CASE_LABEL_ELEMENT", () -> new PsiDefaultLabelElementImpl());
IElementType CASE_LABEL_ELEMENT_LIST =
new JavaCompositeElementType("CASE_LABEL_ELEMENT_LIST", () -> new PsiCaseLabelElementListImpl(),
BASIC_CASE_LABEL_ELEMENT_LIST);
new JavaCompositeElementType("CASE_LABEL_ELEMENT_LIST", () -> new PsiCaseLabelElementListImpl());
ILazyParseableElementType CODE_BLOCK = new FrontBackICodeBlockElementType(PsiUtil::getLanguageLevel,
JavaParserUtil::obtainTokens) {
@@ -237,10 +204,156 @@ public interface JavaElementType {
IElementType EXPRESSION_TEXT = new ExpressionThinCodeFragmentElementType();
IElementType REFERENCE_TEXT = new ReferenceThinCodeFragmentElementType();
IElementType TYPE_WITH_DISJUNCTIONS_TEXT = new FrontBackTypeTextElementType("TYPE_WITH_DISJUNCTIONS_TEXT",
ReferenceParser.DISJUNCTIONS,
BASIC_TYPE_WITH_DISJUNCTIONS_TEXT);
ReferenceParser.DISJUNCTIONS);
IElementType TYPE_WITH_CONJUNCTIONS_TEXT = new FrontBackTypeTextElementType("TYPE_WITH_CONJUNCTIONS_TEXT",
ReferenceParser.DISJUNCTIONS,
BASIC_TYPE_WITH_CONJUNCTIONS_TEXT);
ReferenceParser.DISJUNCTIONS);
IElementType DUMMY_ELEMENT = new JavaDummyElementType();
@ApiStatus.Internal
final class JavaDummyElementType extends ILazyParseableElementType implements ICompositeElementType {
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 JavaDummyElement : chameleon;
final JavaDummyElement dummyElement = (JavaDummyElement)chameleon;
return JavaParserUtil.parseFragment(chameleon, dummyElement.getParser(), dummyElement.consumeAll(),
dummyElement.getLanguageLevel()
);
}
}
abstract class FrontBackICodeBlockElementType extends IErrorCounterReparseableElementType
implements ICompositeElementType, ILightLazyParseableElementType {
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 = JavaParserUtil.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 = JavaParserUtil.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;
}
}
class FrontBackTypeTextElementType extends ICodeFragmentElementType {
private final int myFlags;
public FrontBackTypeTextElementType(@NonNls String debugName, int flags) {
super(debugName, JavaLanguage.INSTANCE);
myFlags = flags;
}
private final JavaParserUtil.ParserWrapper myParser = new JavaParserUtil.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 JavaParserUtil.parseFragmentWithHighestLanguageLevel(chameleon, myParser, JavaLexer::new);
}
}
class StatementThinCodeFragmentElementType extends JavaElementType.ThinCodeFragmentElementType {
public StatementThinCodeFragmentElementType() {
super("STATEMENTS", (builder, languageLevel) -> {
new JavaParser(languageLevel).getStatementParser().parseStatements(builder);
});
}
}
class MemberThinCodeFragmentElementType extends JavaElementType.ThinCodeFragmentElementType {
public MemberThinCodeFragmentElementType() {
super("MEMBERS", (builder, languageLevel) -> {
new JavaParser(languageLevel).getDeclarationParser().parseClassBodyDeclarations(builder, false);
});
}
}
class ExpressionThinCodeFragmentElementType extends JavaElementType.ThinCodeFragmentElementType {
public ExpressionThinCodeFragmentElementType() {
super("EXPRESSION_TEXT", (builder, languageLevel) -> {
new JavaParser(languageLevel).getExpressionParser().parse(builder);
});
}
}
class ReferenceThinCodeFragmentElementType extends JavaElementType.ThinCodeFragmentElementType {
public ReferenceThinCodeFragmentElementType() {
super("REFERENCE_TEXT", (builder, languageLevel) -> {
new JavaParser(languageLevel).getReferenceParser().parseJavaCodeReference(builder, false, true, false, false);
});
}
}
class ThinCodeFragmentElementType extends ICodeFragmentElementType {
private final JavaParserUtil.ParserWrapper myParser;
private ThinCodeFragmentElementType(@NotNull String debugName,
@NotNull JavaParserUtil.ParserWrapper parser) {
super(debugName, JavaLanguage.INSTANCE);
myParser = parser;
}
@Override
public @Nullable ASTNode parseContents(final @NotNull ASTNode chameleon) {
return JavaParserUtil.parseFragmentWithHighestLanguageLevel(chameleon, myParser, JavaLexer::new);
}
}
}