From 56fd3fac7b7981e4e78e1ec93de16272ca479ce0 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 24 Sep 2021 22:00:32 +0200 Subject: [PATCH] [java] cache no results lookup for module-info (IDEA-278296) GitOrigin-RevId: 18026b763aaeabc1eee42662cffc3c3376c5b9ed --- .../impl/analysis/JavaModuleGraphUtil.java | 63 ++++++++++++------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaModuleGraphUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaModuleGraphUtil.java index 8ca99fbb4c4d..f62587fbd96b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaModuleGraphUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaModuleGraphUtil.java @@ -91,30 +91,47 @@ public final class JavaModuleGraphUtil { } public static @Nullable PsiJavaModule findDescriptorByModule(@Nullable Module module, boolean inTests) { - if (module != null) { - Project project = module.getProject(); - JavaSourceRootType rootType = inTests ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; - List sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(rootType); - List files = ContainerUtil.mapNotNull(sourceRoots, root -> root.findChild(PsiJavaModule.MODULE_INFO_FILE)); - if (files.size() == 1) { - PsiFile psiFile = PsiManager.getInstance(project).findFile(files.get(0)); - if (psiFile instanceof PsiJavaFile) { - return ((PsiJavaFile)psiFile).getModuleDeclaration(); - } + if (module == null) return null; + CachedValuesManager valuesManager = CachedValuesManager.getManager(module.getProject()); + PsiJavaModule javaModule = inTests //to have different providers for production and tests + ? valuesManager.getCachedValue(module, () -> createModuleCacheResult(module, true)) + : valuesManager.getCachedValue(module, () -> createModuleCacheResult(module, false)); + return javaModule != null && javaModule.isValid() ? javaModule : null; + } + + @NotNull + private static Result createModuleCacheResult(@NotNull Module module, + boolean inTests) { + Project project = module.getProject(); + return new Result<>(findDescriptionByModuleInner(module, inTests), + ProjectRootModificationTracker.getInstance(project), + PsiModificationTracker.SERVICE.getInstance(project)); + } + + @Nullable + private static PsiJavaModule findDescriptionByModuleInner(@NotNull Module module, boolean inTests) { + Project project = module.getProject(); + JavaSourceRootType rootType = inTests ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; + List sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(rootType); + List files = ContainerUtil.mapNotNull(sourceRoots, root -> root.findChild(PsiJavaModule.MODULE_INFO_FILE)); + if (files.size() == 1) { + PsiFile psiFile = PsiManager.getInstance(project).findFile(files.get(0)); + if (psiFile instanceof PsiJavaFile) { + return ((PsiJavaFile)psiFile).getModuleDeclaration(); } - else if (files.isEmpty()) { - files = ContainerUtil.mapNotNull(sourceRoots, root -> root.findFileByRelativePath(JarFile.MANIFEST_NAME)); - if (files.size() == 1) { - VirtualFile manifest = files.get(0); - PsiFile manifestPsi = PsiManager.getInstance(project).findFile(manifest); - assert manifestPsi != null : manifest; - return CachedValuesManager.getCachedValue(manifestPsi, () -> { - String name = LightJavaModule.claimedModuleName(manifest); - LightJavaModule result = - name != null ? LightJavaModule.create(PsiManager.getInstance(project), manifest.getParent().getParent(), name) : null; - return Result.create(result, manifestPsi, ProjectRootModificationTracker.getInstance(project)); - }); - } + } + else if (files.isEmpty()) { + files = ContainerUtil.mapNotNull(sourceRoots, root -> root.findFileByRelativePath(JarFile.MANIFEST_NAME)); + if (files.size() == 1) { + VirtualFile manifest = files.get(0); + PsiFile manifestPsi = PsiManager.getInstance(project).findFile(manifest); + assert manifestPsi != null : manifest; + return CachedValuesManager.getCachedValue(manifestPsi, () -> { + String name = LightJavaModule.claimedModuleName(manifest); + LightJavaModule result = + name != null ? LightJavaModule.create(PsiManager.getInstance(project), manifest.getParent().getParent(), name) : null; + return Result.create(result, manifestPsi, ProjectRootModificationTracker.getInstance(project)); + }); } }