diff --git a/jps/jps-plugin/jps-plugin.iml b/jps/jps-plugin/jps-plugin.iml
index 1b4d326d32d..a7f222b8c6d 100644
--- a/jps/jps-plugin/jps-plugin.iml
+++ b/jps/jps-plugin/jps-plugin.iml
@@ -15,8 +15,8 @@
-
-
+
+
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 b0410f9e7e0..801220bb004 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
@@ -37,6 +37,7 @@ import org.jetbrains.jet.compiler.runner.OutputItemsCollectorImpl;
import org.jetbrains.jet.compiler.runner.SimpleOutputItem;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.jps.JpsKotlinCompilerSettings;
+import org.jetbrains.jet.lang.resolve.kotlin.incremental.IncrementalCache;
import org.jetbrains.jet.utils.PathUtil;
import org.jetbrains.jps.ModuleChunk;
import org.jetbrains.jps.builders.BuildTarget;
@@ -194,38 +195,47 @@ public class KotlinBuilder extends ModuleLevelBuilder {
}
}
- for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) {
- if (IncrementalCompilation.ENABLED) {
- // TODO this is a hack: we don't remove
- if (outputItem.getOutputFile().getName().endsWith("Package.class")) {
- continue;
+ IncrementalCache cache = new IncrementalCache(KotlinBuilderModuleScriptGenerator.getIncrementalCacheDir(context));
+
+ try {
+ for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) {
+ BuildTarget> target = null;
+ Collection sourceFiles = outputItem.getSourceFiles();
+ if (sourceFiles != null && !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;
+ }
+
+ File outputFile = outputItem.getOutputFile();
+
+ if (IncrementalCompilation.ENABLED) {
+ cache.saveFileToCache(target.getId(), outputFile);
+ }
+
+ outputConsumer.registerOutputFile(target, outputFile, paths(sourceFiles));
}
- BuildTarget> target = null;
- Collection sourceFiles = outputItem.getSourceFiles();
- if (sourceFiles != null && !sourceFiles.isEmpty()) {
- target = sourceToTarget.get(sourceFiles.iterator().next());
+
+ if (IncrementalCompilation.ENABLED) {
+ // TODO should mark dependencies as dirty, as well
+ FSOperations.markDirty(context, chunk, new FileFilter() {
+ @Override
+ public boolean accept(@NotNull File file) {
+ return !allCompiledFiles.contains(file);
+ }
+ });
+ return ExitCode.ADDITIONAL_PASS_REQUIRED;
}
else {
- messageCollector.report(EXCEPTION, "KotlinBuilder: outputItem.sourceFiles is null or empty, outputItem = " + outputItem, NO_LOCATION);
+ return ExitCode.OK;
}
-
- outputConsumer.registerOutputFile(target != null ? target : representativeTarget, outputItem.getOutputFile(),
- paths(sourceFiles));
- }
-
- if (IncrementalCompilation.ENABLED) {
- // TODO should mark dependencies as dirty, as well
- FSOperations.markDirty(context, chunk, new FileFilter() {
- @Override
- public boolean accept(@NotNull File file) {
- return !allCompiledFiles.contains(file);
- }
- });
- return ExitCode.ADDITIONAL_PASS_REQUIRED;
- }
- else {
- return ExitCode.OK;
+ } finally {
+ cache.close();
}
}
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 0ae30acd43f..0adc2694d14 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
@@ -90,6 +90,7 @@ public class KotlinBuilderModuleScriptGenerator {
builder.addModule(
target.getId(),
outputDir.getAbsolutePath(),
+ getIncrementalCacheDir(context).getAbsolutePath(),
getKotlinModuleDependencies(context, target),
sourceFiles,
target.isTests(),
@@ -109,6 +110,10 @@ public class KotlinBuilderModuleScriptGenerator {
return scriptFile;
}
+ public static File getIncrementalCacheDir(CompileContext context) {
+ return new File(context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(), "kotlin");
+ }
+
@NotNull
private static File getOutputDir(@NotNull ModuleBuildTarget target) {
File outputDir = target.getOutputDir();
diff --git a/jps/jps-plugin/testData/incremental/topLevelMembersInTwoPackages/build.log b/jps/jps-plugin/testData/incremental/topLevelMembersInTwoPackages/build.log
index 37736142dc4..08cb50b84f3 100644
--- a/jps/jps-plugin/testData/incremental/topLevelMembersInTwoPackages/build.log
+++ b/jps/jps-plugin/testData/incremental/topLevelMembersInTwoPackages/build.log
@@ -1,11 +1,13 @@
Cleaning output files:
out/production/module/test/TestPackage-a-*.class
+out/production/module/test/TestPackage.class
End of files
Compiling files:
src/a.kt
End of files
Cleaning output files:
out/production/module/test/TestPackage-b-*.class
+out/production/module/test/TestPackage.class
End of files
Compiling files:
src/b.kt