[java-highlighting] WIP IDEA-372968 Support JEP 511: Module Import Declarations

- nothing changed in jep, more tests

(cherry picked from commit 03e655a19855acdfe1f7983b25c6aa7158b73393)


(cherry picked from commit fab1d353a464fd4585aa86ef7fe7595f01793aa5)

IJ-MR-169535

GitOrigin-RevId: 1c0782d7c341c0f9e2ff1b3704f13e5e94dadcb7
This commit is contained in:
Mikhail Pyltsin
2025-06-20 15:09:14 +02:00
committed by intellij-monorepo-bot
parent 88d9028b60
commit 2111b032dc
6 changed files with 135 additions and 5 deletions

View File

@@ -129,16 +129,36 @@ enum class JavaFeature {
//JEP 507
PRIMITIVE_TYPES_IN_PATTERNS(LanguageLevel.JDK_23_PREVIEW, "feature.primitive.types.in.patterns"),
//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"),
//JEP 511 see together with PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS and TRANSITIVE_DEPENDENCY_ON_JAVA_BASE
MODULE_IMPORT_DECLARATIONS(LanguageLevel.JDK_25, "feature.module.import.declarations") {
override fun isSufficient(useSiteLevel: LanguageLevel): Boolean {
return super.isSufficient(useSiteLevel) ||
LanguageLevel.JDK_23_PREVIEW == useSiteLevel ||
LanguageLevel.JDK_24_PREVIEW == useSiteLevel
}
},
/**
* Usually, this type of comments is shown as Javadoc despite language level.
* This option can be used only to adjust behavior for cases with conflicts between different types of comments (markdown and old-style)
*/
MARKDOWN_COMMENT(LanguageLevel.JDK_23, "feature.markdown.comment"),
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"),
//JEP 511 see together with MODULE_IMPORT_DECLARATIONS and TRANSITIVE_DEPENDENCY_ON_JAVA_BASE
PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS(LanguageLevel.JDK_25, "feature.package.import.shadow.module.import"){
override fun isSufficient(useSiteLevel: LanguageLevel): Boolean {
return super.isSufficient(useSiteLevel) ||
LanguageLevel.JDK_24_PREVIEW == useSiteLevel
}
},
//JEP 511 see together with MODULE_IMPORT_DECLARATIONS and PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS
TRANSITIVE_DEPENDENCY_ON_JAVA_BASE(LanguageLevel.JDK_25, "feature.package.transitive.dependency.on.java.base"){
override fun isSufficient(useSiteLevel: LanguageLevel): Boolean {
return super.isSufficient(useSiteLevel) ||
LanguageLevel.JDK_24_PREVIEW == useSiteLevel
}
},
JAVA_LANG_IO(LanguageLevel.JDK_25, "feature.java.lang.io"),

View File

@@ -0,0 +1,6 @@
<error descr="Module Import Declarations are not supported at language level '24'">import module java.base;</error>
import a.b.*;
class A{
<error descr="Reference to 'List' is ambiguous, both 'a.b.List' and 'java.util.List' match">List</error> a;
}

View File

@@ -0,0 +1,6 @@
import a.b.*;
List<caret> a;
void main() {
}

View File

@@ -0,0 +1,6 @@
import static a.b.Other.*;
List<caret> a;
void main() {
}

View File

@@ -120,6 +120,23 @@ class ImplicitClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() {
})
}
fun testImplicitWithStaticPackagesPackagesOverModule() {
IdeaTestUtil.withLevel(module, JavaFeature.PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS.minimumLevel, Runnable {
myFixture.addClass("""
package a.b;
public class Other {
public static class List {
}
}""".trimIndent())
val psiFile = myFixture.configureByFile(getTestName(false) + ".java")
myFixture.checkHighlighting()
val element = psiFile.findElementAt(myFixture.caretOffset)
assertEquals("a.b.Other.List", element?.parentOfType<PsiField>()?.type.resolve()?.qualifiedName)
})
}
fun testImplicitWithPackagesPackagesOverModule() {
IdeaTestUtil.withLevel(module, JavaFeature.PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS.minimumLevel, Runnable {
myFixture.addClass("""
@@ -135,6 +152,35 @@ class ImplicitClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() {
})
}
fun testImplicitWithPackagesPackagesOverModule25() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_25, Runnable {
myFixture.addClass("""
package a.b;
public final class List {
}
""".trimIndent())
val psiFile = myFixture.configureByFile(getTestName(false) + ".java")
myFixture.checkHighlighting()
val element = psiFile.findElementAt(myFixture.caretOffset)
assertEquals("a.b.List", element?.parentOfType<PsiField>()?.type.resolve()?.qualifiedName)
})
}
fun testImplicitWithPackagesPackagesOverModule24() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_24, Runnable {
myFixture.addClass("""
package a.b;
public final class List {
}
""".trimIndent())
myFixture.configureByFile(getTestName(false) + ".java")
myFixture.checkHighlighting()
})
}
fun testImplicitWithSingleImport() {
IdeaTestUtil.withLevel(module, JavaFeature.PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS.minimumLevel, Runnable {

View File

@@ -89,7 +89,7 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() {
}
}
fun testModuleImportDeclarationLevelCheck() {
fun testModuleImportDeclarationLevelCheck23() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_23) {
highlight("Test.java", """
<error descr="Module Import Declarations are not supported at language level '23'">import module java.sql;</error>
@@ -98,6 +98,52 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() {
}
}
fun testModuleImportDeclarationLevelCheck23Preview() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_23_PREVIEW) {
highlight("Test.java", """
import module java.base;
class Test {}
""".trimIndent())
}
}
fun testModuleImportDeclarationLevelCheck24() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_24) {
highlight("Test.java", """
<error descr="Module Import Declarations are not supported at language level '24'">import module java.sql;</error>
class Test {}
""".trimIndent())
}
}
fun testModuleImportDeclarationLevelCheck24Preview() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_24_PREVIEW) {
highlight("Test.java", """
import module java.base;
class Test {}
""".trimIndent())
}
}
fun testModuleImportDeclarationLevelCheck25() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_25) {
highlight("Test.java", """
import module java.base;
import module java.base;
class Test {}
""".trimIndent())
}
}
fun testModuleImportDeclarationLevelCheck25Preview() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_25) {
highlight("Test.java", """
import module java.base;
class Test {}
""".trimIndent())
}
}
fun testModuleImportDeclarationInModuleInfoFile() {
IdeaTestUtil.withLevel(module, LanguageLevel.JDK_23_PREVIEW) {
highlight("module-info.java", """