mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-05 01:50:56 +07:00
[java] improved light module caching; assertion-free lookup method (IDEA-CR-55150)
GitOrigin-RevId: 6942cf391ef71a92ca0ecd2e22fd848dd5f14587
This commit is contained in:
committed by
intellij-monorepo-bot
parent
0437f034eb
commit
8b012b2a9e
@@ -65,7 +65,7 @@ public class JavaModuleGraphUtil {
|
||||
}
|
||||
}
|
||||
else if (root.getFileSystem() instanceof JarFileSystem && "jar".equalsIgnoreCase(root.getExtension())) {
|
||||
return LightJavaModule.getModule(PsiManager.getInstance(project), root);
|
||||
return LightJavaModule.findModule(PsiManager.getInstance(project), root);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ public class JavaModuleGraphUtil {
|
||||
VirtualFile manifest = files.get(0);
|
||||
String name = LightJavaModule.claimedModuleName(manifest);
|
||||
if (name != null) {
|
||||
return LightJavaModule.getModule(PsiManager.getInstance(module.getProject()), manifest.getParent().getParent());
|
||||
return LightJavaModule.findModule(PsiManager.getInstance(module.getProject()), manifest.getParent().getParent());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,11 +180,11 @@ public final class JavaFileManagerImpl implements JavaFileManager, Disposable {
|
||||
List<PsiJavaModule> results = new ArrayList<>(JavaModuleNameIndex.getInstance().get(moduleName, myManager.getProject(), excludingScope));
|
||||
|
||||
for (VirtualFile manifest : JavaSourceModuleNameIndex.getFilesByKey(moduleName, excludingScope)) {
|
||||
results.add(LightJavaModule.getModule(myManager, manifest.getParent().getParent()));
|
||||
ContainerUtil.addIfNotNull(results, LightJavaModule.findModule(myManager, manifest.getParent().getParent()));
|
||||
}
|
||||
|
||||
for (VirtualFile root : JavaAutoModuleNameIndex.getFilesByKey(moduleName, excludingScope)) {
|
||||
results.add(LightJavaModule.getModule(myManager, root));
|
||||
ContainerUtil.addIfNotNull(results, LightJavaModule.findModule(myManager, root));
|
||||
}
|
||||
|
||||
return upgradeModules(sortModules(results, scope), moduleName, scope);
|
||||
|
||||
@@ -15,8 +15,10 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.javadoc.PsiDocComment;
|
||||
import com.intellij.psi.util.CachedValueProvider;
|
||||
import com.intellij.psi.util.CachedValuesManager;
|
||||
import com.intellij.psi.util.PsiModificationTracker;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -233,22 +235,39 @@ public class LightJavaModule extends LightElement implements PsiJavaModule {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static LightJavaModule getModule(@NotNull PsiManager manager, @NotNull VirtualFile root) {
|
||||
PsiFileSystemItem psiKey;
|
||||
/** @deprecated method scope was extended, use {@link #findModule} instead */
|
||||
@Deprecated
|
||||
@ApiStatus.ScheduledForRemoval(inVersion = "2021.1")
|
||||
public static @NotNull LightJavaModule getModule(@NotNull PsiManager manager, @NotNull VirtualFile root) {
|
||||
LightJavaModule module = findModule(manager, root);
|
||||
assert module != null : root;
|
||||
return module;
|
||||
}
|
||||
|
||||
/** The method is expected to be called on roots obtained from JavaAutoModuleNameIndex/JavaSourceModuleNameIndex */
|
||||
public static @Nullable LightJavaModule findModule(@NotNull PsiManager manager, @NotNull VirtualFile root) {
|
||||
PsiElement directory = manager.findDirectory(root);
|
||||
if (directory == null) return null;
|
||||
if (root.isInLocalFileSystem()) {
|
||||
VirtualFile manifest = root.findFileByRelativePath(JarFile.MANIFEST_NAME);
|
||||
assert manifest != null : root;
|
||||
psiKey = manager.findFile(manifest);
|
||||
return CachedValuesManager.getCachedValue(directory, () -> {
|
||||
VirtualFile manifest = root.findFileByRelativePath(JarFile.MANIFEST_NAME);
|
||||
if (manifest != null) {
|
||||
PsiElement file = manager.findFile(manifest);
|
||||
if (file != null) {
|
||||
String name = claimedModuleName(manifest);
|
||||
LightJavaModule module = name != null ? new LightJavaModule(manager, root, name) : null;
|
||||
return CachedValueProvider.Result.create(module, file);
|
||||
}
|
||||
}
|
||||
return CachedValueProvider.Result.create(null, PsiModificationTracker.MODIFICATION_COUNT);
|
||||
});
|
||||
}
|
||||
else {
|
||||
psiKey = manager.findDirectory(root);
|
||||
return CachedValuesManager.getCachedValue(directory, () -> {
|
||||
LightJavaModule module = new LightJavaModule(manager, root, moduleName(root));
|
||||
return CachedValueProvider.Result.create(module, directory);
|
||||
});
|
||||
}
|
||||
assert psiKey != null : root;
|
||||
return CachedValuesManager.getCachedValue(psiKey, () -> {
|
||||
LightJavaModule module = new LightJavaModule(manager, root, moduleName(root));
|
||||
return CachedValueProvider.Result.create(module, psiKey);
|
||||
});
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -120,6 +120,10 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() {
|
||||
requires lib.claimed;
|
||||
requires all.fours;
|
||||
}""".trimIndent())
|
||||
addFile(JarFile.MANIFEST_NAME, "Manifest-Version: 1.0\n", M4)
|
||||
highlight("""module M1 { requires <error descr="Module not found: all.fours">all.fours</error>; }""")
|
||||
addFile(JarFile.MANIFEST_NAME, "Manifest-Version: 1.0\nAutomatic-Module-Name: all.fours\n", M4)
|
||||
highlight("""module M1 { requires all.fours; }""")
|
||||
}
|
||||
|
||||
fun testExports() {
|
||||
|
||||
Reference in New Issue
Block a user