[java-highlighting] IDEA-363617 Support JEP 494: Module Import Declarations (Second Preview)

- support transitive for dependencies on 'java.base' module

(cherry picked from commit a364934e96592ae3a8244ae68b2fb5372e7f5a30)

GitOrigin-RevId: 6bffa2d03645e77537d70cd4d9d081dec80680af
This commit is contained in:
Mikhail Pyltsin
2024-12-04 15:31:31 +01:00
committed by intellij-monorepo-bot
parent aea70bba3b
commit 6113015d06
4 changed files with 22 additions and 1 deletions

View File

@@ -21,6 +21,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.Trinity;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.*;
import com.intellij.psi.PsiPackageAccessibilityStatement.Role;
import com.intellij.psi.impl.IncompleteModelUtil;
@@ -41,6 +42,8 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.intellij.psi.JavaTokenType.TRANSITIVE_KEYWORD;
// generates HighlightInfoType.ERROR-like HighlightInfos for modularity-related (Jigsaw) problems
final class ModuleHighlightUtil {
static HighlightInfo.Builder checkPackageStatement(@NotNull PsiPackageStatement statement, @NotNull PsiFile file, @Nullable PsiJavaModule javaModule) {
@@ -489,7 +492,11 @@ final class ModuleHighlightUtil {
static void checkModifiers(@NotNull PsiRequiresStatement statement, @NotNull Consumer<? super HighlightInfo.Builder> errorSink) {
PsiModifierList modList = statement.getModifierList();
if (modList != null && PsiJavaModule.JAVA_BASE.equals(statement.getModuleName())) {
boolean transitiveAvailable = PsiUtil.isAvailable(JavaFeature.TRANSITIVE_DEPENDENCY_ON_JAVA_BASE, statement);
PsiTreeUtil.processElements(modList, PsiKeyword.class, keyword -> {
if (keyword.getTokenType() == TRANSITIVE_KEYWORD && transitiveAvailable) {
return true;
}
@PsiModifier.ModifierConstant String modifier = keyword.getText();
String message = JavaErrorBundle.message("modifier.not.allowed", modifier);
HighlightInfo.Builder info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(keyword).descriptionAndTooltip(message);

View File

@@ -124,6 +124,7 @@ feature.virtual.threads=Virtual Threads
feature.statements.before.super=Statements before super()
feature.module.import.declarations=Module Import Declarations
feature.package.import.shadow.module.import=Import-on-demand over module import
feature.package.transitive.dependency.on.java.base=Transitive dependency on java.base module
else.without.if='else' without 'if'
enum.constant.context=Enum constant ''{0}'' in ''{1}''

View File

@@ -117,9 +117,10 @@ public enum JavaFeature {
IMPLICIT_IMPORT_IN_IMPLICIT_CLASSES(LanguageLevel.JDK_23_PREVIEW, "feature.implicit.import.in.implicit.classes"),
PRIMITIVE_TYPES_IN_PATTERNS(LanguageLevel.JDK_23_PREVIEW, "feature.primitive.types.in.patterns"),
//see together with PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS
//see together with PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS and TRANSITIVE_DEPENDENCY_ON_JAVA_BASE
MODULE_IMPORT_DECLARATIONS(LanguageLevel.JDK_23_PREVIEW, "feature.module.import.declarations"),
PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS(LanguageLevel.JDK_24_PREVIEW, "feature.package.import.shadow.module.import"),
TRANSITIVE_DEPENDENCY_ON_JAVA_BASE(LanguageLevel.JDK_24_PREVIEW, "feature.package.transitive.dependency.on.java.base"),
;
private final @NotNull LanguageLevel myLevel;

View File

@@ -4,8 +4,10 @@ package com.intellij.java.codeInsight.daemon
import com.intellij.JavaTestUtil
import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil
import com.intellij.codeInsight.navigation.actions.GotoDeclarationAction
import com.intellij.pom.java.JavaFeature
import com.intellij.psi.CommonClassNames
import com.intellij.psi.PsiClass
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
import org.assertj.core.api.Assertions.assertThat
import org.junit.Assert
@@ -60,6 +62,16 @@ class LightJava11HighlightingTest : LightJavaCodeInsightFixtureTestCase() {
myFixture.checkHighlighting()
}
fun testRequiresTransitiveJavaBase() {
IdeaTestUtil.withLevel(module, JavaFeature.TRANSITIVE_DEPENDENCY_ON_JAVA_BASE.minimumLevel){
myFixture.configureByText("module-info.java", """
module M {
requires <error descr="Modifier 'static' not allowed here">static</error> transitive java.base;
}""".trimIndent())
myFixture.checkHighlighting()
}
}
private fun doTest() {
myFixture.configureByFile(getTestName(false) + ".java")
myFixture.checkHighlighting()