From d422bb9827a6029705dbc49c7a87b9a350b588a9 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 4 Jun 2015 14:46:39 +0300 Subject: [PATCH] Do not recompile module when anonymous object or local class is changed. Original commit: 0bf249d6aec12f04a55b0c7da2adf4ee1ef6ee9d --- .../kotlin/jps/incremental/IncrementalCacheImpl.kt | 14 +++++++++----- .../jps/build/IncrementalJpsTestGenerated.java | 6 ++++++ .../pureKotlin/anonymousObjectChanged/a.kt.new | 1 - .../pureKotlin/anonymousObjectChanged/build.log | 7 ------- .../incremental/pureKotlin/localClassChanged/a.kt | 9 +++++++++ .../pureKotlin/localClassChanged/a.kt.new | 11 +++++++++++ .../pureKotlin/localClassChanged/build.log | 8 ++++++++ .../pureKotlin/localClassChanged/unrelated.kt | 5 +++++ 8 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt.new create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/build.log create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/unrelated.kt 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 22d975f5dc7..d300068fb41 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 @@ -143,11 +143,15 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen inlinesChanged = false ) header.isCompatibleClassKind() -> - getRecompilationDecision( - protoChanged = protoMap.put(className, BitEncoding.decodeBytes(header.annotationData)), - constantsChanged = constantsMap.process(className, fileBytes), - inlinesChanged = inlineFunctionsMap.process(className, fileBytes) - ) + when (header.classKind!!) { + JvmAnnotationNames.KotlinClass.Kind.CLASS -> getRecompilationDecision( + protoChanged = protoMap.put(className, BitEncoding.decodeBytes(header.annotationData)), + constantsChanged = constantsMap.process(className, fileBytes), + inlinesChanged = inlineFunctionsMap.process(className, fileBytes) + ) + + JvmAnnotationNames.KotlinClass.Kind.LOCAL_CLASS, JvmAnnotationNames.KotlinClass.Kind.ANONYMOUS_OBJECT -> DO_NOTHING + } header.syntheticClassKind == JvmAnnotationNames.KotlinSyntheticClass.Kind.PACKAGE_PART -> { assert(sourceFiles.size() == 1) { "Package part from several source files: $sourceFiles" } 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 af9f1e8ce99..da0f6d5dd2c 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 @@ -287,6 +287,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("localClassChanged") + public void testLocalClassChanged() throws Exception { + String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/localClassChanged/"); + doTest(fileName); + } + @TestMetadata("moveClass") public void testMoveClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveClass/"); diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new index 6255f915194..37d68224ae2 100644 --- a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new +++ b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new @@ -1,6 +1,5 @@ package a -// Signatures in the class "...$main$1" have changed, thus we need to recompile the whole module fun foo() = object { fun baz() = ":)" } diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log index d2598525c01..c56d69d0001 100644 --- a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log +++ b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log @@ -5,11 +5,4 @@ out/production/module/a/APackage.class End of files Compiling files: src/a.kt -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 \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt new file mode 100644 index 00000000000..2924f1dad8b --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt @@ -0,0 +1,9 @@ +package test + +fun foo() { + class X { + fun bar() = 111 + } + + X().bar() +} diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt.new b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt.new new file mode 100644 index 00000000000..c1209c13075 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/a.kt.new @@ -0,0 +1,11 @@ +package test + +fun foo() { + class X { + fun bar() = 111 + fun baz() = ":)" + } + + X().bar() + X().baz() +} diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/build.log new file mode 100644 index 00000000000..38fe179639a --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/build.log @@ -0,0 +1,8 @@ +Cleaning output files: +out/production/module/test/TestPackage$a$*$foo$X.class +out/production/module/test/TestPackage$a$*.class +out/production/module/test/TestPackage.class +End of files +Compiling files: +src/a.kt +End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/unrelated.kt b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/unrelated.kt new file mode 100644 index 00000000000..f9d3d65eecf --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/localClassChanged/unrelated.kt @@ -0,0 +1,5 @@ +package unrelated + +fun main(args: Array) { + +} \ No newline at end of file