diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaModuleNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaModuleNameIndex.java index 08152a07c769..6c91cd6700fc 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaModuleNameIndex.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaModuleNameIndex.java @@ -3,6 +3,7 @@ package com.intellij.psi.impl.java.stubs.index; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiJavaModule; import com.intellij.psi.impl.search.JavaSourceFilterScope; @@ -10,6 +11,9 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.psi.stubs.StubIndex; import com.intellij.psi.stubs.StubIndexKey; +import com.intellij.psi.util.CachedValue; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.util.CachedValueImpl; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -108,15 +112,24 @@ public class JavaModuleNameIndex extends StringStubIndexExtension return results; } + private static final Key> MULTI_RELEASE_KEY = Key.create("jar.multi.release.key"); + private static boolean isMultiReleaseJar(VirtualFile root) { VirtualFile manifest = root.findFileByRelativePath(JarFile.MANIFEST_NAME); - if (manifest != null) { - try (InputStream stream = manifest.getInputStream()) { - return Boolean.valueOf(new Manifest(stream).getMainAttributes().getValue(new Attributes.Name("Multi-Release"))); - } - catch (IOException ignored) { } + if (manifest == null) return false; + + CachedValue value = manifest.getUserData(MULTI_RELEASE_KEY); + if (value == null) { + manifest.putUserData(MULTI_RELEASE_KEY, value = new CachedValueImpl<>(() -> { + Boolean result = Boolean.FALSE; + try (InputStream stream = manifest.getInputStream()) { + result = Boolean.valueOf(new Manifest(stream).getMainAttributes().getValue(new Attributes.Name("Multi-Release"))); + } + catch (IOException ignored) { } + return CachedValueProvider.Result.create(result, manifest); + })); } - return false; + return value.getValue(); } private static int version(VirtualFile dir) {