From a4bbe2486c80d034397490c3a04a6c8857d89ed4 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Sat, 2 Aug 2014 00:55:00 +0400 Subject: [PATCH] Fixed collecting source files for multiple modules in incremental compilation. Error led to analyzing same file twice. --- .../org/jetbrains/jet/jps/build/KotlinBuilder.java | 9 ++++++--- .../build/KotlinBuilderModuleScriptGenerator.java | 14 ++++++++------ .../jet/jps/build/KotlinSourceFileCollector.java | 9 +++++---- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java index 6d3d6195ffd..a91685071d8 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import gnu.trove.THashSet; import kotlin.Pair; import org.jetbrains.annotations.NotNull; @@ -180,9 +181,11 @@ public class KotlinBuilder extends ModuleLevelBuilder { NO_LOCATION); } - List filesToCompile = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder); - filesToCompile.removeAll(allCompiledFiles); - allCompiledFiles.addAll(filesToCompile); + MultiMap filesToCompile = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder); + for (ModuleBuildTarget target : filesToCompile.keySet()) { + filesToCompile.getModifiable(target).removeAll(allCompiledFiles); + } + allCompiledFiles.addAll(filesToCompile.values()); Set processedTargetsWithRemoved = getProcessedTargetsWithRemovedFilesContainer(context); diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java index 709832ed8cc..9313558cc2c 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.jps.build; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder; @@ -56,7 +57,7 @@ public class KotlinBuilderModuleScriptGenerator { public static File generateModuleDescription( CompileContext context, ModuleChunk chunk, - List sourceFiles, // ignored for non-incremental compilation + MultiMap sourceFiles, // ignored for non-incremental compilation boolean hasRemovedFiles ) throws IOException @@ -73,15 +74,16 @@ public class KotlinBuilderModuleScriptGenerator { for (ModuleBuildTarget target : chunk.getTargets()) { File outputDir = getOutputDir(target); - if (!IncrementalCompilation.ENABLED) { - sourceFiles = new ArrayList(KotlinSourceFileCollector.getAllKotlinSourceFiles(target)); - } + List moduleSources = new ArrayList( + IncrementalCompilation.ENABLED + ? sourceFiles.get(target) + : KotlinSourceFileCollector.getAllKotlinSourceFiles(target)); if (sourceFiles.size() > 0 || hasRemovedFiles) { noSources = false; if (logger.isEnabled()) { - logger.logCompiledFiles(sourceFiles, KotlinBuilder.KOTLIN_BUILDER_NAME, "Compiling files:"); + logger.logCompiledFiles(moduleSources, KotlinBuilder.KOTLIN_BUILDER_NAME, "Compiling files:"); } } @@ -89,7 +91,7 @@ public class KotlinBuilderModuleScriptGenerator { target.getId(), outputDir.getAbsolutePath(), getKotlinModuleDependencies(context, target), - sourceFiles, + moduleSources, target.isTests(), // this excludes the output directories from the class path, to be removed for true incremental compilation outputDirs diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinSourceFileCollector.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinSourceFileCollector.java index 7eba8646b52..04566c5e5fc 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinSourceFileCollector.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinSourceFileCollector.java @@ -22,6 +22,7 @@ import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.util.Function; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.FileProcessor; @@ -39,21 +40,21 @@ import java.util.List; public class KotlinSourceFileCollector { // For incremental compilation - public static List getDirtySourceFiles(DirtyFilesHolder dirtyFilesHolder) + public static MultiMap getDirtySourceFiles(DirtyFilesHolder dirtyFilesHolder) throws IOException { - final List sourceFiles = ContainerUtil.newArrayList(); + final MultiMap result = new MultiMap(); dirtyFilesHolder.processDirtyFiles(new FileProcessor() { @Override public boolean apply(ModuleBuildTarget target, File file, JavaSourceRootDescriptor root) throws IOException { if (isKotlinSourceFile(file)) { - sourceFiles.add(file); + result.putValue(target, file); } return true; } }); - return sourceFiles; + return result; } @NotNull