[klib] Don't pass around metadata serialization closure

Pass the metadata serializer instance instead. This allows to further
reduce code duplication by introducing the common interface
`KlibSingleFileMetadataSerializer` for abstracting away K1 and K2
representation of a source file, as well as reusing
`Fir2KlibMetadataSerializer` across different backends.

KT-64392
This commit is contained in:
Sergej Jaskiewicz
2024-01-22 14:21:20 +01:00
committed by Space Team
parent 5a6f51e474
commit f39335b3f7
23 changed files with 388 additions and 406 deletions
@@ -12,7 +12,6 @@ import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.ir.KtDiagnosticReporterWithImplicitIrBasedContext
import org.jetbrains.kotlin.KtPsiSourceFile
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.backend.common.linkage.issues.checkNoUnboundSymbols
import org.jetbrains.kotlin.backend.common.linkage.partial.PartialLinkageSupportForLinker
@@ -485,7 +484,6 @@ class GenerateIrRuntime {
return psi2IrTranslator.generateModuleFragment(psi2IrContext, files, irProviders, emptyList())
}
@OptIn(ExperimentalPathApi::class)
private fun doSerializeModule(
moduleFragment: IrModuleFragment,
bindingContext: BindingContext,
@@ -494,12 +492,19 @@ class GenerateIrRuntime {
): String {
val diagnosticReporter = DiagnosticReporterFactory.createPendingReporter()
val tmpKlibDir = createTempDirectory().also { it.toFile().deleteOnExit() }.toString()
val metadataSerializer = KlibMetadataIncrementalSerializer(configuration, project, false)
val metadataSerializer = KlibMetadataIncrementalSerializer(
files,
configuration,
project,
bindingContext,
moduleFragment.descriptor,
allowErrorTypes = false,
)
serializeModuleIntoKlib(
moduleName,
configuration,
diagnosticReporter,
files.map(::KtPsiSourceFile),
metadataSerializer,
tmpKlibDir,
emptyList(),
moduleFragment,
@@ -507,10 +512,8 @@ class GenerateIrRuntime {
true,
perFile,
abiVersion = KotlinAbiVersion.CURRENT,
jsOutputName = null
) { file ->
metadataSerializer.serializeScope(file, bindingContext, moduleFragment.descriptor)
}
jsOutputName = null,
)
return tmpKlibDir
}
@@ -106,10 +106,6 @@ abstract class IrAbstractInvalidationTest(
) {
sourceModule.getModuleDescriptor(it)
}
val metadataSerializer =
KlibMetadataIncrementalSerializer(configuration, sourceModule.project, sourceModule.jsFrontEndResult.hasErrors)
val diagnosticReporter = DiagnosticReporterFactory.createPendingReporter()
generateKLib(
sourceModule,
outputKlibFile.canonicalPath,
@@ -117,9 +113,7 @@ abstract class IrAbstractInvalidationTest(
jsOutputName = moduleName,
icData = icData,
moduleFragment = moduleFragment,
diagnosticReporter = diagnosticReporter
) { file ->
metadataSerializer.serializeScope(file, sourceModule.jsFrontEndResult.bindingContext, moduleFragment.descriptor)
}
diagnosticReporter = DiagnosticReporterFactory.createPendingReporter(),
)
}
}
@@ -61,7 +61,7 @@ class FirJsKlibBackendFacade(
configuration[CommonConfigurationKeys.MODULE_NAME]!!,
configuration,
inputArtifact.diagnosticReporter,
inputArtifact.sourceFiles,
inputArtifact.metadataSerializer,
klibPath = outputFile,
libraries.map { it.library },
inputArtifact.irModuleFragment,
@@ -71,9 +71,7 @@ class FirJsKlibBackendFacade(
containsErrorCode = inputArtifact.hasErrors,
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null
) {
inputArtifact.serializeSingleFile(it)
}
)
}
// TODO: consider avoiding repeated libraries resolution
@@ -51,7 +51,7 @@ class JsKlibBackendFacade(
configuration[CommonConfigurationKeys.MODULE_NAME]!!,
configuration,
inputArtifact.diagnosticReporter,
inputArtifact.sourceFiles,
inputArtifact.metadataSerializer,
klibPath = outputFile,
JsEnvironmentConfigurator.getAllRecursiveLibrariesFor(module, testServices).keys.toList(),
inputArtifact.irModuleFragment,
@@ -61,9 +61,7 @@ class JsKlibBackendFacade(
containsErrorCode = inputArtifact.hasErrors,
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null
) {
inputArtifact.serializeSingleFile(it)
}
)
}
val dependencies = JsEnvironmentConfigurator.getAllRecursiveDependenciesFor(module, testServices).toList()