diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt index 15200c06ce1..390bf2544ca 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt @@ -160,7 +160,7 @@ open class IncrementalCacheImpl( packagePartMap.addPackagePart(className) protoMap.process(kotlinClass, isPackage = true) + - constantsMap.process(kotlinClass) + + constantsMap.process(kotlinClass, isPackage = true) + inlineFunctionsMap.process(kotlinClass, isPackage = true) } KotlinClassHeader.Kind.MULTIFILE_CLASS -> { @@ -175,7 +175,7 @@ open class IncrementalCacheImpl( classFqNameToSourceMap.remove(className.fqNameForClassNameWithoutDollars) // TODO NO_CHANGES? (delegates only) - constantsMap.process(kotlinClass) + + constantsMap.process(kotlinClass, isPackage = true) + inlineFunctionsMap.process(kotlinClass, isPackage = true) } KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> { @@ -184,7 +184,7 @@ open class IncrementalCacheImpl( partToMultifileFacade.set(className.internalName, header.multifileClassName!!) protoMap.process(kotlinClass, isPackage = true) + - constantsMap.process(kotlinClass) + + constantsMap.process(kotlinClass, isPackage = true) + inlineFunctionsMap.process(kotlinClass, isPackage = true) } KotlinClassHeader.Kind.CLASS -> { @@ -192,7 +192,7 @@ open class IncrementalCacheImpl( addToClassStorage(kotlinClass, sourceFiles.first()) protoMap.process(kotlinClass, isPackage = false) + - constantsMap.process(kotlinClass) + + constantsMap.process(kotlinClass, isPackage = true) + inlineFunctionsMap.process(kotlinClass, isPackage = false) } else -> CompilationResult.NO_CHANGES @@ -426,11 +426,11 @@ open class IncrementalCacheImpl( operator fun contains(className: JvmClassName): Boolean = className.internalName in storage - fun process(kotlinClass: LocalFileKotlinClass): CompilationResult { - return put(kotlinClass.className, getConstantsMap(kotlinClass.fileContents)) + fun process(kotlinClass: LocalFileKotlinClass, isPackage: Boolean): CompilationResult { + return put(kotlinClass.className, getConstantsMap(kotlinClass.fileContents), isPackage) } - private fun put(className: JvmClassName, constantsMap: Map?): CompilationResult { + private fun put(className: JvmClassName, constantsMap: Map?, isPackage: Boolean): CompilationResult { val key = className.internalName val oldMap = storage[key] @@ -440,14 +440,30 @@ open class IncrementalCacheImpl( storage[key] = constantsMap } else { - storage.remove(key) + remove(className) } - return CompilationResult(constantsChanged = true) + val changes = + if (!IncrementalCompilation.isExperimental() || + constantsMap == null || constantsMap.isEmpty() || + oldMap == null || oldMap.isEmpty() + ) { + emptySequence() + } + else { + // we need only changed constants everything other should be covered by diff + val changedNames = oldMap.filter { constantsMap.containsKey(it.key) && constantsMap[it.key] != it.value }.map { it.key } + + val fqName = if (isPackage) className.packageFqName else className.fqNameForClassNameWithoutDollars + + sequenceOf(ChangeInfo.MembersChanged(fqName, changedNames)) + } + + return CompilationResult(constantsChanged = true, changes = changes) } fun remove(className: JvmClassName) { - put(className, null) + storage.remove(className.internalName) } override fun dumpValue(value: Map): String = diff --git a/jps-plugin/testData/incremental/lazyKotlinCaches/constant/experimental-ic-build.log b/jps-plugin/testData/incremental/lazyKotlinCaches/constant/experimental-ic-build.log new file mode 100644 index 00000000000..efacb1f6e61 --- /dev/null +++ b/jps-plugin/testData/incremental/lazyKotlinCaches/constant/experimental-ic-build.log @@ -0,0 +1,24 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/constant/ConstantKt.class +End of files +Compiling files: + src/constant.kt +End of files +Marked as dirty by Kotlin: + src/usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/constant/ConstantKt.class + out/production/module/usage/UsageKt.class +End of files +Compiling files: + src/constant.kt + src/usage.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps-plugin/testData/incremental/multiModule/constantValueChanged/experimental-ic-build.log b/jps-plugin/testData/incremental/multiModule/constantValueChanged/experimental-ic-build.log new file mode 100644 index 00000000000..26e3e9444c3 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/constantValueChanged/experimental-ic-build.log @@ -0,0 +1,30 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module1/META-INF/module1.kotlin_module + out/production/module1/test/Module1_constKt.class +End of files +Compiling files: + module1/src/module1_const.kt +End of files +Marked as dirty by Kotlin: + module2/src/module2_usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module1/META-INF/module1.kotlin_module + out/production/module1/test/Module1_constKt.class +End of files +Compiling files: + module1/src/module1_const.kt +End of files +Exit code: OK +------------------------------------------ +Cleaning output files: + out/production/module2/usage/Usage.class +End of files +Compiling files: + module2/src/module2_usage.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps-plugin/testData/incremental/pureKotlin/allConstants/experimental-ic-build.log b/jps-plugin/testData/incremental/pureKotlin/allConstants/experimental-ic-build.log new file mode 100644 index 00000000000..2b59cc2ecff --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/allConstants/experimental-ic-build.log @@ -0,0 +1,36 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/ConstKt.class +End of files +Compiling files: + src/const.kt +End of files +Exit code: OK +------------------------------------------ + +================ Step #2 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/ConstKt.class +End of files +Compiling files: + src/const.kt +End of files +Marked as dirty by Kotlin: + src/usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/ConstKt.class + out/production/module/test/Usage.class +End of files +Compiling files: + src/const.kt + src/usage.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/experimental-ic-build.log b/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/experimental-ic-build.log new file mode 100644 index 00000000000..5df3e1b0c32 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/packageConstantChanged/experimental-ic-build.log @@ -0,0 +1,24 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/ConstKt.class +End of files +Compiling files: + src/const.kt +End of files +Marked as dirty by Kotlin: + src/usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/ConstKt.class + out/production/module/test/Usage.class +End of files +Compiling files: + src/const.kt + src/usage.kt +End of files +Exit code: OK +------------------------------------------