mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
[java, import-module] parsing import module construction (JEP-476) IDEA-355529
GitOrigin-RevId: 83c9e28007a731565809143b33b3dbd96a4a3ae5
This commit is contained in:
committed by
intellij-monorepo-bot
parent
a751d46eb2
commit
52a80caa73
@@ -196,7 +196,12 @@ public class BasicFileParser {
|
||||
IElementType type = getImportType(builder);
|
||||
boolean isStatic = type == myJavaElementTypeContainer.IMPORT_STATIC_STATEMENT;
|
||||
boolean isModule = type == myJavaElementTypeContainer.IMPORT_MODULE_STATEMENT;
|
||||
boolean isOk = myParser.getReferenceParser().parseImportCodeReference(builder, isStatic, isModule);
|
||||
final boolean isOk;
|
||||
if (isModule) {
|
||||
isOk = myParser.getModuleParser().parseName(builder) != null;
|
||||
} else {
|
||||
isOk = myParser.getReferenceParser().parseImportCodeReference(builder, isStatic);
|
||||
}
|
||||
if (isOk) semicolon(builder);
|
||||
|
||||
done(statement, type, myWhiteSpaceAndCommentSetHolder);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// 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.lang.java.parser;
|
||||
|
||||
import com.intellij.core.JavaPsiBundle;
|
||||
@@ -94,7 +94,7 @@ public class BasicModuleParser {
|
||||
return module;
|
||||
}
|
||||
|
||||
private PsiBuilder.Marker parseName(PsiBuilder builder) {
|
||||
public PsiBuilder.Marker parseName(PsiBuilder builder) {
|
||||
PsiBuilder.Marker nameElement = builder.mark();
|
||||
boolean empty = true;
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ public class BasicReferenceParser {
|
||||
return typeInfo;
|
||||
}
|
||||
else if (tokenType == JavaTokenType.IDENTIFIER) {
|
||||
parseJavaCodeReference(builder, isSet(flags, EAT_LAST_DOT), true, false, false, false, false, isSet(flags, DIAMONDS), typeInfo);
|
||||
parseJavaCodeReference(builder, isSet(flags, EAT_LAST_DOT), true, false, false, false, isSet(flags, DIAMONDS), typeInfo);
|
||||
}
|
||||
else if (tokenType == JavaTokenType.VAR_KEYWORD) {
|
||||
builder.advanceLexer();
|
||||
@@ -195,18 +195,18 @@ public class BasicReferenceParser {
|
||||
boolean parameterList,
|
||||
boolean isNew,
|
||||
boolean diamonds) {
|
||||
return parseJavaCodeReference(builder, eatLastDot, parameterList, false, false, false, isNew, diamonds, new TypeInfo());
|
||||
return parseJavaCodeReference(builder, eatLastDot, parameterList, false, false, isNew, diamonds, new TypeInfo());
|
||||
}
|
||||
|
||||
public boolean parseImportCodeReference(PsiBuilder builder, boolean isStatic, boolean isModule) {
|
||||
public boolean parseImportCodeReference(PsiBuilder builder, boolean isStatic) {
|
||||
TypeInfo typeInfo = new TypeInfo();
|
||||
parseJavaCodeReference(builder, true, false, true, isStatic, isModule, false, false, typeInfo);
|
||||
parseJavaCodeReference(builder, true, false, true, isStatic, false, false, typeInfo);
|
||||
return !typeInfo.hasErrors;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private PsiBuilder.Marker parseJavaCodeReference(PsiBuilder builder, boolean eatLastDot, boolean parameterList, boolean isImport,
|
||||
boolean isStaticImport, boolean isModuleImport, boolean isNew, boolean diamonds,
|
||||
boolean isStaticImport, boolean isNew, boolean diamonds,
|
||||
TypeInfo typeInfo) {
|
||||
PsiBuilder.Marker refElement = builder.mark();
|
||||
|
||||
@@ -224,7 +224,7 @@ public class BasicReferenceParser {
|
||||
if (parameterList) {
|
||||
typeInfo.isParameterized = parseReferenceParameterList(builder, true, diamonds);
|
||||
}
|
||||
else if (!isStaticImport && !isModuleImport) {
|
||||
else if (!isStaticImport) {
|
||||
emptyElement(builder, myJavaElementTypeContainer.REFERENCE_PARAMETER_LIST);
|
||||
}
|
||||
|
||||
@@ -275,9 +275,6 @@ public class BasicReferenceParser {
|
||||
if (isStaticImport) {
|
||||
refElement.done(myJavaElementTypeContainer.IMPORT_STATIC_REFERENCE);
|
||||
}
|
||||
else if (isModuleImport) {
|
||||
refElement.done(myJavaElementTypeContainer.IMPORT_MODULE_REFERENCE);
|
||||
}
|
||||
else {
|
||||
refElement.done(myJavaElementTypeContainer.JAVA_CODE_REFERENCE);
|
||||
}
|
||||
|
||||
@@ -87,8 +87,6 @@ public abstract class AbstractBasicJavaElementTypeFactory {
|
||||
|
||||
public final IElementType IMPORT_STATIC_REFERENCE;
|
||||
|
||||
public final IElementType IMPORT_MODULE_REFERENCE;
|
||||
|
||||
public final IElementType TYPE;
|
||||
|
||||
public final IElementType DIAMOND_TYPE;
|
||||
@@ -274,7 +272,6 @@ public abstract class AbstractBasicJavaElementTypeFactory {
|
||||
IElementType NAME_VALUE_PAIR,
|
||||
IElementType LITERAL_EXPRESSION,
|
||||
IElementType IMPORT_STATIC_REFERENCE,
|
||||
IElementType IMPORT_MODULE_REFERENCE,
|
||||
IElementType TYPE,
|
||||
IElementType DIAMOND_TYPE,
|
||||
IElementType REFERENCE_PARAMETER_LIST,
|
||||
@@ -388,7 +385,6 @@ public abstract class AbstractBasicJavaElementTypeFactory {
|
||||
this.NAME_VALUE_PAIR = NAME_VALUE_PAIR;
|
||||
this.LITERAL_EXPRESSION = LITERAL_EXPRESSION;
|
||||
this.IMPORT_STATIC_REFERENCE = IMPORT_STATIC_REFERENCE;
|
||||
this.IMPORT_MODULE_REFERENCE = IMPORT_MODULE_REFERENCE;
|
||||
this.TYPE = TYPE;
|
||||
this.DIAMOND_TYPE = DIAMOND_TYPE;
|
||||
this.REFERENCE_PARAMETER_LIST = REFERENCE_PARAMETER_LIST;
|
||||
|
||||
@@ -72,7 +72,6 @@ public interface BasicJavaElementType {
|
||||
IElementType BASIC_PERMITS_LIST = new IJavaElementType("PERMITS_LIST", true);
|
||||
|
||||
IElementType BASIC_IMPORT_STATIC_REFERENCE = new IJavaElementType("IMPORT_STATIC_REFERENCE");
|
||||
IElementType BASIC_IMPORT_MODULE_REFERENCE = new IJavaElementType("IMPORT_MODULE_REFERENCE");
|
||||
IElementType BASIC_TYPE = new IJavaElementType("TYPE");
|
||||
IElementType BASIC_DIAMOND_TYPE = new IJavaElementType("DIAMOND_TYPE");
|
||||
IElementType BASIC_REFERENCE_PARAMETER_LIST = new IJavaElementType("REFERENCE_PARAMETER_LIST", true);
|
||||
|
||||
@@ -197,10 +197,6 @@ public abstract class JavaElementVisitor extends PsiElementVisitor {
|
||||
visitElement(list);
|
||||
}
|
||||
|
||||
public void visitImportModuleReferenceElement(@NotNull PsiImportModuleReferenceElement reference) {
|
||||
visitReferenceElement(reference);
|
||||
}
|
||||
|
||||
public void visitImportModuleStatement(@NotNull PsiImportModuleStatement statement) {
|
||||
visitElement(statement);
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
// 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;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Represents a reference to the member imported by a Java {@code import module}
|
||||
* statement.
|
||||
*/
|
||||
public interface PsiImportModuleReferenceElement extends PsiJavaCodeReferenceElement {
|
||||
/**
|
||||
* Returns the reference element specifying the module from which the member is imported.
|
||||
*
|
||||
* @return the reference element specifying the module.
|
||||
*/
|
||||
@Nullable PsiJavaModuleReferenceElement getModuleReference();
|
||||
}
|
||||
@@ -27,4 +27,6 @@ public interface PsiImportModuleStatement extends PsiImportStatementBase {
|
||||
* @return the name of the member.
|
||||
*/
|
||||
String getReferenceName();
|
||||
|
||||
@Nullable PsiJavaModuleReference getModuleReference();
|
||||
}
|
||||
|
||||
@@ -50,10 +50,10 @@ public class PsiJavaParserFacadeImpl implements PsiJavaParserFacade {
|
||||
builder -> JavaParser.INSTANCE.getReferenceParser().parseJavaCodeReference(builder, false, true, false, true);
|
||||
|
||||
private static final JavaParserUtil.ParserWrapper STATIC_IMPORT_REF =
|
||||
builder -> JavaParser.INSTANCE.getReferenceParser().parseImportCodeReference(builder, true, false);
|
||||
builder -> JavaParser.INSTANCE.getReferenceParser().parseImportCodeReference(builder, true);
|
||||
|
||||
private static final JavaParserUtil.ParserWrapper MODULE_IMPORT_REF =
|
||||
builder -> JavaParser.INSTANCE.getReferenceParser().parseImportCodeReference(builder, false, true);
|
||||
builder -> JavaParser.INSTANCE.getModuleParser().parseName(builder);
|
||||
|
||||
private static final JavaParserUtil.ParserWrapper TYPE_PARAMETER =
|
||||
builder -> JavaParser.INSTANCE.getReferenceParser().parseTypeParameter(builder);
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
// 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;
|
||||
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.source.tree.ChildRole;
|
||||
import com.intellij.psi.impl.source.tree.CompositePsiElement;
|
||||
import com.intellij.psi.impl.source.tree.JavaElementType;
|
||||
import com.intellij.psi.impl.source.tree.TreeElement;
|
||||
import com.intellij.psi.scope.PsiScopeProcessor;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class PsiImportModuleReferenceElementImpl extends CompositePsiElement implements PsiImportModuleReferenceElement {
|
||||
public PsiImportModuleReferenceElementImpl() {
|
||||
super(JavaElementType.IMPORT_MODULE_REFERENCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTextOffset() {
|
||||
ASTNode refName = findChildByRole(ChildRole.REFERENCE_NAME);
|
||||
if (refName != null) {
|
||||
return refName.getStartOffset();
|
||||
}
|
||||
else {
|
||||
return super.getTextOffset();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearCaches() {
|
||||
super.clearCaches();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiElement getReferenceNameElement() {
|
||||
return findChildByRoleAsPsiElement(ChildRole.REFERENCE_NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiReferenceParameterList getParameterList() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiType @NotNull [] getTypeParameters() {
|
||||
return PsiType.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiElement getQualifier() {
|
||||
return findChildByRoleAsPsiElement(ChildRole.QUALIFIER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable PsiJavaModuleReferenceElement getModuleReference() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isQualified() {
|
||||
return findChildByRole(ChildRole.QUALIFIER) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getQualifiedName() {
|
||||
return getCanonicalText();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSoft() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getReferenceName() {
|
||||
ASTNode childByRole = findChildByRole(ChildRole.REFERENCE_NAME);
|
||||
if (childByRole == null) return "";
|
||||
return childByRole.getText();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull PsiElement getElement() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull TextRange getRangeInElement() {
|
||||
TreeElement nameChild = (TreeElement)findChildByRole(ChildRole.REFERENCE_NAME);
|
||||
if (nameChild == null) return new TextRange(0, getTextLength());
|
||||
int startOffset = nameChild.getStartOffsetInParent();
|
||||
return new TextRange(startOffset, startOffset + nameChild.getTextLength());
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getCanonicalText() {
|
||||
PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)getQualifier();
|
||||
if (referenceElement == null) {
|
||||
return getReferenceName();
|
||||
}
|
||||
else {
|
||||
return referenceElement.getCanonicalText();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PsiImportModuleReferenceElement:" + getText();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull JavaResolveResult advancedResolve(boolean incompleteCode) {
|
||||
JavaResolveResult[] results = multiResolve(incompleteCode);
|
||||
if (results.length == 1) return results[0];
|
||||
return JavaResolveResult.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaResolveResult @NotNull [] multiResolve(boolean incompleteCode) {
|
||||
return JavaResolveResult.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiReference getReference() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiElement resolve() {
|
||||
return advancedResolve(false).getElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReferenceTo(@NotNull PsiElement element) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiElement handleElementRename(@NotNull String newElementName) throws IncorrectOperationException {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processVariants(@NotNull PsiScopeProcessor processor) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(@NotNull PsiElementVisitor visitor) {
|
||||
if (visitor instanceof JavaElementVisitor) {
|
||||
((JavaElementVisitor)visitor).visitImportModuleReferenceElement(this);
|
||||
}
|
||||
else {
|
||||
visitor.visitElement(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,11 +19,9 @@ public class PsiImportModuleStatementImpl extends PsiImportStatementBaseImpl imp
|
||||
|
||||
@Override
|
||||
public @Nullable PsiJavaModule resolveTargetModule() {
|
||||
PsiJavaModuleReferenceElement moduleReference = geModuleReference();
|
||||
PsiJavaModuleReference moduleReference = getModuleReference();
|
||||
if (moduleReference == null) return null;
|
||||
PsiJavaModuleReference reference = moduleReference.getReference();
|
||||
if (reference == null) return null;
|
||||
return reference.resolve();
|
||||
return moduleReference.resolve();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -31,7 +29,8 @@ public class PsiImportModuleStatementImpl extends PsiImportStatementBaseImpl imp
|
||||
return null;
|
||||
}
|
||||
|
||||
public @Nullable PsiJavaModuleReferenceElement geModuleReference() {
|
||||
@Override
|
||||
public @Nullable PsiJavaModuleReference getModuleReference() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -145,9 +145,6 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme
|
||||
if (i == JavaElementType.IMPORT_STATIC_STATEMENT) {
|
||||
return Kind.CLASS_FQ_OR_PACKAGE_NAME_KIND;
|
||||
}
|
||||
if (i == JavaElementType.IMPORT_MODULE_REFERENCE) {
|
||||
return Kind.MODULE_NAME_KIND;
|
||||
}
|
||||
if (i == JavaElementType.JAVA_CODE_REFERENCE) {
|
||||
Kind parentKind = ((PsiJavaCodeReferenceElementImpl)treeParent).getKindEnum(containingFile);
|
||||
if (parentKind == Kind.CLASS_NAME_KIND) {
|
||||
|
||||
@@ -78,9 +78,6 @@ public interface JavaElementType {
|
||||
IElementType IMPORT_STATIC_REFERENCE =
|
||||
new JavaCompositeElementType("IMPORT_STATIC_REFERENCE", () -> new PsiImportStaticReferenceElementImpl(),
|
||||
BASIC_IMPORT_STATIC_REFERENCE);
|
||||
IElementType IMPORT_MODULE_REFERENCE =
|
||||
new JavaCompositeElementType("IMPORT_MODULE_REFERENCE", () -> new PsiImportModuleReferenceElementImpl(),
|
||||
BASIC_IMPORT_MODULE_REFERENCE);
|
||||
IElementType TYPE = new JavaCompositeElementType("TYPE", () -> new PsiTypeElementImpl(), BASIC_TYPE);
|
||||
IElementType DIAMOND_TYPE =
|
||||
new JavaCompositeElementType("DIAMOND_TYPE", () -> new PsiDiamondTypeElementImpl(), BASIC_DIAMOND_TYPE);
|
||||
|
||||
@@ -60,7 +60,6 @@ public class JavaElementTypeFactory extends AbstractBasicJavaElementTypeFactory
|
||||
JavaElementType.NAME_VALUE_PAIR,
|
||||
JavaElementType.LITERAL_EXPRESSION,
|
||||
JavaElementType.IMPORT_STATIC_REFERENCE,
|
||||
JavaElementType.IMPORT_MODULE_REFERENCE,
|
||||
JavaElementType.TYPE,
|
||||
JavaElementType.DIAMOND_TYPE,
|
||||
JavaElementType.REFERENCE_PARAMETER_LIST,
|
||||
|
||||
@@ -5,11 +5,8 @@ PsiJavaFile:ModuleImport.java
|
||||
PsiWhiteSpace(' ')
|
||||
PsiKeyword:module('module')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiImportModuleReferenceElement:java.sql
|
||||
PsiJavaCodeReferenceElement:java
|
||||
PsiIdentifier:java('java')
|
||||
PsiJavaModuleReference
|
||||
PsiIdentifier:java('java')
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiIdentifier:sql('sql')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiJavaToken:SEMICOLON(';')
|
||||
@@ -5,11 +5,8 @@ java.FILE
|
||||
WHITE_SPACE
|
||||
MODULE
|
||||
WHITE_SPACE
|
||||
IMPORT_MODULE_REFERENCE
|
||||
JAVA_CODE_REFERENCE
|
||||
IDENTIFIER
|
||||
MODULE_REFERENCE
|
||||
IDENTIFIER
|
||||
DOT
|
||||
IDENTIFIER
|
||||
REFERENCE_PARAMETER_LIST
|
||||
<empty list>
|
||||
SEMICOLON
|
||||
Reference in New Issue
Block a user