Fix updating java mappings for multifile facade
Original commit: 2abc422577
This commit is contained in:
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
+6
@@ -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/");
|
||||
|
||||
+20
@@ -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
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
|
||||
fun f(x: Any) {}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
|
||||
fun g(x: Int) {}
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
|
||||
fun f(x: Int) {}
|
||||
|
||||
fun g(x: Int?) {}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
fun useFooF() {
|
||||
f(10)
|
||||
}
|
||||
+3
@@ -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
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
========== Step #1 ============
|
||||
|
||||
Compiling files:
|
||||
src/b.kt
|
||||
End of files
|
||||
Reference in New Issue
Block a user