mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java] tolerates ambiguous modules in readability analysis (IDEA-164553)
This commit is contained in:
+1
-2
@@ -145,8 +145,7 @@ public class JavaModuleGraphUtil {
|
||||
if (!relations.containsKey(module)) {
|
||||
relations.putValues(module, Collections.emptyList());
|
||||
for (PsiRequiresStatement statement : module.getRequires()) {
|
||||
PsiJavaModule dependency = PsiJavaModuleReference.resolve(statement, statement.getModuleName(), false);
|
||||
if (dependency != null) {
|
||||
for (PsiJavaModule dependency : PsiJavaModuleReference.multiResolve(statement, statement.getModuleName(), false)) {
|
||||
relations.putValue(module, dependency);
|
||||
if (statement.isPublic()) publicEdges.add(RequiresGraph.key(dependency, module));
|
||||
visit(dependency, relations, publicEdges);
|
||||
|
||||
@@ -18,25 +18,23 @@ package com.intellij.psi.impl.source;
|
||||
import com.intellij.core.JavaCoreBundle;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
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.psi.util.CachedValueProvider.Result;
|
||||
import com.intellij.psi.util.CachedValue;
|
||||
import com.intellij.psi.util.CachedValueProvider;
|
||||
import com.intellij.psi.util.CachedValuesManager;
|
||||
import com.intellij.psi.util.ParameterizedCachedValue;
|
||||
import com.intellij.psi.util.ParameterizedCachedValueProvider;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
import static com.intellij.openapi.util.Pair.pair;
|
||||
import static com.intellij.psi.util.PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT;
|
||||
|
||||
public class PsiJavaModuleReference extends PsiReferenceBase.Poly<PsiJavaModuleReferenceElement> {
|
||||
@@ -104,24 +102,26 @@ public class PsiJavaModuleReference extends PsiReferenceBase.Poly<PsiJavaModuleR
|
||||
}
|
||||
}
|
||||
|
||||
private static final Key<ParameterizedCachedValue<PsiJavaModule, Pair<String, Boolean>>> K_COMPLETE =
|
||||
Key.create("java.module.ref.text.resolve.complete");
|
||||
private static final Key<ParameterizedCachedValue<PsiJavaModule, Pair<String, Boolean>>> K_INCOMPLETE =
|
||||
Key.create("java.module.ref.text.resolve.incomplete");
|
||||
private static final Key<CachedValue<Collection<PsiJavaModule>>> K_COMPLETE = Key.create("java.module.ref.text.resolve.complete");
|
||||
private static final Key<CachedValue<Collection<PsiJavaModule>>> K_INCOMPLETE = Key.create("java.module.ref.text.resolve.incomplete");
|
||||
|
||||
@Nullable
|
||||
public static PsiJavaModule resolve(@NotNull final PsiElement refOwner, String refText, boolean incompleteCode) {
|
||||
if (StringUtil.isEmpty(refText)) return null;
|
||||
public static PsiJavaModule resolve(@NotNull PsiElement refOwner, String refText, boolean incompleteCode) {
|
||||
Collection<PsiJavaModule> modules = multiResolve(refOwner, refText, incompleteCode);
|
||||
return modules.size() == 1 ? modules.iterator().next() : null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Collection<PsiJavaModule> multiResolve(@NotNull final PsiElement refOwner, final String refText, final boolean incompleteCode) {
|
||||
if (StringUtil.isEmpty(refText)) return Collections.emptyList();
|
||||
CachedValuesManager manager = CachedValuesManager.getManager(refOwner.getProject());
|
||||
Key<ParameterizedCachedValue<PsiJavaModule, Pair<String, Boolean>>> key = incompleteCode ? K_COMPLETE : K_INCOMPLETE;
|
||||
return manager.getParameterizedCachedValue(refOwner, key, new ParameterizedCachedValueProvider<PsiJavaModule, Pair<String, Boolean>>() {
|
||||
@Nullable
|
||||
Key<CachedValue<Collection<PsiJavaModule>>> key = incompleteCode ? K_INCOMPLETE : K_COMPLETE;
|
||||
return manager.getCachedValue(refOwner, key, new CachedValueProvider<Collection<PsiJavaModule>>() {
|
||||
@Override
|
||||
public Result<PsiJavaModule> compute(Pair<String, Boolean> p) {
|
||||
Collection<PsiJavaModule> modules = Resolver.findModules(refOwner.getContainingFile(), p.first, p.second);
|
||||
PsiJavaModule module = modules.size() == 1 ? modules.iterator().next() : null;
|
||||
return Result.create(module, OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
|
||||
public Result<Collection<PsiJavaModule>> compute() {
|
||||
Collection<PsiJavaModule> modules = Resolver.findModules(refOwner.getContainingFile(), refText, incompleteCode);
|
||||
return Result.create(modules, OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
|
||||
}
|
||||
}, false, pair(refText, incompleteCode));
|
||||
}, false);
|
||||
}
|
||||
}
|
||||
Binary file not shown.
+1
@@ -74,6 +74,7 @@ object MultiModuleJava9ProjectDescriptor : DefaultLightProjectDescriptor() {
|
||||
val libDir = "jar://${PathManagerEx.getTestDataPath()}/codeInsight/jigsaw"
|
||||
ModuleRootModificationUtil.addModuleLibrary(main, "${libDir}/lib-named-1.0.jar!/")
|
||||
ModuleRootModificationUtil.addModuleLibrary(main, "${libDir}/lib-auto-1.0.jar!/")
|
||||
ModuleRootModificationUtil.addModuleLibrary(main, "${libDir}/lib-auto-2.0.jar!/")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user