From 8d02c74ddde8f96ddd3b0b3d65ffb5473189747d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 5 Feb 2015 16:06:37 +0300 Subject: [PATCH] Correctly processing disappeared protos, files with constants/inline function. Original commit: c5593a5b80c8d236b95425da632dd74cbaf17556 --- .../jetbrains/kotlin/jps/build/KotlinBuilder.kt | 5 ++++- .../jps/incremental/IncrementalCacheImpl.kt | 15 ++++++++++++++- .../jps/build/IncrementalJpsTestGenerated.java | 12 ++++++++++++ .../pureKotlin/classRecreated/build.log | 9 ++++++++- .../pureKotlin/fileWithConstantRemoved/build.log | 16 ++++++++++++++++ .../pureKotlin/fileWithConstantRemoved/const.kt | 3 +++ .../fileWithConstantRemoved/const.kt.delete | 0 .../pureKotlin/fileWithConstantRemoved/usage.kt | 5 +++++ .../fileWithInlineFunctionRemoved/build.log | 15 +++++++++++++++ .../fileWithInlineFunctionRemoved/inline.kt | 6 ++++++ .../inline.kt.delete | 0 .../fileWithInlineFunctionRemoved/usage.kt | 7 +++++++ 12 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/build.log create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt.delete create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/usage.kt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/build.log create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt.delete create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/usage.kt diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 8066a99462e..3d33cdead4d 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -289,7 +289,10 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR } if (!compilationErrors) { - incrementalCaches.values().forEach { it.clearCacheForRemovedClasses() } + incrementalCaches.values().forEach { + val newDecision = it.clearCacheForRemovedClasses() + recompilationDecision = recompilationDecision.merge(newDecision) + } } return recompilationDecision diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt index 047e36da0a1..1d720f8f2e1 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt @@ -176,15 +176,26 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen return DO_NOTHING } - public fun clearCacheForRemovedClasses() { + public fun clearCacheForRemovedClasses(): RecompilationDecision { + var recompilationDecision = DO_NOTHING for (internalClassName in dirtyOutputClassesMap.getDirtyOutputClasses()) { val className = JvmClassName.byInternalName(internalClassName) + + val newDecision = when { + internalClassName in inlineFunctionsMap -> RECOMPILE_ALL_CHUNK_AND_DEPENDANTS + internalClassName in constantsMap -> RECOMPILE_OTHERS_WITH_DEPENDANTS + internalClassName in protoMap -> RECOMPILE_OTHERS_IN_CHUNK + else -> DO_NOTHING + } + recompilationDecision = recompilationDecision.merge(newDecision) + protoMap.remove(className) packagePartMap.remove(className) constantsMap.remove(className) inlineFunctionsMap.remove(className) } dirtyOutputClassesMap.clear() + return recompilationDecision } public override fun getObsoletePackageParts(): Collection { @@ -213,6 +224,8 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen protected abstract fun createMap(): PersistentHashMap + public fun contains(key: String): Boolean = storage.containsMapping(key) + public fun clean() { try { storage.close() diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index 1dfdbd8ab87..061b7694af7 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -225,6 +225,18 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("fileWithConstantRemoved") + public void testFileWithConstantRemoved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/"); + doTest(fileName); + } + + @TestMetadata("fileWithInlineFunctionRemoved") + public void testFileWithInlineFunctionRemoved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/"); + doTest(fileName); + } + @TestMetadata("filesExchangePackages") public void testFilesExchangePackages() throws Exception { String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/filesExchangePackages/"); diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/classRecreated/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/classRecreated/build.log index c326658bdd5..e3cde4f577a 100644 --- a/jps/jps-plugin/testData/incremental/pureKotlin/classRecreated/build.log +++ b/jps/jps-plugin/testData/incremental/pureKotlin/classRecreated/build.log @@ -3,6 +3,13 @@ out/production/module/test/A.class End of files Compiling files: End of files +Cleaning output files: +out/production/module/test/TestPackage$other$*.class +out/production/module/test/TestPackage.class +End of files +Compiling files: +src/other.kt +End of files Compiling files: @@ -14,4 +21,4 @@ out/production/module/test/TestPackage.class End of files Compiling files: src/other.kt -End of files +End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/build.log new file mode 100644 index 00000000000..f7973c4cece --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/build.log @@ -0,0 +1,16 @@ +Cleaning output files: +out/production/module/test/TestPackage$const$*.class +out/production/module/test/TestPackage.class +End of files +Compiling files: +End of files +Cleaning output files: +out/production/module/usage/UsagePackage$usage$*.class +out/production/module/usage/UsagePackage.class +End of files +Compiling files: +src/usage.kt +End of files +COMPILATION FAILED +Unresolved reference: test +An annotation parameter must be a compile-time constant \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt new file mode 100644 index 00000000000..1572968f89f --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt @@ -0,0 +1,3 @@ +package test + +val CONST = "foo" diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt.delete b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/const.kt.delete new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/usage.kt b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/usage.kt new file mode 100644 index 00000000000..2781036fbd6 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithConstantRemoved/usage.kt @@ -0,0 +1,5 @@ +package usage + +deprecated(test.CONST) +val usage = "" + diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/build.log new file mode 100644 index 00000000000..e7e60e954c6 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/build.log @@ -0,0 +1,15 @@ +Cleaning output files: +out/production/module/inline/InlinePackage$inline$*.class +out/production/module/inline/InlinePackage.class +End of files +Compiling files: +End of files +Cleaning output files: +out/production/module/usage/UsagePackage$usage$*.class +out/production/module/usage/UsagePackage.class +End of files +Compiling files: +src/usage.kt +End of files +COMPILATION FAILED +Unresolved reference: f \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt new file mode 100644 index 00000000000..80d71e901a3 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt @@ -0,0 +1,6 @@ +package inline + +inline fun f(body: () -> Unit) { + println("i'm inline function") + body() +} diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt.delete b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/inline.kt.delete new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/usage.kt b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/usage.kt new file mode 100644 index 00000000000..6e64d97cde2 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/fileWithInlineFunctionRemoved/usage.kt @@ -0,0 +1,7 @@ +package usage + +fun main(args: Array) { + inline.f { + println("to be inlined") + } +}