Fixed collecting source files for multiple modules in incremental compilation.
Error led to analyzing same file twice.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user