mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java] caching .jar's multi-release flag (IDEA-228768)
GitOrigin-RevId: 29a578ccdafca7b5b03642631e9a2ba050cb29e1
This commit is contained in:
committed by
intellij-monorepo-bot
parent
98f2b7f38f
commit
8ddfc3cf52
+19
-6
@@ -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<PsiJavaModule>
|
||||
return results;
|
||||
}
|
||||
|
||||
private static final Key<CachedValue<Boolean>> 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<Boolean> 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) {
|
||||
|
||||
Reference in New Issue
Block a user