[FIR2IR] Use single SymbolTable and SignatureComposer for all MPP modules
Merge createModuleFragmentWithSignaturesIfNeeded and createModuleFragmentWithoutSignatures into the createModuleFragmentWithSignaturesIfNeeded
This commit is contained in:
committed by
Space Team
parent
a5d8429515
commit
001b11f285
@@ -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)
|
||||
|
||||
+2
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user