From 2ca3b519d5347a7c973149deb42f1739e649d74d Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Sun, 18 Mar 2012 22:54:26 +0100 Subject: [PATCH] fix dependencies direction in the assertion --- .../jps/incremental/ModuleLevelBuilder.java | 25 ++++++++++++++++--- .../src/org/jetbrains/jps/ProjectPaths.java | 4 +-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java index dc478e50f3f6..4c4a3e7f78f4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java @@ -151,21 +151,40 @@ public abstract class ModuleLevelBuilder extends Builder { if (affected.isEmpty()) { return Collections.emptyList(); } - final Set allowedModules = ProjectPaths.getModulesWithDependentsRecursively(currentChunk, true); + + final Set chunkModules = currentChunk.getModules(); + final Map> cache = new HashMap>(); final List> result = new ArrayList>(); + for (File file : affected) { final RootDescriptor moduleAndRoot = context.getModuleAndRoot(file); if (moduleAndRoot == null) { continue; } final Module moduleOfFile = moduleAndRoot.module; - if (!allowedModules.contains(moduleOfFile)) { - result.add(Pair.create(file, moduleOfFile)); + if (chunkModules.contains(moduleOfFile)) { + continue; } + Set moduleOfFileWithDependencies = cache.get(moduleOfFile); + if (moduleOfFileWithDependencies == null) { + moduleOfFileWithDependencies = ProjectPaths.getModulesWithDependentsRecursively(moduleOfFile, true); + cache.put(moduleOfFile, moduleOfFileWithDependencies); + } + if (intersects(moduleOfFileWithDependencies, chunkModules)) { + continue; + } + result.add(Pair.create(file, moduleOfFile)); } return result; } + private static boolean intersects(Set set1, Set set2) { + if (set1.size() < set2.size()) { + return new HashSet(set1).removeAll(set2); + } + return new HashSet(set2).removeAll(set1); + } + private static boolean chunkContainsAffectedFiles(CompileContext context, ModuleChunk chunk, final Set affected) throws IOException { final Set chunkModules = new HashSet(chunk.getModules()); if (!chunkModules.isEmpty()) { diff --git a/jps/model/src/org/jetbrains/jps/ProjectPaths.java b/jps/model/src/org/jetbrains/jps/ProjectPaths.java index 1c3858d78ba0..f4eb61024a37 100644 --- a/jps/model/src/org/jetbrains/jps/ProjectPaths.java +++ b/jps/model/src/org/jetbrains/jps/ProjectPaths.java @@ -181,9 +181,9 @@ public class ProjectPaths { return sourcePaths; } - public static Set getModulesWithDependentsRecursively(final ModuleChunk chunk, final boolean includeTests) { + public static Set getModulesWithDependentsRecursively(final Module module, final boolean includeTests) { final Set result = new HashSet(); - collectPathsRecursively(chunk, ClasspathKind.compile(includeTests), new PathsGetter() { + collectPathsRecursively(module, ClasspathKind.compile(includeTests), new HashSet(), new PathsGetter() { public void apply(Module module, ClasspathKind kind) { result.add(module); }