Fixed collecting source files for multiple modules in incremental compilation.

Error led to analyzing same file twice.
This commit is contained in:
Evgeny Gerashchenko
2014-08-02 00:55:00 +04:00
parent f2b1879aae
commit a4bbe2486c
3 changed files with 19 additions and 13 deletions
@@ -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<File> filesToCompile = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder);
filesToCompile.removeAll(allCompiledFiles);
allCompiledFiles.addAll(filesToCompile);
MultiMap<ModuleBuildTarget, File> filesToCompile = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder);
for (ModuleBuildTarget target : filesToCompile.keySet()) {
filesToCompile.getModifiable(target).removeAll(allCompiledFiles);
}
allCompiledFiles.addAll(filesToCompile.values());
Set<ModuleBuildTarget> processedTargetsWithRemoved = getProcessedTargetsWithRemovedFilesContainer(context);
@@ -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<File> sourceFiles, // ignored for non-incremental compilation
MultiMap<ModuleBuildTarget, File> 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<File>(KotlinSourceFileCollector.getAllKotlinSourceFiles(target));
}
List<File> moduleSources = new ArrayList<File>(
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
@@ -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<File> getDirtySourceFiles(DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder)
public static MultiMap<ModuleBuildTarget, File> getDirtySourceFiles(DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder)
throws IOException
{
final List<File> sourceFiles = ContainerUtil.newArrayList();
final MultiMap<ModuleBuildTarget, File> result = new MultiMap<ModuleBuildTarget, File>();
dirtyFilesHolder.processDirtyFiles(new FileProcessor<JavaSourceRootDescriptor, ModuleBuildTarget>() {
@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