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.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
|
||||||
|
|||||||
Reference in New Issue
Block a user