[java-modules] JavaModuleSearch as a facade for JavaModuleNameIndex

GitOrigin-RevId: b8c1be32c0e2b053e098d3339b1f47d4d8d68635
This commit is contained in:
Tagir Valeev
2025-02-10 14:22:33 +01:00
committed by intellij-monorepo-bot
parent 5b40cccb5e
commit da0b41afe9
4 changed files with 117 additions and 7 deletions

View File

@@ -22,11 +22,11 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiJavaModuleModificationTracker;
import com.intellij.psi.impl.java.stubs.index.JavaModuleNameIndex;
import com.intellij.psi.impl.light.LightJavaModule;
import com.intellij.psi.impl.source.resolve.JavaResolveUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.ProjectScope;
import com.intellij.psi.search.searches.JavaModuleSearch;
import com.intellij.psi.util.CachedValueProvider.Result;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiUtil;
@@ -345,13 +345,11 @@ public final class JavaModuleGraphUtil {
MultiMap<PsiJavaModule, PsiJavaModule> relations = MultiMap.create();
Set<String> transitiveEdges = new HashSet<>();
JavaModuleNameIndex index = JavaModuleNameIndex.getInstance();
GlobalSearchScope scope = ProjectScope.getAllScope(project);
for (String key : index.getAllKeys(project)) {
for (PsiJavaModule module : index.getModules(key, project, scope)) {
visit(module, relations, transitiveEdges);
}
}
JavaModuleSearch.allModules(project, scope).forEach(module -> {
visit(module, relations, transitiveEdges);
return true;
});
Graph<PsiJavaModule> graph = GraphGenerator.generate(new ChameleonGraph<>(relations, true));
return new RequiresGraph(graph, transitiveEdges);

View File

@@ -0,0 +1,73 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.psi.search.searches;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiJavaModule;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.Query;
import com.intellij.util.QueryExecutor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Allows searching for Java (JPMS) modules declared in the project
*/
public final class JavaModuleSearch extends ExtensibleQueryFactory<PsiJavaModule, JavaModuleSearch.Parameters> {
public static final ExtensionPointName<QueryExecutor<PsiJavaModule, JavaModuleSearch.Parameters>> EP_NAME = ExtensionPointName.create("com.intellij.javaModuleSearch");
public static final JavaModuleSearch INSTANCE = new JavaModuleSearch();
public static class Parameters {
private final @Nullable String myName;
private final @NotNull Project myProject;
private final @NotNull GlobalSearchScope myScope;
/**
* @param name module name (null to find all modules)
* @param project project
* @param scope scope to search in
*/
public Parameters(@Nullable String name, @NotNull Project project, @NotNull GlobalSearchScope scope) {
myName = name;
myProject = project;
myScope = scope;
}
public @Nullable String getName() {
return myName;
}
public @NotNull Project getProject() {
return myProject;
}
public @NotNull GlobalSearchScope getScope() {
return myScope;
}
}
private JavaModuleSearch() {
super(EP_NAME);
}
/**
* Find JPMS modules in the scope
* @param name name of the module to find
* @param project project
* @param scope scope to use
* @return the query that contains found modules results
*/
public static @NotNull Query<PsiJavaModule> search(@NotNull String name, @NotNull Project project, @NotNull GlobalSearchScope scope) {
return INSTANCE.createQuery(new Parameters(name, project, scope));
}
/**
* Find all JPMS modules in the scope
* @param project project
* @param scope scope to use
* @return the query that contains found modules results
*/
public static @NotNull Query<PsiJavaModule> allModules(@NotNull Project project, @NotNull GlobalSearchScope scope) {
return INSTANCE.createQuery(new Parameters(null, project, scope));
}
}

View File

@@ -26,6 +26,7 @@
<extensionPoint qualifiedName="com.intellij.classInheritorsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.annotatedElementsSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.implicitClassSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.javaModuleSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.annotatedPackagesSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.functionalExpressionSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
<extensionPoint qualifiedName="com.intellij.implicitToStringSearch" interface="com.intellij.util.QueryExecutor" dynamic="true"/>
@@ -71,6 +72,7 @@
<directClassInheritorsSearch implementation="com.intellij.psi.impl.search.JavaDirectInheritorsSearcher"/>
<annotatedPackagesSearch implementation="com.intellij.psi.impl.search.AnnotatedPackagesSearcher"/>
<implicitClassSearch implementation="com.intellij.psi.impl.search.ImplicitClassesSearcher"/>
<javaModuleSearch implementation="com.intellij.psi.impl.search.JavaModuleSearcher"/>
<annotatedElementsSearch implementation="com.intellij.psi.impl.search.AnnotatedElementsSearcher"/>
<allClassesSearch implementation="com.intellij.psi.impl.search.AllClassesSearchExecutor"/>
<referencesSearch implementation="com.intellij.psi.impl.search.VariableInIncompleteCodeSearcher"/>

View File

@@ -0,0 +1,37 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.psi.impl.search;
import com.intellij.psi.PsiJavaModule;
import com.intellij.psi.impl.java.stubs.index.JavaStubIndexKeys;
import com.intellij.psi.search.searches.JavaModuleSearch;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import org.jetbrains.annotations.NotNull;
public final class JavaModuleSearcher implements QueryExecutor<PsiJavaModule, JavaModuleSearch.Parameters> {
@Override
public boolean execute(JavaModuleSearch.@NotNull Parameters queryParameters,
@NotNull Processor<? super PsiJavaModule> consumer) {
String name = queryParameters.getName();
StubIndex index = StubIndex.getInstance();
if (name == null) {
return index.processAllKeys(JavaStubIndexKeys.MODULE_NAMES, moduleName -> {
return index.processElements(JavaStubIndexKeys.MODULE_NAMES,
moduleName,
queryParameters.getProject(),
queryParameters.getScope(),
null,
PsiJavaModule.class,
consumer);
}, queryParameters.getScope());
}
return index.processElements(JavaStubIndexKeys.MODULE_NAMES,
name,
queryParameters.getProject(),
queryParameters.getScope(),
null,
PsiJavaModule.class,
consumer);
}
}