[java] module files change tracker - dumbing down (IDEA-CR-14933)

This commit is contained in:
Roman Shevchenko
2016-10-25 11:52:17 +02:00
parent de1fe1a140
commit 54a62c5bf2
4 changed files with 10 additions and 53 deletions
@@ -51,13 +51,13 @@ public class JavaModuleGraphUtil {
public static Collection<PsiJavaModule> findCycle(@NotNull PsiJavaModule module) {
Project project = module.getProject();
List<Set<PsiJavaModule>> cycles = CachedValuesManager.getManager(project).getCachedValue(project, () ->
Result.create(findCycles(project), JavaModuleFileChangeTracker.getInstance(project)));
Result.create(findCycles(project), JavaModuleFileChangeTracker.getDependencies(project)));
return ContainerUtil.find(cycles, set -> set.contains(module));
}
public static boolean exports(@NotNull PsiJavaModule source, @NotNull String packageName, @NotNull PsiJavaModule target) {
Map<String, Set<String>> exports = CachedValuesManager.getCachedValue(source, () ->
Result.create(exportsMap(source), JavaModuleFileChangeTracker.getInstance(source.getProject())));
Result.create(exportsMap(source), JavaModuleFileChangeTracker.getDependencies(source.getProject())));
Set<String> targets = exports.get(packageName);
return targets != null && (targets.isEmpty() || targets.contains(target.getModuleName()));
}
@@ -65,7 +65,7 @@ public class JavaModuleGraphUtil {
public static boolean reads(@NotNull PsiJavaModule source, @NotNull PsiJavaModule destination) {
Project project = source.getProject();
RequiresGraph graph = CachedValuesManager.getManager(project).getCachedValue(project, () ->
Result.create(buildRequiresGraph(project), JavaModuleFileChangeTracker.getInstance(project)));
Result.create(buildRequiresGraph(project), JavaModuleFileChangeTracker.getDependencies(project)));
return graph.reads(source, destination);
}
@@ -150,7 +150,7 @@ public class LightJavaModule extends LightElement implements PsiJavaModule {
@Override
public Result<LightJavaModule> compute(Pair<PsiManager, VirtualFile> p) {
LightJavaModule module = new LightJavaModule(p.first, p.second);
return Result.create(module, JavaModuleFileChangeTracker.getInstance(p.first.getProject()));
return Result.create(module, JavaModuleFileChangeTracker.getDependencies(p.first.getProject()));
}
}, false, pair(manager, jarRoot));
}
@@ -16,57 +16,14 @@
package com.intellij.psi.impl.source;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.psi.*;
import com.intellij.psi.PsiTreeChangeEvent;
import com.intellij.util.NotNullFunction;
import com.intellij.openapi.roots.ProjectRootModificationTracker;
import org.jetbrains.annotations.NotNull;
import static com.intellij.psi.PsiTreeChangeEvent.*;
public class JavaModuleFileChangeTracker implements ModificationTracker {
private static final NotNullLazyKey<ModificationTracker, Project> KEY = NotNullLazyKey.create("", new NotNullFunction<Project, ModificationTracker>() {
@NotNull
@Override
public ModificationTracker fun(Project project) {
return new JavaModuleFileChangeTracker(project);
}
});
import static com.intellij.psi.util.PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT;
public class JavaModuleFileChangeTracker {
@NotNull
public static ModificationTracker getInstance(@NotNull Project p) {
return KEY.getValue(p);
}
private volatile long myCount = 0;
private JavaModuleFileChangeTracker(Project project) {
PsiManager.getInstance(project).addPsiTreeChangeListener(new PsiTreeChangeAdapter() {
@Override public void childAdded(@NotNull PsiTreeChangeEvent event) { process(event.getFile()); }
@Override public void childRemoved(@NotNull PsiTreeChangeEvent event) { process(event.getFile()); }
@Override public void childReplaced(@NotNull PsiTreeChangeEvent event) { process(event.getFile()); }
@Override public void childMoved(@NotNull PsiTreeChangeEvent event) { process(event.getFile()); }
@Override public void childrenChanged(@NotNull PsiTreeChangeEvent event) { process(event.getFile()); }
private void process(PsiFile file) {
if (file != null && PsiJavaModule.MODULE_INFO_FILE.equals(file.getName())) {
myCount++;
}
}
@Override
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
String name = event.getPropertyName();
if (name == PROP_FILE_NAME || name == PROP_DIRECTORY_NAME || name == PROP_ROOTS) {
myCount++;
}
}
}, project);
}
@Override
public long getModificationCount() {
return myCount;
public static Object[] getDependencies(@NotNull Project project) {
return new Object[]{OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, ProjectRootModificationTracker.getInstance(project)};
}
}
@@ -137,7 +137,7 @@ public class PsiJavaModuleReference extends PsiReferenceBase.Poly<PsiJavaModuleR
public Result<PsiJavaModule> compute(Pair<String, Boolean> p) {
Collection<PsiJavaModule> modules = Resolver.findModules(refOwner.getContainingFile(), p.first, p.second);
PsiJavaModule module = modules.size() == 1 ? modules.iterator().next() : null;
return Result.create(module, JavaModuleFileChangeTracker.getInstance(refOwner.getProject()));
return Result.create(module, JavaModuleFileChangeTracker.getDependencies(refOwner.getProject()));
}
}, false, pair(refText, incompleteCode));
}