mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 06:05:01 +07:00
[java] resolves Java module references according to a project model
This commit is contained in:
@@ -202,13 +202,13 @@ public class CoreJavaFileManager implements JavaFileManager {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<PsiJavaModule> findModules(@NotNull String moduleName) {
|
||||
public Collection<PsiJavaModule> findModules(@NotNull String moduleName, @NotNull GlobalSearchScope scope) {
|
||||
Collection<PsiJavaModule> result = null;
|
||||
|
||||
for (VirtualFile root : roots()) {
|
||||
VirtualFile moduleInfo = root.findChild(PsiJavaModule.MODULE_INFO_FILE);
|
||||
if (moduleInfo == null)moduleInfo = root.findChild(PsiJavaModule.MODULE_INFO_CLS_FILE);
|
||||
if (moduleInfo != null) {
|
||||
if (moduleInfo == null) moduleInfo = root.findChild(PsiJavaModule.MODULE_INFO_CLS_FILE);
|
||||
if (moduleInfo != null && scope.accept(moduleInfo)) {
|
||||
PsiFile file = myPsiManager.findFile(moduleInfo);
|
||||
if (file instanceof PsiJavaFile) {
|
||||
PsiJavaModule module = ((PsiJavaFile)file).getModuleDeclaration();
|
||||
|
||||
@@ -41,5 +41,5 @@ public interface JavaFileManager {
|
||||
Collection<String> getNonTrivialPackagePrefixes();
|
||||
|
||||
@NotNull
|
||||
Collection<PsiJavaModule> findModules(@NotNull String moduleName);
|
||||
Collection<PsiJavaModule> findModules(@NotNull String moduleName, @NotNull GlobalSearchScope scope);
|
||||
}
|
||||
@@ -16,11 +16,15 @@
|
||||
package com.intellij.psi.impl.source;
|
||||
|
||||
import com.intellij.openapi.components.ServiceManager;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.file.impl.JavaFileManager;
|
||||
import com.intellij.psi.impl.source.resolve.ResolveCache;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -65,17 +69,33 @@ public class PsiJavaModuleReference extends PsiReferenceBase.Poly<PsiJavaModuleR
|
||||
@Override
|
||||
public ResolveResult[] resolve(@NotNull PsiJavaModuleReference reference, boolean incompleteCode) {
|
||||
Project project = reference.getProject();
|
||||
JavaFileManager service = ServiceManager.getService(project, JavaFileManager.class);
|
||||
Collection<PsiJavaModule> modules = service.findModules(reference.getCanonicalText());
|
||||
if (!modules.isEmpty()) {
|
||||
ResolveResult[] result = new ResolveResult[modules.size()];
|
||||
int i = 0;
|
||||
for (PsiJavaModule module : modules) result[i++] = new PsiElementResolveResult(module);
|
||||
return result;
|
||||
|
||||
GlobalSearchScope scope = null;
|
||||
if (!incompleteCode) {
|
||||
VirtualFile file = reference.getElement().getContainingFile().getVirtualFile();
|
||||
if (file != null) {
|
||||
Module module = FileIndexFacade.getInstance(project).getModuleForFile(file);
|
||||
if (module != null) {
|
||||
scope = module.getModuleWithDependenciesAndLibrariesScope(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
return ResolveResult.EMPTY_ARRAY;
|
||||
scope = GlobalSearchScope.allScope(project);
|
||||
}
|
||||
|
||||
if (scope != null) {
|
||||
JavaFileManager service = ServiceManager.getService(project, JavaFileManager.class);
|
||||
Collection<PsiJavaModule> modules = service.findModules(reference.getCanonicalText(), scope);
|
||||
if (!modules.isEmpty()) {
|
||||
ResolveResult[] result = new ResolveResult[modules.size()];
|
||||
int i = 0;
|
||||
for (PsiJavaModule module : modules) result[i++] = new PsiElementResolveResult(module);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return ResolveResult.EMPTY_ARRAY;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -400,6 +400,7 @@ module.duplicate.provides=Duplicate provides: {0}
|
||||
module.file.wrong.location=Module declaration should be located in a module's source root
|
||||
module.open.duplicate.text=Go to duplicate
|
||||
module.not.found=Module not found: {0}
|
||||
module.not.on.path=Module is not in dependencies: {0}
|
||||
module.cyclic.dependence=Cyclic dependence: {0}
|
||||
package.not.found=Package not found: {0}
|
||||
package.is.empty=Package is empty: {0}
|
||||
|
||||
Reference in New Issue
Block a user