[CLI] Introduce utilities for creating FirSession hierarchy in CLI for all platforms

Also support session creation and compilation for HMPP projects

^KT-56209 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-02-09 22:24:32 +02:00
committed by Space Team
parent 30ea4b6b53
commit 79e4df72bf
22 changed files with 783 additions and 633 deletions
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
import org.jetbrains.kotlin.ir.util.KotlinMangler
data class FirResult(
val platformOutput: ModuleCompilerAnalyzedOutput,
val commonOutput: ModuleCompilerAnalyzedOutput?
)
data class FirResult(val outputs: List<ModuleCompilerAnalyzedOutput>)
data class ModuleCompilerAnalyzedOutput(
val session: FirSession,
@@ -67,46 +64,58 @@ fun FirResult.convertToIrAndActualize(
manglerCreator = { FirJvmKotlinMangler() } // TODO: replace with potentially simpler version for other backends.
)
if (commonOutput != null) {
val commonIrOutput = commonOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
).also {
fir2IrResultPostCompute(it)
when (outputs.size) {
0 -> error("No modules found")
1 -> {
result = outputs.single().convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
)
}
result = platformOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = commonIrOutput.components.irBuiltIns,
irMangler,
visibilityConverter,
kotlinBuiltIns,
).also {
fir2IrResultPostCompute(it)
else -> {
val platformOutput = outputs.last()
val commonOutputs = outputs.dropLast(1)
var irBuiltIns: IrBuiltInsOverFir? = null
val commonIrOutputs = commonOutputs.map {
it.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = irBuiltIns,
irMangler,
visibilityConverter,
kotlinBuiltIns,
).also { result ->
fir2IrResultPostCompute(result)
if (irBuiltIns == null) {
irBuiltIns = result.components.irBuiltIns
}
}
}
result = platformOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = irBuiltIns!!,
irMangler,
visibilityConverter,
kotlinBuiltIns,
).also {
fir2IrResultPostCompute(it)
}
IrActualizer.actualize(
result.irModuleFragment,
commonIrOutputs.map { it.irModuleFragment }
)
}
IrActualizer.actualize(
result.irModuleFragment,
listOf(commonIrOutput.irModuleFragment)
)
} else {
result = platformOutput.convertToIr(
fir2IrExtensions,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = null,
irMangler,
visibilityConverter,
kotlinBuiltIns,
)
}
return result
@@ -37,7 +37,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
sessionProvider: FirProjectSessionProvider,
moduleDataProvider: ModuleDataProvider,
projectEnvironment: AbstractProjectEnvironment,
scope: AbstractProjectFileSearchScope,
librariesScope: AbstractProjectFileSearchScope,
packageAndMetadataPartProvider: PackageAndMetadataPartProvider,
languageVersionSettings: LanguageVersionSettings,
registerExtraComponents: ((FirSession) -> Unit),
@@ -59,7 +59,7 @@ object FirCommonSessionFactory : FirAbstractSessionFactory() {
moduleDataProvider,
kotlinScopeProvider,
packageAndMetadataPartProvider,
projectEnvironment.getKotlinClassFinder(scope)
projectEnvironment.getKotlinClassFinder(librariesScope)
),
FirBuiltinSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),
FirCloneableSymbolProvider(session, builtinsModuleData, kotlinScopeProvider),