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.openapi.util.text.StringUtil;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import gnu.trove.THashSet; import gnu.trove.THashSet;
import kotlin.Pair; import kotlin.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -180,9 +181,11 @@ public class KotlinBuilder extends ModuleLevelBuilder {
NO_LOCATION); NO_LOCATION);
} }
List<File> filesToCompile = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder); MultiMap<ModuleBuildTarget, File> filesToCompile = KotlinSourceFileCollector.getDirtySourceFiles(dirtyFilesHolder);
filesToCompile.removeAll(allCompiledFiles); for (ModuleBuildTarget target : filesToCompile.keySet()) {
allCompiledFiles.addAll(filesToCompile); filesToCompile.getModifiable(target).removeAll(allCompiledFiles);
}
allCompiledFiles.addAll(filesToCompile.values());
Set<ModuleBuildTarget> processedTargetsWithRemoved = getProcessedTargetsWithRemovedFilesContainer(context); 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.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder;
@@ -56,7 +57,7 @@ public class KotlinBuilderModuleScriptGenerator {
public static File generateModuleDescription( public static File generateModuleDescription(
CompileContext context, CompileContext context,
ModuleChunk chunk, ModuleChunk chunk,
List<File> sourceFiles, // ignored for non-incremental compilation MultiMap<ModuleBuildTarget, File> sourceFiles, // ignored for non-incremental compilation
boolean hasRemovedFiles boolean hasRemovedFiles
) )
throws IOException throws IOException
@@ -73,15 +74,16 @@ public class KotlinBuilderModuleScriptGenerator {
for (ModuleBuildTarget target : chunk.getTargets()) { for (ModuleBuildTarget target : chunk.getTargets()) {
File outputDir = getOutputDir(target); File outputDir = getOutputDir(target);
if (!IncrementalCompilation.ENABLED) { List<File> moduleSources = new ArrayList<File>(
sourceFiles = new ArrayList<File>(KotlinSourceFileCollector.getAllKotlinSourceFiles(target)); IncrementalCompilation.ENABLED
} ? sourceFiles.get(target)
: KotlinSourceFileCollector.getAllKotlinSourceFiles(target));
if (sourceFiles.size() > 0 || hasRemovedFiles) { if (sourceFiles.size() > 0 || hasRemovedFiles) {
noSources = false; noSources = false;
if (logger.isEnabled()) { 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(), target.getId(),
outputDir.getAbsolutePath(), outputDir.getAbsolutePath(),
getKotlinModuleDependencies(context, target), getKotlinModuleDependencies(context, target),
sourceFiles, moduleSources,
target.isTests(), target.isTests(),
// this excludes the output directories from the class path, to be removed for true incremental compilation // this excludes the output directories from the class path, to be removed for true incremental compilation
outputDirs outputDirs
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.Processor; import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.DirtyFilesHolder;
import org.jetbrains.jps.builders.FileProcessor; import org.jetbrains.jps.builders.FileProcessor;
@@ -39,21 +40,21 @@ import java.util.List;
public class KotlinSourceFileCollector { public class KotlinSourceFileCollector {
// For incremental compilation // For incremental compilation
public static List<File> getDirtySourceFiles(DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder) public static MultiMap<ModuleBuildTarget, File> getDirtySourceFiles(DirtyFilesHolder<JavaSourceRootDescriptor, ModuleBuildTarget> dirtyFilesHolder)
throws IOException throws IOException
{ {
final List<File> sourceFiles = ContainerUtil.newArrayList(); final MultiMap<ModuleBuildTarget, File> result = new MultiMap<ModuleBuildTarget, File>();
dirtyFilesHolder.processDirtyFiles(new FileProcessor<JavaSourceRootDescriptor, ModuleBuildTarget>() { dirtyFilesHolder.processDirtyFiles(new FileProcessor<JavaSourceRootDescriptor, ModuleBuildTarget>() {
@Override @Override
public boolean apply(ModuleBuildTarget target, File file, JavaSourceRootDescriptor root) throws IOException { public boolean apply(ModuleBuildTarget target, File file, JavaSourceRootDescriptor root) throws IOException {
if (isKotlinSourceFile(file)) { if (isKotlinSourceFile(file)) {
sourceFiles.add(file); result.putValue(target, file);
} }
return true; return true;
} }
}); });
return sourceFiles; return result;
} }
@NotNull @NotNull