[FIR2IR] Use single SymbolTable and SignatureComposer for all MPP modules

Merge createModuleFragmentWithSignaturesIfNeeded and createModuleFragmentWithoutSignatures
into the createModuleFragmentWithSignaturesIfNeeded
This commit is contained in:
Ivan Kochurkin
2023-01-26 20:35:05 +01:00
committed by Space Team
parent a5d8429515
commit 001b11f285
10 changed files with 127 additions and 165 deletions
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.signaturer.FirBasedSignatureComposer
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
@@ -43,20 +44,28 @@ fun FirResult.convertToIrAndActualize(
): Fir2IrResult {
val result: Fir2IrResult
val (signatureComposer, symbolTable) = Fir2IrConverter.createSignatureComposerAndSymbolTable(
generateSignatures = linkViaSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
manglerCreator = { FirJvmKotlinMangler() }
)
if (commonOutput != null) {
val commonIrOutput = commonOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
dependentComponents = emptyList(),
currentSymbolTable = null
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
)
result = platformOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
dependentComponents = listOf(commonIrOutput.components),
currentSymbolTable = commonIrOutput.components.symbolTable
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = listOf(commonIrOutput.components)
)
IrActualizer.actualize(
result.irModuleFragment,
@@ -67,8 +76,9 @@ fun FirResult.convertToIrAndActualize(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
dependentComponents = emptyList(),
currentSymbolTable = null
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = emptyList()
)
}
@@ -79,34 +89,20 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
fir2IrExtensions: Fir2IrExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
dependentComponents: List<Fir2IrComponents>,
currentSymbolTable: SymbolTable?
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
dependentComponents: List<Fir2IrComponents>
): Fir2IrResult {
if (linkViaSignatures) {
val signaturer = JvmIdSignatureDescriptor(mangler = JvmDescriptorMangler(mainDetector = null))
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir,
session.languageVersionSettings, signaturer, fir2IrExtensions,
FirJvmKotlinMangler(),
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irGeneratorExtensions,
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally
generateSignatures = true,
dependentComponents = dependentComponents,
currentSymbolTable = currentSymbolTable
)
} else {
return Fir2IrConverter.createModuleFragmentWithoutSignatures(
session, scopeSession, fir,
session.languageVersionSettings, fir2IrExtensions,
FirJvmKotlinMangler(),
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irGeneratorExtensions,
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally,
dependentComponents = dependentComponents,
currentSymbolTable = currentSymbolTable
)
}
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir,
session.languageVersionSettings, fir2IrExtensions,
JvmIrMangler, IrFactoryImpl, FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irGeneratorExtensions,
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally
generateSignatures = linkViaSignatures,
signatureComposer = signatureComposer,
symbolTable = symbolTable,
dependentComponents = dependentComponents
)
}
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.fir.signaturer.FirMangler
import org.jetbrains.kotlin.fir.symbols.lazyDeclarationResolver
import org.jetbrains.kotlin.ir.PsiIrFileEntry
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
@@ -426,14 +427,29 @@ class Fir2IrConverter(
}
}
fun createSignatureComposerAndSymbolTable(
generateSignatures: Boolean,
signatureComposerCreator: (() -> IdSignatureComposer)?,
manglerCreator: () -> FirMangler,
): Pair<FirBasedSignatureComposer, SymbolTable> {
val signaturer = if (generateSignatures && signatureComposerCreator != null)
signatureComposerCreator()
else
DescriptorSignatureComposerStub()
val signatureComposer = FirBasedSignatureComposer(manglerCreator())
val symbolTable = SymbolTable(
signaturer = WrappedDescriptorSignatureComposer(signaturer, signatureComposer),
irFactory = IrFactoryImpl
)
return Pair(signatureComposer, symbolTable)
}
fun createModuleFragmentWithSignaturesIfNeeded(
session: FirSession,
scopeSession: ScopeSession,
firFiles: List<FirFile>,
languageVersionSettings: LanguageVersionSettings,
signaturer: IdSignatureComposer,
fir2IrExtensions: Fir2IrExtensions,
mangler: FirMangler,
irMangler: KotlinMangler.IrMangler,
irFactory: IrFactory,
visibilityConverter: Fir2IrVisibilityConverter,
@@ -441,83 +457,8 @@ class Fir2IrConverter(
irGenerationExtensions: Collection<IrGenerationExtension>,
generateSignatures: Boolean,
kotlinBuiltIns: KotlinBuiltIns,
dependentComponents: List<Fir2IrComponents>,
currentSymbolTable: SymbolTable?
): Fir2IrResult {
if (!generateSignatures) {
return createModuleFragmentWithoutSignatures(
session, scopeSession, firFiles, languageVersionSettings,
fir2IrExtensions, mangler, irMangler, irFactory,
visibilityConverter, specialSymbolProvider, irGenerationExtensions,
kotlinBuiltIns, dependentComponents, currentSymbolTable
)
}
val signatureComposer = FirBasedSignatureComposer(
mangler,
dependentComposers = dependentComponents.map { it.signatureComposer as FirBasedSignatureComposer }
)
val symbolTable = createSymbolTable(signaturer, signatureComposer, irFactory, currentSymbolTable)
return createModuleFragmentWithSymbolTable(
session, scopeSession, firFiles, languageVersionSettings,
fir2IrExtensions, irMangler, irFactory, visibilityConverter,
specialSymbolProvider, irGenerationExtensions, signatureComposer,
symbolTable, generateSignatures = true, kotlinBuiltIns = kotlinBuiltIns, dependentComponents = dependentComponents
)
}
fun createModuleFragmentWithoutSignatures(
session: FirSession,
scopeSession: ScopeSession,
firFiles: List<FirFile>,
languageVersionSettings: LanguageVersionSettings,
fir2IrExtensions: Fir2IrExtensions,
mangler: FirMangler,
irMangler: KotlinMangler.IrMangler,
irFactory: IrFactory,
visibilityConverter: Fir2IrVisibilityConverter,
specialSymbolProvider: Fir2IrSpecialSymbolProvider,
irGenerationExtensions: Collection<IrGenerationExtension>,
kotlinBuiltIns: KotlinBuiltIns,
dependentComponents: List<Fir2IrComponents>,
currentSymbolTable: SymbolTable?
): Fir2IrResult {
val signatureComposer = FirBasedSignatureComposer(mangler, dependentComposers = dependentComponents.map { it.signatureComposer as FirBasedSignatureComposer })
val signaturer = DescriptorSignatureComposerStub()
val symbolTable = createSymbolTable(signaturer, signatureComposer, irFactory, currentSymbolTable)
return createModuleFragmentWithSymbolTable(
session, scopeSession, firFiles, languageVersionSettings,
fir2IrExtensions, irMangler, irFactory, visibilityConverter,
specialSymbolProvider, irGenerationExtensions, signatureComposer,
symbolTable, generateSignatures = false, kotlinBuiltIns = kotlinBuiltIns, dependentComponents = dependentComponents
)
}
private fun createSymbolTable(
signaturer: IdSignatureComposer,
signatureComposer: FirBasedSignatureComposer,
irFactory: IrFactory,
currentSymbolTable: SymbolTable?
): SymbolTable =
currentSymbolTable ?: SymbolTable(
signaturer = WrappedDescriptorSignatureComposer(signaturer, signatureComposer),
irFactory = irFactory
)
private fun createModuleFragmentWithSymbolTable(
session: FirSession,
scopeSession: ScopeSession,
firFiles: List<FirFile>,
languageVersionSettings: LanguageVersionSettings,
fir2IrExtensions: Fir2IrExtensions,
irMangler: KotlinMangler.IrMangler,
irFactory: IrFactory,
visibilityConverter: Fir2IrVisibilityConverter,
specialSymbolProvider: Fir2IrSpecialSymbolProvider,
irGenerationExtensions: Collection<IrGenerationExtension>,
signatureComposer: FirBasedSignatureComposer,
symbolTable: SymbolTable,
generateSignatures: Boolean,
kotlinBuiltIns: KotlinBuiltIns,
dependentComponents: List<Fir2IrComponents>
): Fir2IrResult {
val moduleDescriptor = FirModuleDescriptor(session, kotlinBuiltIns)
@@ -23,10 +23,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
// @NoMutableState -- we'll restore this annotation once we get rid of withFileSignature().
class FirBasedSignatureComposer(
override val mangler: FirMangler,
dependentComposers: List<FirBasedSignatureComposer> = emptyList()
) : Fir2IrSignatureComposer {
class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignatureComposer {
private var fileSignature: IdSignature.FileSignature? = null
override fun withFileSignature(sig: IdSignature.FileSignature, body: () -> Unit) {
@@ -37,11 +34,7 @@ class FirBasedSignatureComposer(
private data class FirDeclarationWithParentId(val declaration: FirDeclaration, val classId: ClassId?)
private val signatureCache: MutableMap<FirDeclarationWithParentId, IdSignature.CommonSignature> =
dependentComposers.map { it.signatureCache }.fold(mutableMapOf()) { result, map ->
result.putAll(map)
result
}
private val signatureCache = mutableMapOf<FirDeclarationWithParentId, IdSignature.CommonSignature>()
inner class SignatureBuilder : FirVisitor<Unit, Any?>() {
var hashId: Long? = null