From ea457179dfdf8f34c3aece4bf010e93ee8c4a22b Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Tue, 22 Nov 2016 13:32:48 +0300 Subject: [PATCH] Java: Store Java modules in RefJavaManager for the inspection "Unused 'requires' statement in module-info" (IDEA-163139) --- .../reference/RefJavaManager.java | 2 ++ ...ava9UnusedRequiresStatementInspection.java | 7 ++++-- .../reference/RefJavaManagerImpl.java | 24 +++++++++++++++++++ .../reference/RefJavaModuleImpl.java | 5 ++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaManager.java b/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaManager.java index 774346ba5f21..3465a4830bfa 100644 --- a/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaManager.java +++ b/java/java-analysis-api/src/com/intellij/codeInspection/reference/RefJavaManager.java @@ -54,6 +54,8 @@ public abstract class RefJavaManager implements RefManagerExtension optionalInfo = refModule.getUserData(JAVA_MODULE_INFO); + if (!addIfMissing) { + return optionalInfo != null ? optionalInfo.orElse(null) : null; + } if (optionalInfo == null) { optionalInfo = Optional - .ofNullable(addIfMissing ? refModule : null) + .of(refModule) .map(RefModule::getModule) .map(JavaModuleGraphUtil::findDescriptorByModule) .map(JavaModuleInfo::new); @@ -242,7 +245,7 @@ public class Java9UnusedRequiresStatementInspection extends GlobalJavaBatchInspe } } - private static class JavaModuleInfo { + private static class JavaModuleInfo { // TODO: remove this private final PsiJavaModule javaModule; private final Set importedPackageNames; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java index 4066ec6c23c6..fa3012c880d5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.impl.file.impl.JavaFileManager; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.javadoc.PsiDocTag; import com.intellij.psi.search.GlobalSearchScope; @@ -40,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.Collection; /** @@ -55,6 +57,7 @@ public class RefJavaManagerImpl extends RefJavaManager { private PsiClass myServlet; private RefPackage myDefaultPackage; private THashMap myPackages; + private THashMap myJavaModules; private final RefManagerImpl myRefManager; private PsiElementVisitor myProjectIterator; private EntryPointsManager myEntryPointsManager; @@ -109,6 +112,24 @@ public class RefJavaManagerImpl extends RefJavaManager { return refPackage; } + @Override + public RefEntity getRefJavaModule(String name) { + if (myJavaModules == null) { + myJavaModules = new THashMap<>(); + } + RefJavaModule refJavaModule = myJavaModules.get(name); + if (refJavaModule == null) { + Project project = myRefManager.getProject(); + GlobalSearchScope scope = GlobalSearchScope.projectScope(project); + Collection javaModules = JavaFileManager.SERVICE.getInstance(project).findModules(name, scope); + if (javaModules.size() == 1) { + PsiJavaModule javaModule = javaModules.iterator().next(); + refJavaModule = new RefJavaModuleImpl(javaModule, myRefManager); + myJavaModules.put(name, refJavaModule); + } + } + return refJavaModule; + } public boolean isEntryPoint(final RefElement element) { UnusedDeclarationInspectionBase tool = getDeadCodeTool(element); @@ -279,6 +300,9 @@ public class RefJavaManagerImpl extends RefJavaManager { else if (PACKAGE.equals(type)) { return RefPackageImpl.packageFromFQName(myRefManager, fqName); } + else if (JAVA_MODULE.equals(type)) { + return RefJavaModuleImpl.javaModuleFromExternalName(myRefManager, fqName); + } return null; } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java index 81795ee03dd7..c1ab0a21d655 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaModuleImpl.java @@ -117,6 +117,7 @@ public class RefJavaModuleImpl extends RefElementImpl implements RefJavaModule { } } } + ((RefModuleImpl)myRefModule).add(this); getRefManager().fireBuildReferences(this); } } @@ -139,4 +140,8 @@ public class RefJavaModuleImpl extends RefElementImpl implements RefJavaModule { } return resolvedElements.size() == 1 ? resolvedElements.get(0) : null; } + + static RefEntity javaModuleFromExternalName(RefManagerImpl manager, String name) { + return manager.getExtension(RefJavaManager.MANAGER).getRefJavaModule(name); + } }