From 2abc422577498c9bb0ea8a9051b5508610cc32d9 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 25 Jan 2016 20:22:44 +0300 Subject: [PATCH] Fix updating java mappings for multifile facade --- .../incremental/IncrementalCacheImpl.kt | 7 ++++- .../kotlin/jps/build/KotlinBuilder.kt | 30 ++++++++++++++++--- ...perimentalIncrementalJpsTestGenerated.java | 6 ++++ .../multifilePackagePartMethodAdded/build.log | 20 +++++++++++++ .../multifilePackagePartMethodAdded/partA.kt | 4 +++ .../multifilePackagePartMethodAdded/partB.kt | 5 ++++ .../partB.kt.new.1 | 6 ++++ .../useFooF.kt | 3 ++ .../useFooG.kt | 3 ++ .../multifileClassFileAdded/build.log | 10 ------- .../experimental-ic-build.log | 5 ++++ 11 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/build.log create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partA.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt.new.1 create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooF.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooG.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/experimental-ic-build.log diff --git a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt index d1dc2a30c9c..2cabe2d4a52 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/IncrementalCacheImpl.kt @@ -124,6 +124,9 @@ open class IncrementalCacheImpl( fun getSourceFileIfClass(fqName: FqName): File? = classFqNameToSourceMap[fqName] + fun isMultifileFacade(className: JvmClassName): Boolean = + className.internalName in multifileFacadeToParts + override fun getClassFilePath(internalClassName: String): String { return toSystemIndependentName(File(outputDir, "$internalClassName.class").canonicalPath) } @@ -477,7 +480,9 @@ open class IncrementalCacheImpl( storage[facadeName.internalName] = partNames } - operator fun get(facadeName: String): Collection? = storage[facadeName] + operator fun get(internalName: String): Collection? = storage[internalName] + + operator fun contains(internalName: String): Boolean = internalName in storage fun remove(className: JvmClassName) { storage.remove(className.internalName) diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 3a0d2447b13..936410c8a2d 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -252,7 +252,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { } val generatedClasses = generatedFiles.filterIsInstance>() - updateJavaMappings(chunk, compilationErrors, context, dirtyFilesHolder, filesToCompile, generatedClasses) + updateJavaMappings(chunk, compilationErrors, context, dirtyFilesHolder, filesToCompile, generatedClasses, incrementalCaches) if (!IncrementalCompilation.isEnabled()) { return OK @@ -465,16 +465,38 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { context: CompileContext, dirtyFilesHolder: DirtyFilesHolder, filesToCompile: MultiMap, - generatedClasses: List> + generatedClasses: List>, + incrementalCaches: Map ) { val previousMappings = context.projectDescriptor.dataManager.mappings val delta = previousMappings.createDelta() val callback = delta.callback + val targetDirtyFiles: Map> = chunk.targets.keysToMap { + val files = HashSet() + dirtyFilesHolder.getRemovedFiles(it).mapTo(files, ::File) + files.addAll(filesToCompile.get(it)) + files + } + + fun getOldSourceFiles(generatedClass: GeneratedJvmClass): Set { + val cache = incrementalCaches[generatedClass.target] ?: return emptySet() + val className = generatedClass.outputClass.className + + if (!cache.isMultifileFacade(className)) return emptySet() + + val name = previousMappings.getName(className.internalName) + return previousMappings.getClassSources(name)?.toSet() ?: emptySet() + } for (generatedClass in generatedClasses) { + val sourceFiles = THashSet(FileUtil.FILE_HASHING_STRATEGY) + sourceFiles.addAll(getOldSourceFiles(generatedClass)) + sourceFiles.removeAll(targetDirtyFiles[generatedClass.target] ?: emptySet()) + sourceFiles.addAll(generatedClass.sourceFiles) + callback.associate( - FileUtil.toSystemIndependentName(generatedClass.outputFile.absolutePath), - generatedClass.sourceFiles.map { FileUtil.toSystemIndependentName(it.absolutePath) }, + FileUtil.toSystemIndependentName(generatedClass.outputFile.canonicalPath), + sourceFiles.map { FileUtil.toSystemIndependentName(it.canonicalPath) }, ClassReader(generatedClass.outputClass.fileContents) ) } diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java b/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java index 8d733b367d3..2ee8fd46724 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java @@ -1213,6 +1213,12 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta doTest(fileName); } + @TestMetadata("multifilePackagePartMethodAdded") + public void testMultifilePackagePartMethodAdded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/"); + doTest(fileName); + } + @TestMetadata("overrideExplicit") public void testOverrideExplicit() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/overrideExplicit/"); diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/build.log b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/build.log new file mode 100644 index 00000000000..92e37457353 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/build.log @@ -0,0 +1,20 @@ +Cleaning output files: +out/production/module/META-INF/module.kotlin_module +out/production/module/Utils.class +out/production/module/Utils__PartBKt.class +End of files +Compiling files: +src/partB.kt +End of files +Cleaning output files: +out/production/module/META-INF/module.kotlin_module +out/production/module/UseFooFKt.class +out/production/module/UseFooGKt.class +out/production/module/Utils.class +out/production/module/Utils__PartAKt.class +End of files +Compiling files: +src/partA.kt +src/useFooF.kt +src/useFooG.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partA.kt b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partA.kt new file mode 100644 index 00000000000..a0bd73ccf29 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partA.kt @@ -0,0 +1,4 @@ +@file:JvmName("Utils") +@file:JvmMultifileClass + +fun f(x: Any) {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt new file mode 100644 index 00000000000..66c94da6e9c --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt @@ -0,0 +1,5 @@ +@file:JvmName("Utils") +@file:JvmMultifileClass + +fun g(x: Int) {} + diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt.new.1 b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt.new.1 new file mode 100644 index 00000000000..84330654a1b --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/partB.kt.new.1 @@ -0,0 +1,6 @@ +@file:JvmName("Utils") +@file:JvmMultifileClass + +fun f(x: Int) {} + +fun g(x: Int?) {} diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooF.kt b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooF.kt new file mode 100644 index 00000000000..0c51fdb0b17 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooF.kt @@ -0,0 +1,3 @@ +fun useFooF() { + f(10) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooG.kt b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooG.kt new file mode 100644 index 00000000000..46308f2117f --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/multifilePackagePartMethodAdded/useFooG.kt @@ -0,0 +1,3 @@ +fun useFooG() { + g(10) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/build.log b/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/build.log index a92e18853c5..d1b09f25402 100644 --- a/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/build.log +++ b/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/build.log @@ -5,16 +5,6 @@ Cleaning output files: out/production/module/META-INF/module.kotlin_module out/production/module/test/Test.class out/production/module/test/Test__AKt.class -out/production/module/test/Test__BKt.class -End of files -Compiling files: -src/a.kt -src/b.kt -End of files -Cleaning output files: -out/production/module/META-INF/module.kotlin_module -out/production/module/test/Test.class -out/production/module/test/Test__AKt.class End of files Compiling files: src/a.kt diff --git a/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/experimental-ic-build.log b/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/experimental-ic-build.log new file mode 100644 index 00000000000..37766455187 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/experimental-ic-build.log @@ -0,0 +1,5 @@ +========== Step #1 ============ + +Compiling files: +src/b.kt +End of files \ No newline at end of file