From 2eb051dbc21eac75d5f67e955fcd6f921b6840b6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 14 May 2014 20:39:15 +0400 Subject: [PATCH] Loading descriptors from incremental cache instead of package classes. Original commit: ca1ee69e4cd784a44a0f894bd00c8a457dfb573b --- jps/jps-plugin/jps-plugin.iml | 4 +- .../jet/jps/build/KotlinBuilder.java | 64 +++++++++++-------- .../KotlinBuilderModuleScriptGenerator.java | 5 ++ .../topLevelMembersInTwoPackages/build.log | 2 + 4 files changed, 46 insertions(+), 29 deletions(-) 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