Fir2Ir: pass Fir2IrExtensions to backend

This commit is contained in:
Georgy Bronnikov
2021-12-09 11:30:16 +03:00
committed by Alexander Udalov
parent 3c3c1be543
commit 13d4d60afa
12 changed files with 82 additions and 64 deletions
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.cli.jvm.compiler
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.asJava.FilteredJvmDiagnostics import org.jetbrains.kotlin.asJava.FilteredJvmDiagnostics
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensions
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.cli.common.CLICompiler import org.jetbrains.kotlin.cli.common.CLICompiler
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
@@ -161,19 +161,15 @@ object FirKotlinToJvmBytecodeCompiler {
performanceManager?.notifyGenerationStarted() performanceManager?.notifyGenerationStarted()
performanceManager?.notifyIRTranslationStarted() performanceManager?.notifyIRTranslationStarted()
val fir2IrResult = firResult.session.convertToIr( val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration)
firResult.scopeSession, firResult.fir, val fir2IrResult = firResult.session.convertToIr(firResult.scopeSession, firResult.fir, fir2IrExtensions, irGenerationExtensions)
JvmFir2IrExtensions(moduleConfiguration),
irGenerationExtensions
)
performanceManager?.notifyIRTranslationFinished() performanceManager?.notifyIRTranslationFinished()
val extensions = JvmGeneratorExtensionsImpl(moduleConfiguration)
val generationState = runBackend( val generationState = runBackend(
allSources, allSources,
fir2IrResult, fir2IrResult,
extensions, fir2IrExtensions,
firResult.session, firResult.session,
diagnosticsReporter diagnosticsReporter
) )
@@ -316,7 +312,7 @@ object FirKotlinToJvmBytecodeCompiler {
private fun CompilationContext.runBackend( private fun CompilationContext.runBackend(
ktFiles: List<KtFile>, ktFiles: List<KtFile>,
fir2IrResult: Fir2IrResult, fir2IrResult: Fir2IrResult,
extensions: JvmGeneratorExtensionsImpl, extensions: JvmGeneratorExtensions,
session: FirSession, session: FirSession,
diagnosticsReporter: BaseDiagnosticsCollector diagnosticsReporter: BaseDiagnosticsCollector
): GenerationState { ): GenerationState {
@@ -325,7 +321,6 @@ object FirKotlinToJvmBytecodeCompiler {
val codegenFactory = JvmIrCodegenFactory( val codegenFactory = JvmIrCodegenFactory(
moduleConfiguration, moduleConfiguration,
moduleConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG), moduleConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG),
jvmGeneratorExtensions = extensions
) )
val generationState = GenerationState.Builder( val generationState = GenerationState.Builder(
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.KtVirtualFileSourceFile
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager
@@ -48,6 +47,7 @@ import org.jetbrains.kotlin.fir.DependencyListForCliModule
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
@@ -185,7 +185,7 @@ fun convertAnalyzedFirToIr(
analysisResults: ModuleCompilerAnalyzedOutput, analysisResults: ModuleCompilerAnalyzedOutput,
environment: ModuleCompilerEnvironment environment: ModuleCompilerEnvironment
): ModuleCompilerIrBackendInput { ): ModuleCompilerIrBackendInput {
val extensions = JvmGeneratorExtensionsImpl(input.configuration) val extensions = JvmFir2IrExtensions(input.configuration)
// fir2ir // fir2ir
val irGenerationExtensions = val irGenerationExtensions =
@@ -215,7 +215,6 @@ fun generateCodeFromIr(
val codegenFactory = JvmIrCodegenFactory( val codegenFactory = JvmIrCodegenFactory(
input.configuration, input.configuration,
input.configuration.get(CLIConfigurationKeys.PHASE_CONFIG), input.configuration.get(CLIConfigurationKeys.PHASE_CONFIG),
jvmGeneratorExtensions = input.extensions
) )
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
@@ -6,22 +6,20 @@
package org.jetbrains.kotlin.cli.jvm.compiler.pipeline package org.jetbrains.kotlin.cli.jvm.compiler.pipeline
import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import java.io.File
// --- // ---
@@ -55,7 +53,7 @@ data class ModuleCompilerAnalyzedOutput(
data class ModuleCompilerIrBackendInput( data class ModuleCompilerIrBackendInput(
val targetId: TargetId, val targetId: TargetId,
val configuration: CompilerConfiguration, val configuration: CompilerConfiguration,
val extensions: JvmGeneratorExtensionsImpl, val extensions: JvmFir2IrExtensions,
val irModuleFragment: IrModuleFragment, val irModuleFragment: IrModuleFragment,
val symbolTable: SymbolTable, val symbolTable: SymbolTable,
val components: Fir2IrComponents, val components: Fir2IrComponents,
@@ -5,10 +5,8 @@
package org.jetbrains.kotlin.fir.backend.jvm package org.jetbrains.kotlin.fir.backend.jvm
import org.jetbrains.kotlin.backend.jvm.CachedFieldsForObjectInstances import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer
import org.jetbrains.kotlin.backend.jvm.JvmFileFacadeClass import org.jetbrains.kotlin.backend.jvm.*
import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext
import org.jetbrains.kotlin.backend.jvm.handleJvmStaticInSingletonObjects
import org.jetbrains.kotlin.backend.jvm.serialization.deserializeFromByteArray import org.jetbrains.kotlin.backend.jvm.serialization.deserializeFromByteArray
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.JVMConfigurationKeys
@@ -17,21 +15,49 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.FirIrProvider import org.jetbrains.kotlin.fir.backend.FirIrProvider
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.declarations.IrMemberWithContainerSource import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.symbols.impl.DescriptorlessExternalPackageFragmentSymbol
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.createParameterDeclarations import org.jetbrains.kotlin.ir.util.createParameterDeclarations
import org.jetbrains.kotlin.ir.util.createSpecialAnnotationClass
import org.jetbrains.kotlin.load.kotlin.FacadeClassSource import org.jetbrains.kotlin.load.kotlin.FacadeClassSource
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
class JvmFir2IrExtensions(configuration: CompilerConfiguration) : Fir2IrExtensions { class JvmFir2IrExtensions(configuration: CompilerConfiguration) : Fir2IrExtensions, JvmGeneratorExtensions {
// TODO: make these available to backend context override val classNameOverride: MutableMap<IrClass, JvmClassName> = mutableMapOf()
private val classNameOverride: MutableMap<IrClass, JvmClassName> = mutableMapOf() override val cachedFields = CachedFieldsForObjectInstances(IrFactoryImpl, configuration.languageVersionSettings)
private val cachedFields = CachedFieldsForObjectInstances(IrFactoryImpl, configuration.languageVersionSettings)
private val kotlinIrInternalPackage =
IrExternalPackageFragmentImpl(DescriptorlessExternalPackageFragmentSymbol(), IrBuiltIns.KOTLIN_INTERNAL_IR_FQN)
private val specialAnnotationConstructors = mutableListOf<IrConstructor>()
private val rawTypeAnnotationClass =
createSpecialAnnotationClass(JvmSymbols.RAW_TYPE_ANNOTATION_FQ_NAME, kotlinIrInternalPackage)
override val rawTypeAnnotationConstructor: IrConstructor =
rawTypeAnnotationClass.constructors.single()
private fun createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) =
IrFactoryImpl.createSpecialAnnotationClass(fqn, parent).apply {
specialAnnotationConstructors.add(constructors.single())
}
override fun registerDeclarations(symbolTable: SymbolTable) {
val signatureComputer = PublicIdSignatureComputer(JvmIrMangler)
specialAnnotationConstructors.forEach { constructor ->
symbolTable.declareConstructorWithSignature(signatureComputer.composePublicIdSignature(constructor, false), constructor.symbol)
}
}
override val irNeedsDeserialization: Boolean = override val irNeedsDeserialization: Boolean =
configuration.get(JVMConfigurationKeys.SERIALIZE_IR, JvmSerializeIrMode.NONE) != JvmSerializeIrMode.NONE configuration.get(JVMConfigurationKeys.SERIALIZE_IR, JvmSerializeIrMode.NONE) != JvmSerializeIrMode.NONE
@@ -460,6 +460,8 @@ class Fir2IrConverter(
val callGenerator = CallAndReferenceGenerator(components, fir2irVisitor, conversionScope) val callGenerator = CallAndReferenceGenerator(components, fir2irVisitor, conversionScope)
components.callGenerator = callGenerator components.callGenerator = callGenerator
fir2IrExtensions.registerDeclarations(symbolTable)
val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, irBuiltIns) val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, irBuiltIns)
val allFirFiles = buildList { val allFirFiles = buildList {
@@ -7,12 +7,14 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrMemberWithContainerSource import org.jetbrains.kotlin.ir.declarations.IrMemberWithContainerSource
import org.jetbrains.kotlin.ir.util.SymbolTable
interface Fir2IrExtensions { interface Fir2IrExtensions {
val irNeedsDeserialization: Boolean val irNeedsDeserialization: Boolean
fun generateOrGetFacadeClass(declaration: IrMemberWithContainerSource, components: Fir2IrComponents): IrClass? fun generateOrGetFacadeClass(declaration: IrMemberWithContainerSource, components: Fir2IrComponents): IrClass?
fun deserializeToplevelClass(irClass: IrClass, components: Fir2IrComponents): Boolean fun deserializeToplevelClass(irClass: IrClass, components: Fir2IrComponents): Boolean
fun registerDeclarations(symbolTable: SymbolTable)
object Default : Fir2IrExtensions { object Default : Fir2IrExtensions {
override val irNeedsDeserialization: Boolean override val irNeedsDeserialization: Boolean
@@ -20,5 +22,6 @@ interface Fir2IrExtensions {
override fun generateOrGetFacadeClass(declaration: IrMemberWithContainerSource, components: Fir2IrComponents): IrClass? = null override fun generateOrGetFacadeClass(declaration: IrMemberWithContainerSource, components: Fir2IrComponents): IrClass? = null
override fun deserializeToplevelClass(irClass: IrClass, components: Fir2IrComponents): Boolean = false override fun deserializeToplevelClass(irClass: IrClass, components: Fir2IrComponents): Boolean = false
override fun registerDeclarations(symbolTable: SymbolTable) {}
} }
} }
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.KtIoFileSourceFile
import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.KtSourceFile
import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.KtVirtualFileSourceFile
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
import org.jetbrains.kotlin.build.report.BuildReporter import org.jetbrains.kotlin.build.report.BuildReporter
@@ -45,6 +44,7 @@ import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.firProvider
@@ -267,10 +267,9 @@ class IncrementalFirJvmCompilerRunner(
performanceManager?.notifyGenerationStarted() performanceManager?.notifyGenerationStarted()
performanceManager?.notifyIRTranslationStarted() performanceManager?.notifyIRTranslationStarted()
val extensions = JvmGeneratorExtensionsImpl(configuration) val extensions = JvmFir2IrExtensions(configuration)
val irGenerationExtensions = val irGenerationExtensions =
(projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty() (projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty()
val mangler = JvmDescriptorMangler(null)
val signaturer = JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) val signaturer = JvmIdSignatureDescriptor(JvmDescriptorMangler(null))
val allCommonFirFiles = cycleResult.session.moduleData.dependsOnDependencies val allCommonFirFiles = cycleResult.session.moduleData.dependsOnDependencies
.map { it.session } .map { it.session }
@@ -279,7 +278,7 @@ class IncrementalFirJvmCompilerRunner(
val (irModuleFragment, symbolTable, components) = Fir2IrConverter.createModuleFragment( val (irModuleFragment, symbolTable, components) = Fir2IrConverter.createModuleFragment(
cycleResult.session, cycleResult.scopeSession, cycleResult.fir + allCommonFirFiles, cycleResult.session, cycleResult.scopeSession, cycleResult.fir + allCommonFirFiles,
cycleResult.session.languageVersionSettings, mangler, signaturer, cycleResult.session.languageVersionSettings, signaturer,
extensions, FirJvmKotlinMangler(cycleResult.session), IrFactoryImpl, extensions, FirJvmKotlinMangler(cycleResult.session), IrFactoryImpl,
FirJvmVisibilityConverter, FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(), Fir2IrJvmSpecialAnnotationSymbolProvider(),
@@ -369,4 +368,4 @@ fun CompilerConfiguration.configureSourceRootsFromSources(
} }
} }
} }
} }
@@ -17,8 +17,6 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
@@ -173,17 +171,8 @@ open class JvmGeneratorExtensionsImpl(
private val specialAnnotationConstructors = mutableListOf<IrConstructor>() private val specialAnnotationConstructors = mutableListOf<IrConstructor>()
private fun createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) = private fun createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) =
IrFactoryImpl.buildClass { IrFactoryImpl.createSpecialAnnotationClass(fqn, parent).apply {
kind = ClassKind.ANNOTATION_CLASS specialAnnotationConstructors.add(constructors.single())
name = fqn.shortName()
}.apply {
createImplicitParameterDeclarationWithWrappedDescriptor()
this.parent = parent
addConstructor {
isPrimary = true
}.also { constructor ->
specialAnnotationConstructors.add(constructor)
}
} }
override fun createCustomSuperConstructorCall( override fun createCustomSuperConstructorCall(
@@ -8,10 +8,8 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.analyzer.hasJdkCapability import org.jetbrains.kotlin.analyzer.hasJdkCapability
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
import org.jetbrains.kotlin.backend.common.phaser.CompilerPhase
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
import org.jetbrains.kotlin.backend.common.phaser.then
import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinderImpl import org.jetbrains.kotlin.backend.common.serialization.DescriptorByIdSignatureFinderImpl
import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods import org.jetbrains.kotlin.backend.jvm.intrinsics.IrIntrinsicMethods
import org.jetbrains.kotlin.backend.jvm.ir.getIoFile import org.jetbrains.kotlin.backend.jvm.ir.getIoFile
@@ -64,7 +62,7 @@ open class JvmIrCodegenFactory(
val symbolTable: SymbolTable, val symbolTable: SymbolTable,
val phaseConfig: PhaseConfig?, val phaseConfig: PhaseConfig?,
val irProviders: List<IrProvider>, val irProviders: List<IrProvider>,
val extensions: JvmGeneratorExtensionsImpl, val extensions: JvmGeneratorExtensions,
val backendExtension: JvmBackendExtension, val backendExtension: JvmBackendExtension,
val notifyCodegenStart: () -> Unit val notifyCodegenStart: () -> Unit
) : CodegenFactory.BackendInput ) : CodegenFactory.BackendInput
@@ -294,11 +292,11 @@ open class JvmIrCodegenFactory(
state: GenerationState, state: GenerationState,
irModuleFragment: IrModuleFragment, irModuleFragment: IrModuleFragment,
symbolTable: SymbolTable, symbolTable: SymbolTable,
extensions: JvmGeneratorExtensionsImpl, extensions: JvmGeneratorExtensions,
backendExtension: JvmBackendExtension, backendExtension: JvmBackendExtension,
notifyCodegenStart: () -> Unit = {} notifyCodegenStart: () -> Unit = {}
) { ) {
val irProviders = configureBuiltInsAndGenerateIrProvidersInFrontendIRMode(irModuleFragment, symbolTable, extensions) val irProviders = configureBuiltInsAndGenerateIrProvidersInFrontendIRMode(irModuleFragment, symbolTable, jvmGeneratorExtensions)
generateModule( generateModule(
state, state,
JvmIrBackendInput(irModuleFragment, symbolTable, phaseConfig, irProviders, extensions, backendExtension, notifyCodegenStart) JvmIrBackendInput(irModuleFragment, symbolTable, phaseConfig, irProviders, extensions, backendExtension, notifyCodegenStart)
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter import org.jetbrains.kotlin.ir.builders.declarations.buildReceiverParameter
import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
@@ -986,6 +987,18 @@ fun IrClass.createImplicitParameterDeclarationWithWrappedDescriptor() {
thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters)) thisReceiver = buildReceiverParameter(this, IrDeclarationOrigin.INSTANCE_RECEIVER, symbol.typeWithParameters(typeParameters))
} }
fun IrFactory.createSpecialAnnotationClass(fqn: FqName, parent: IrPackageFragment) =
buildClass {
kind = ClassKind.ANNOTATION_CLASS
name = fqn.shortName()
}.apply {
createImplicitParameterDeclarationWithWrappedDescriptor()
this.parent = parent
addConstructor {
isPrimary = true
}
}
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun isElseBranch(branch: IrBranch) = branch is IrElseBranch || ((branch.condition as? IrConst<Boolean>)?.value == true) fun isElseBranch(branch: IrBranch) = branch is IrElseBranch || ((branch.condition as? IrConst<Boolean>)?.value == true)
@@ -1242,4 +1255,4 @@ private fun computeAllOverridden(function: IrSimpleFunction, result: MutableSet<
} }
fun IrBuiltIns.getKFunctionType(returnType: IrType, parameterTypes: List<IrType>) = fun IrBuiltIns.getKFunctionType(returnType: IrType, parameterTypes: List<IrType>) =
kFunctionN(parameterTypes.size).typeWith(parameterTypes + returnType) kFunctionN(parameterTypes.size).typeWith(parameterTypes + returnType)
@@ -42,14 +42,12 @@ class Fir2IrResultsConverter(
val compilerConfigurationProvider = testServices.compilerConfigurationProvider val compilerConfigurationProvider = testServices.compilerConfigurationProvider
val configuration = compilerConfigurationProvider.getCompilerConfiguration(module) val configuration = compilerConfigurationProvider.getCompilerConfiguration(module)
val (irModuleFragment, symbolTable, components) = inputArtifact.firAnalyzerFacade.convertToIr( val fir2IrExtensions = JvmFir2IrExtensions(configuration)
JvmFir2IrExtensions(configuration) val (irModuleFragment, symbolTable, components) = inputArtifact.firAnalyzerFacade.convertToIr(fir2IrExtensions)
)
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
val extensions = JvmGeneratorExtensionsImpl(configuration)
val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG) val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG)
val codegenFactory = JvmIrCodegenFactory(configuration, phaseConfig, jvmGeneratorExtensions = extensions) val codegenFactory = JvmIrCodegenFactory(configuration, phaseConfig)
// TODO: handle fir from light tree // TODO: handle fir from light tree
val ktFiles = inputArtifact.firFiles.values.mapNotNull { it.psi as KtFile? } val ktFiles = inputArtifact.firFiles.values.mapNotNull { it.psi as KtFile? }
@@ -73,6 +71,7 @@ class Fir2IrResultsConverter(
FirJvmBackendClassResolver(components) FirJvmBackendClassResolver(components)
).build() ).build()
val extensions = JvmGeneratorExtensionsImpl(configuration)
val irProviders = codegenFactory.configureBuiltInsAndGenerateIrProvidersInFrontendIRMode(irModuleFragment, symbolTable, extensions) val irProviders = codegenFactory.configureBuiltInsAndGenerateIrProvidersInFrontendIRMode(irModuleFragment, symbolTable, extensions)
return IrBackendInput.JvmIrBackendInput( return IrBackendInput.JvmIrBackendInput(
@@ -83,7 +82,7 @@ class Fir2IrResultsConverter(
symbolTable, symbolTable,
phaseConfig, phaseConfig,
irProviders, irProviders,
extensions, fir2IrExtensions,
FirJvmBackendExtension(inputArtifact.session, components), FirJvmBackendExtension(inputArtifact.session, components),
notifyCodegenStart = {}, notifyCodegenStart = {},
), ),
@@ -114,16 +114,13 @@ object GenerationUtils {
emptyList(), emptyList(),
IrGenerationExtension.getInstances(project) IrGenerationExtension.getInstances(project)
) )
val (moduleFragment, symbolTable, components) = firAnalyzerFacade.convertToIr( val fir2IrExtensions = JvmFir2IrExtensions(configuration)
JvmFir2IrExtensions(configuration) val (moduleFragment, symbolTable, components) = firAnalyzerFacade.convertToIr(fir2IrExtensions)
)
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
val extensions = JvmGeneratorExtensionsImpl(configuration)
val codegenFactory = JvmIrCodegenFactory( val codegenFactory = JvmIrCodegenFactory(
configuration, configuration,
configuration.get(CLIConfigurationKeys.PHASE_CONFIG), configuration.get(CLIConfigurationKeys.PHASE_CONFIG),
jvmGeneratorExtensions = extensions
) )
val generationState = GenerationState.Builder( val generationState = GenerationState.Builder(
@@ -137,7 +134,7 @@ object GenerationUtils {
generationState.beforeCompile() generationState.beforeCompile()
generationState.oldBEInitTrace(files) generationState.oldBEInitTrace(files)
codegenFactory.generateModuleInFrontendIRMode( codegenFactory.generateModuleInFrontendIRMode(
generationState, moduleFragment, symbolTable, extensions, FirJvmBackendExtension(session, components), generationState, moduleFragment, symbolTable, fir2IrExtensions, FirJvmBackendExtension(session, components),
) {} ) {}
generationState.factory.done() generationState.factory.done()