From 4a701ead670da4762b964d07c82cc03d671e653e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 25 Nov 2019 11:48:23 +0100 Subject: [PATCH] IDEA-CR-55081 review follow-up: create more precise compilation scope when particular files are recompiled (IDEA-226671) GitOrigin-RevId: 2c0d4a694fa1a98d1718d038feedf813b4e6c445 --- .../compiler/impl/CompileScopeUtil.java | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileScopeUtil.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileScopeUtil.java index fa8f37af2977..28032a6fecda 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileScopeUtil.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileScopeUtil.java @@ -30,6 +30,7 @@ import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.incremental.artifacts.ArtifactBuildTargetType; import java.util.*; +import java.util.function.Function; /** * @author nik @@ -70,22 +71,39 @@ public class CompileScopeUtil { } public static void addScopesForSourceSets(Collection sets, Collection unloadedModules, List scopes, boolean forceBuild) { - if (!sets.isEmpty() || !unloadedModules.isEmpty()) { - for (ModuleSourceSet set : sets) { - final BuildTargetType targetType = toTargetType(set); - assert targetType != null; - - TargetTypeBuildScope.Builder builder = TargetTypeBuildScope.newBuilder().setTypeId(targetType.getTypeId()).setForceBuild(forceBuild); - builder.addTargetId(set.getModule().getName()); - for (String unloadedModule : unloadedModules) { - builder.addTargetId(unloadedModule); - } - scopes.add(builder.build()); + if (sets.isEmpty() && unloadedModules.isEmpty()) { + return; + } + final Map, Set> targetsByType = new HashMap<>(); + final Function, Set> idsOf = targetType -> { + Set ids = targetsByType.get(targetType); + if (ids == null) { + ids = new HashSet<>(); + targetsByType.put(targetType, ids); } + return ids; + }; + for (ModuleSourceSet set : sets) { + final BuildTargetType targetType = toTargetType(set); + assert targetType != null; + idsOf.apply(targetType).add(set.getModule().getName()); + } + if (!unloadedModules.isEmpty()) { + for (JavaModuleBuildTargetType targetType : JavaModuleBuildTargetType.ALL_TYPES) { + idsOf.apply(targetType).addAll(unloadedModules); + } + } + + for (Map.Entry, Set> entry : targetsByType.entrySet()) { + TargetTypeBuildScope.Builder builder = TargetTypeBuildScope.newBuilder().setTypeId(entry.getKey().getTypeId()).setForceBuild(forceBuild); + for (String targetId : entry.getValue()) { + builder.addTargetId(targetId); + } + scopes.add(builder.build()); } } - private static BuildTargetType toTargetType(ModuleSourceSet set) { + private static BuildTargetType toTargetType(ModuleSourceSet set) { switch (set.getType()) { case TEST: return JavaModuleBuildTargetType.TEST; case PRODUCTION: return JavaModuleBuildTargetType.PRODUCTION;