[java] improved light module caching; assertion-free lookup method (IDEA-CR-55150)

GitOrigin-RevId: 6942cf391ef71a92ca0ecd2e22fd848dd5f14587
This commit is contained in:
Roman Shevchenko
2019-11-13 23:10:58 +01:00
committed by intellij-monorepo-bot
parent 0437f034eb
commit 8b012b2a9e
4 changed files with 39 additions and 16 deletions

View File

@@ -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());
}
}
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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() {