[java] resolves Java module references according to a project model

This commit is contained in:
Roman Shevchenko
2016-09-08 22:34:26 +03:00
parent c11ddd6215
commit 09cb3081a8
9 changed files with 56 additions and 32 deletions
@@ -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}