[IR] Store manglers used for signature computation in IrBackendInput

We will need them in signature dump tests later.
This commit is contained in:
Sergej Jaskiewicz
2023-05-01 13:56:56 +02:00
committed by Space Team
parent a8b7306342
commit a74df3b4b4
15 changed files with 126 additions and 79 deletions
@@ -12,9 +12,11 @@ import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
import org.jetbrains.kotlin.fir.signaturer.FirMangler
import org.jetbrains.kotlin.ir.backend.js.KotlinFileSerializedData
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.test.model.BackendKinds
import org.jetbrains.kotlin.test.model.ResultingArtifact
@@ -26,11 +28,40 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
abstract val irModuleFragment: IrModuleFragment
/*
/**
* Here plugin context can be used as a service for inspecting resulting IR module
*/
abstract val irPluginContext: IrPluginContext
/**
* The mangler instance that was used to build declaration signatures from (possibly deserialized) K1 descriptors for this backend.
*
* This instance can be used to verify signatures in tests.
*
* @see org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor.DescriptorMangleComputer
* @see org.jetbrains.kotlin.ir.util.IdSignature
*/
abstract val descriptorMangler: KotlinMangler.DescriptorMangler
/**
* The mangler instance that was used to build declaration signatures from IR declarations for this backend.
*
* @see org.jetbrains.kotlin.backend.common.serialization.mangle.ir.IrMangleComputer
* @see org.jetbrains.kotlin.ir.util.IdSignature
*/
abstract val irMangler: KotlinMangler.IrMangler
/**
* The mangler instance that was used to build declaration signatures from K2 (FIR) declarations for this backend, or `null` if
* this artifact was compiled using the classic frontend.
*
* This instance can be used to verify signatures in tests.
*
* @see org.jetbrains.kotlin.fir.backend.FirMangleComputer
* @see org.jetbrains.kotlin.ir.util.IdSignature
*/
abstract val firMangler: FirMangler?
data class JsIrBackendInput(
val mainModuleFragment: IrModuleFragment,
val dependentModuleFragments: List<IrModuleFragment>,
@@ -40,7 +71,10 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>, // TODO: abstract from descriptors
val diagnosticsCollector: BaseDiagnosticsCollector,
val hasErrors: Boolean,
val serializeSingleFile: (KtSourceFile, IrActualizedResult?) -> ProtoBuf.PackageFragment
override val descriptorMangler: KotlinMangler.DescriptorMangler,
override val irMangler: KotlinMangler.IrMangler,
override val firMangler: FirMangler?,
val serializeSingleFile: (KtSourceFile, IrActualizedResult?) -> ProtoBuf.PackageFragment,
) : IrBackendInput() {
override val irModuleFragment: IrModuleFragment
get() = mainModuleFragment
@@ -51,7 +85,10 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
val codegenFactory: JvmIrCodegenFactory,
val dependentInputs: List<JvmIrCodegenFactory.JvmIrBackendInput>,
val backendInput: JvmIrCodegenFactory.JvmIrBackendInput,
val sourceFiles: List<KtSourceFile>
val sourceFiles: List<KtSourceFile>,
override val descriptorMangler: KotlinMangler.DescriptorMangler,
override val irMangler: KotlinMangler.IrMangler,
override val firMangler: FirMangler?,
) : IrBackendInput() {
override val irModuleFragment: IrModuleFragment
get() = backendInput.irModuleFragment
@@ -16,8 +16,11 @@ import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerIr
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.js.config.ErrorTolerancePolicy
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.test.TargetBackend
@@ -71,7 +74,10 @@ class ClassicFrontend2IrConverter(
codegenFactory,
dependentInputs = emptyList(),
conversionResult,
sourceFiles = emptyList()
sourceFiles = emptyList(),
descriptorMangler = conversionResult.symbolTable.signaturer.mangler,
irMangler = JvmIrMangler,
firMangler = null,
)
}
@@ -111,7 +117,10 @@ class ClassicFrontend2IrConverter(
icData,
expectDescriptorToSymbol = expectDescriptorToSymbol,
diagnosticsCollector = DiagnosticReporterFactory.createReporter(),
hasErrors
hasErrors,
descriptorMangler = (pluginContext.symbolTable as SymbolTable).signaturer.mangler,
irMangler = JsManglerIr,
firMangler = null,
) { file, _ ->
metadataSerializer.serializeScope(file, analysisResult.bindingContext, moduleFragment.descriptor)
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.test.frontend.fir
import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.CommonConfigurationKeys
@@ -31,9 +32,11 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.ir.backend.js.JsFactories
import org.jetbrains.kotlin.ir.backend.js.getSerializedData
import org.jetbrains.kotlin.ir.backend.js.incrementalDataProvider
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerIr
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.util.KotlinMangler
import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.library.unresolvedDependencies
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -42,9 +45,7 @@ import org.jetbrains.kotlin.test.model.BackendKinds
import org.jetbrains.kotlin.test.model.Frontend2BackendConverter
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
import org.jetbrains.kotlin.test.services.jsLibraryProvider
import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.utils.metadataVersion
class Fir2IrJsResultsConverter(
@@ -67,11 +68,9 @@ class Fir2IrJsResultsConverter(
lateinit var mainPluginContext: IrPluginContext
var irBuiltIns: IrBuiltInsOverFir? = null
val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = false,
signatureComposerCreator = null,
manglerCreator = ::FirJsKotlinMangler
)
val commonMemberStorage = Fir2IrCommonMemberStorage(IdSignatureDescriptor(JsManglerDesc), FirJsKotlinMangler())
val irMangler = JsManglerIr
for ((index, part) in inputArtifact.partsForDependsOnModules.withIndex()) {
val (irModuleFragment, components, pluginContext) =
@@ -82,7 +81,9 @@ class Fir2IrJsResultsConverter(
configuration,
testServices,
commonMemberStorage,
irBuiltIns
irBuiltIns,
irMangler,
generateSignatures = true,
)
irBuiltIns = components.irBuiltIns
mainPluginContext = pluginContext
@@ -112,7 +113,10 @@ class Fir2IrJsResultsConverter(
configuration.incrementalDataProvider?.getSerializedData(sourceFiles) ?: emptyList(),
expectDescriptorToSymbol = mutableMapOf(),
diagnosticsCollector = DiagnosticReporterFactory.createReporter(),
hasErrors = inputArtifact.hasErrors
hasErrors = inputArtifact.hasErrors,
descriptorMangler = commonMemberStorage.symbolTable.signaturer.mangler,
irMangler = irMangler,
firMangler = commonMemberStorage.firSignatureComposer.mangler,
) { file, irActualizedResult ->
val (firFile, components) = firFilesAndComponentsBySourceFile[file]
?: error("cannot find FIR file by source file ${file.name} (${file.path})")
@@ -142,7 +146,9 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
configuration: CompilerConfiguration,
testServices: TestServices,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?
irBuiltIns: IrBuiltInsOverFir?,
irMangler: KotlinMangler.IrMangler,
generateSignatures: Boolean
): Fir2IrResult {
this as FirAnalyzerFacade
// TODO: consider avoiding repeated libraries resolution
@@ -151,7 +157,7 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
val fir2IrConfiguration = Fir2IrConfiguration(
languageVersionSettings = configuration.languageVersionSettings,
linkViaSignatures = false,
linkViaSignatures = generateSignatures,
evaluatedConstTracker = configuration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
)
@@ -159,7 +165,7 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
session, scopeSession, firFiles.toList(),
fir2IrExtensions,
fir2IrConfiguration,
JsManglerIr, IrFactoryImpl,
irMangler, IrFactoryImpl,
Fir2IrVisibilityConverter.Default,
Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation
irGeneratorExtensions,
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.test.frontend.fir
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.backend.jvm.JvmIrDeserializerImpl
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
@@ -22,8 +21,8 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.pipeline.signatureComposerForJvmFir2Ir
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment
@@ -66,7 +65,8 @@ class Fir2IrJvmResultsConverter(
val compilerConfigurationProvider = testServices.compilerConfigurationProvider
val configuration = compilerConfigurationProvider.getCompilerConfiguration(module)
val fir2IrExtensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val irMangler = JvmIrMangler
val fir2IrExtensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), irMangler)
// Create and initialize the module and its dependencies
val project = compilerConfigurationProvider.getProject(module)
@@ -89,11 +89,7 @@ class Fir2IrJvmResultsConverter(
val firAnalyzerFacade = inputArtifact.partsForDependsOnModules.last().firAnalyzerFacade as? FirAnalyzerFacade
val generateSignatures = firAnalyzerFacade?.fir2IrConfiguration?.linkViaSignatures == true
val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = generateSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
manglerCreator = { FirJvmKotlinMangler() }
)
val commonMemberStorage = Fir2IrCommonMemberStorage(signatureComposerForJvmFir2Ir(generateSignatures), FirJvmKotlinMangler())
var irBuiltIns: IrBuiltInsOverFir? = null
for ((index, firOutputPart) in inputArtifact.partsForDependsOnModules.withIndex()) {
@@ -136,7 +132,10 @@ class Fir2IrJvmResultsConverter(
codegenFactory,
dependentIrParts,
mainIrPart,
sourceFiles
sourceFiles,
descriptorMangler = commonMemberStorage.symbolTable.signaturer.mangler,
irMangler = irMangler,
firMangler = commonMemberStorage.firSignatureComposer.mangler,
)
}
}