diff --git a/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java b/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java index 3469225ec74..2091b635e95 100644 --- a/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java +++ b/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilder.java @@ -65,6 +65,7 @@ import static org.jetbrains.jet.compiler.runner.KotlinCompilerRunner.runK2JvmCom public class KotlinBuilder extends ModuleLevelBuilder { private static final Key> ALL_COMPILED_FILES_KEY = Key.create("_all_kotlin_compiled_files_"); + private static final Key> PROCESSED_TARGETS_WITH_REMOVED_FILES = Key.create("_processed_targets_with_removed_files_"); public static final String KOTLIN_BUILDER_NAME = "Kotlin Builder"; private static final List COMPILABLE_FILE_EXTENSIONS = Collections.singletonList("kt"); @@ -172,7 +173,20 @@ public class KotlinBuilder extends ModuleLevelBuilder { filesToCompile.removeAll(allCompiledFiles); allCompiledFiles.addAll(filesToCompile); - File moduleFile = KotlinBuilderModuleScriptGenerator.generateModuleDescription(context, chunk, filesToCompile); + Set processedTargetsWithRemoved = getProcessedTargetsWithRemovedFilesContainer(context); + + boolean haveRemovedFiles = false; + for (ModuleBuildTarget target : chunk.getTargets()) { + if (processedTargetsWithRemoved.add(target)) { + if (!dirtyFilesHolder.getRemovedFiles(target).isEmpty()) { + haveRemovedFiles = true; + break; + } + } + } + + File moduleFile = KotlinBuilderModuleScriptGenerator + .generateModuleDescription(context, chunk, filesToCompile, haveRemovedFiles); if (moduleFile == null) { // No Kotlin sources found return ExitCode.NOTHING_DONE; @@ -198,17 +212,20 @@ public class KotlinBuilder extends ModuleLevelBuilder { IncrementalCache cache = new IncrementalCache(KotlinBuilderModuleScriptGenerator.getIncrementalCacheDir(context)); try { + for (ModuleBuildTarget target : chunk.getTargets()) { + for (String file : dirtyFilesHolder.getRemovedFiles(target)) { + cache.clearPackagePartSourceData(target.getId(), new File(file)); + } + } + boolean significantChanges = false; for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) { BuildTarget target = null; Collection sourceFiles = outputItem.getSourceFiles(); - if (sourceFiles != null && !sourceFiles.isEmpty()) { + if (!sourceFiles.isEmpty()) { target = sourceToTarget.get(sourceFiles.iterator().next()); } - else { - messageCollector.report(EXCEPTION, "KotlinBuilder: outputItem.sourceFiles is null or empty, outputItem = " + outputItem, NO_LOCATION); - } if (target == null) { target = representativeTarget; @@ -217,7 +234,7 @@ public class KotlinBuilder extends ModuleLevelBuilder { File outputFile = outputItem.getOutputFile(); if (IncrementalCompilation.ENABLED) { - if (cache.saveFileToCache(target.getId(), outputFile)) { + if (cache.saveFileToCache(target.getId(), sourceFiles, outputFile)) { significantChanges = true; } } @@ -255,6 +272,15 @@ public class KotlinBuilder extends ModuleLevelBuilder { return allCompiledFiles; } + private static Set getProcessedTargetsWithRemovedFilesContainer(CompileContext context) { + Set set = PROCESSED_TARGETS_WITH_REMOVED_FILES.get(context); + if (set == null) { + set = new HashSet(); + PROCESSED_TARGETS_WITH_REMOVED_FILES.set(context, set); + } + return set; + } + private static boolean hasKotlinFiles(@NotNull ModuleChunk chunk) { boolean hasKotlinFiles = false; for (ModuleBuildTarget target : chunk.getTargets()) { diff --git a/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java b/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java index 0adc2694d14..4604f978def 100644 --- a/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java +++ b/jps/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java @@ -59,7 +59,8 @@ public class KotlinBuilderModuleScriptGenerator { public static File generateModuleDescription( CompileContext context, ModuleChunk chunk, - List sourceFiles // ignored for non-incremental compilation + List sourceFiles, // ignored for non-incremental compilation + boolean hasRemovedFiles ) throws IOException { @@ -79,7 +80,7 @@ public class KotlinBuilderModuleScriptGenerator { sourceFiles = new ArrayList(KotlinSourceFileCollector.getAllKotlinSourceFiles(target)); } - if (sourceFiles.size() > 0) { + if (sourceFiles.size() > 0 || hasRemovedFiles) { noSources = false; if (logger.isEnabled()) {