From 6113015d06d2e055c69e73364e14eeb8e7cc96dc Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Wed, 4 Dec 2024 15:31:31 +0100 Subject: [PATCH] [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 --- .../daemon/impl/analysis/ModuleHighlightUtil.java | 7 +++++++ .../resources/messages/JavaPsiBundle.properties | 1 + .../src/com/intellij/pom/java/JavaFeature.java | 3 ++- .../daemon/LightJava11HighlightingTest.kt | 12 ++++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java index b4ca8c9136dd..ad43382bf732 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/ModuleHighlightUtil.java @@ -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 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); diff --git a/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties b/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties index 0b359f9857ed..c29e6fdac11b 100644 --- a/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties +++ b/java/java-frontback-psi-api/resources/messages/JavaPsiBundle.properties @@ -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}'' diff --git a/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java b/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java index 58262f7afa77..a670250ab15f 100644 --- a/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java +++ b/java/java-frontback-psi-api/src/com/intellij/pom/java/JavaFeature.java @@ -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; diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava11HighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava11HighlightingTest.kt index 56f9037d792f..4ee04f67b9f6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava11HighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava11HighlightingTest.kt @@ -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 static transitive java.base; + }""".trimIndent()) + myFixture.checkHighlighting() + } + } + private fun doTest() { myFixture.configureByFile(getTestName(false) + ".java") myFixture.checkHighlighting()