[LL API] Fix `mainFile` calculation when computing compilation chunks
The current implementation messes up the order of files and might result
in incorrect `mainFile` value for a chunk.
^KT-71301: Fixed
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirCompilerFacility.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirCompilerFacility.kt
index eea76f0..fe57f6c 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirCompilerFacility.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirCompilerFacility.kt
@@ -386,18 +386,17 @@
* Create a new multi-file dangling file module, containing copies of [files], with the specified [contextModule].
*/
fun appendDanglingChunk(isMain: Boolean, contextModule: KaModule, files: List<KtFile>) {
- val (codeFragments, ordinaryFiles) = files.partition { it is KtCodeFragment }
- val newOrdinaryFiles = ordinaryFiles.map { createFileCopy(it, emptyMap()) }
- val newCodeFragments = if (codeFragments.isNotEmpty()) {
- val ordinaryFileSubstitutions = ordinaryFiles.zip(newOrdinaryFiles).toMap()
- codeFragments.map { createFileCopy(it, ordinaryFileSubstitutions) }
- } else {
- emptyList()
+ val ordinaryFileToNewFile = files.filter { it !is KtCodeFragment }.associateWith { createFileCopy(it, emptyMap()) }
+
+ val newFiles = files.map {
+ if (it is KtCodeFragment) {
+ createFileCopy(it, ordinaryFileToNewFile)
+ } else {
+ ordinaryFileToNewFile[it]!!
+ }
}
- val newFiles = newOrdinaryFiles + newCodeFragments
-
val mainFile = if (isMain) {
val mainFileIndex = files.indexOf(originalMainFile)
check(mainFileIndex >= 0) { "Main file is not submitted" }
@@ -409,7 +408,7 @@
val newModule = KaDanglingFileModuleImpl(newFiles, contextModule, KaDanglingFileResolutionMode.PREFER_SELF)
newFiles.forEach { it.explicitModule = newModule }
- val chunk = ChunkToCompile(mainFile, codeFragments.isNotEmpty(), createFilesToCompile(newFiles))
+ val chunk = ChunkToCompile(mainFile, newFiles.any { it is KtCodeFragment }, createFilesToCompile(newFiles))
result[newModule] = chunk
}