[java, complete, import-module] Complete module names for Module Import Declarations IDEA-355531

GitOrigin-RevId: 6cf4de84d101370d001fee581474fcd687a5ecc3
This commit is contained in:
Aleksey Dobrynin
2024-07-23 16:59:38 +02:00
committed by intellij-monorepo-bot
parent d57dee5d32
commit 9f9f6e0527
2 changed files with 53 additions and 9 deletions

View File

@@ -1386,25 +1386,30 @@ public final class JavaCompletionContributor extends CompletionContributor imple
private static void addModuleReferences(PsiElement moduleRef, PsiFile originalFile, CompletionResultSet result) {
PsiElement statement = moduleRef.getParent();
boolean requires;
if ((requires = statement instanceof PsiRequiresStatement) || statement instanceof PsiPackageAccessibilityStatement) {
boolean withAutoModules;
if ((withAutoModules = statement instanceof PsiRequiresStatement || statement instanceof PsiImportModuleStatement) || statement instanceof PsiPackageAccessibilityStatement) {
PsiElement parent = statement.getParent();
if (parent != null) {
Project project = moduleRef.getProject();
Set<String> filter = new HashSet<>();
filter.add(((PsiJavaModule)parent).getName());
if (parent instanceof PsiJavaModule psiJavaModule) {
filter.add(psiJavaModule.getName());
} else {
PsiJavaModule psiJavaModule = JavaModuleGraphHelper.getInstance().findDescriptorByElement(originalFile);
if (psiJavaModule != null) filter.add(psiJavaModule.getName());
}
JavaModuleNameIndex index = JavaModuleNameIndex.getInstance();
GlobalSearchScope scope = ProjectScope.getAllScope(project);
for (String name : index.getAllKeys(project)) {
if (!index.getModules(name, project, scope).isEmpty() && filter.add(name)) {
LookupElement lookup = LookupElementBuilder.create(name).withIcon(AllIcons.Nodes.JavaModule);
if (requires) lookup = TailTypeDecorator.withTail(lookup, TailTypes.semicolonType());
if (withAutoModules) lookup = TailTypeDecorator.withTail(lookup, TailTypes.semicolonType());
result.addElement(lookup);
}
}
if (requires) {
if (withAutoModules) {
Module module = ModuleUtilCore.findModuleForFile(originalFile);
if (module != null) {
scope = ProjectScope.getAllScope(project);

View File

@@ -135,17 +135,56 @@ class ModuleCompletionTest : LightJava9ModulesCodeInsightFixtureTestCase() {
myFixture.checkResult("package whatever;\nclass Foo<TParam> { TParam<caret> p; }")
}
@NeedsIndex.Full
fun testModuleImportDeclarations() = fileComplete("Test.java", """
import module M<caret>
class Test { }
""", """
import module M2;<caret>
class Test { }
""")
@NeedsIndex.Full
fun testAutoModuleImportDeclarations() = fileComplete("Test.java", """
import module al<caret>
class Test { }
""", """
import module all.fours;<caret>
class Test { }
""")
@NeedsIndex.Full
fun testModuleImportDeclarationsBare() =
fileVariants("Test.java", """
import module <caret>
class Test { }
""".trimIndent(),
"M2", "java.base", "java.non.root", "java.se", "java.xml.bind", "java.xml.ws",
"lib.multi.release", "lib.named", "lib.auto", "lib.claimed", "all.fours", "lib.with.module.info")
@NeedsIndex.Full
fun testModuleImportDeclarationsIgnoreCurrentModule() {
addFile("module-info.java", "module current.module.name { }")
fileVariants("Test.java", """
import module current<caret>
class Test { }
""".trimIndent())
}
//<editor-fold desc="Helpers.">
private fun complete(text: String, expected: String) {
myFixture.configureByText("module-info.java", text)
private fun complete(text: String, expected: String) = fileComplete("module-info.java", text, expected)
private fun fileComplete(fileName: String, text: String, expected: String) {
myFixture.configureByText(fileName, text)
myFixture.completeBasic()
myFixture.checkResult(expected)
}
private fun variants(text: String, vararg variants: String) {
myFixture.configureByText("module-info.java", text)
private fun variants(text: String, vararg variants: String) = fileVariants("module-info.java", text, *variants)
private fun fileVariants(fileName: String, text: String, vararg variants: String) {
myFixture.configureByText(fileName, text)
myFixture.completeBasic()
assertThat(myFixture.lookupElementStrings).containsExactlyInAnyOrder(*variants)
}
//</editor-fold>
}