Fix updating java mappings for multifile facade

This commit is contained in:
Alexey Tsvetkov
2016-01-25 20:22:44 +03:00
parent 56942930c9
commit 2abc422577
11 changed files with 84 additions and 15 deletions
@@ -124,6 +124,9 @@ open class IncrementalCacheImpl<Target>(
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<Target>(
storage[facadeName.internalName] = partNames
}
operator fun get(facadeName: String): Collection<String>? = storage[facadeName]
operator fun get(internalName: String): Collection<String>? = storage[internalName]
operator fun contains(internalName: String): Boolean = internalName in storage
fun remove(className: JvmClassName) {
storage.remove(className.internalName)
@@ -252,7 +252,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
}
val generatedClasses = generatedFiles.filterIsInstance<GeneratedJvmClass<ModuleBuildTarget>>()
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<JavaSourceRootDescriptor, ModuleBuildTarget>,
filesToCompile: MultiMap<ModuleBuildTarget, File>,
generatedClasses: List<GeneratedJvmClass<ModuleBuildTarget>>
generatedClasses: List<GeneratedJvmClass<ModuleBuildTarget>>,
incrementalCaches: Map<ModuleBuildTarget, JpsIncrementalCacheImpl>
) {
val previousMappings = context.projectDescriptor.dataManager.mappings
val delta = previousMappings.createDelta()
val callback = delta.callback
val targetDirtyFiles: Map<ModuleBuildTarget, Set<File>> = chunk.targets.keysToMap {
val files = HashSet<File>()
dirtyFilesHolder.getRemovedFiles(it).mapTo(files, ::File)
files.addAll(filesToCompile.get(it))
files
}
fun getOldSourceFiles(generatedClass: GeneratedJvmClass<ModuleBuildTarget>): Set<File> {
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)
)
}
@@ -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/");
@@ -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
@@ -0,0 +1,4 @@
@file:JvmName("Utils")
@file:JvmMultifileClass
fun f(x: Any) {}
@@ -0,0 +1,5 @@
@file:JvmName("Utils")
@file:JvmMultifileClass
fun g(x: Int) {}
@@ -0,0 +1,6 @@
@file:JvmName("Utils")
@file:JvmMultifileClass
fun f(x: Int) {}
fun g(x: Int?) {}
@@ -0,0 +1,3 @@
fun useFooF() {
f(10)
}
@@ -0,0 +1,3 @@
fun useFooG() {
g(10)
}
@@ -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
@@ -0,0 +1,5 @@
========== Step #1 ============
Compiling files:
src/b.kt
End of files