[K2] Add Fir2IrConfiguration class to store configuration parameters

One example of such parameter is `linkViaSignatures`. There is
`Psi2IrConfiguration` as an analog for K1.
This commit is contained in:
Ivan Kylchik
2023-03-13 18:13:23 +01:00
committed by Space Team
parent 525098dea6
commit e16231104e
17 changed files with 67 additions and 37 deletions
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.BinaryModuleData
import org.jetbrains.kotlin.fir.DependencyListForCliModule
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.ConstValueProviderImpl
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions
import org.jetbrains.kotlin.fir.backend.Fir2IrVisibilityConverter
import org.jetbrains.kotlin.fir.backend.extractFirDeclarations
@@ -129,8 +130,8 @@ fun transformFirToIr(
val firResult = FirResult(firOutputs)
return firResult.convertToIrAndActualize(
fir2IrExtensions,
Fir2IrConfiguration(linkViaSignatures = false),
IrGenerationExtension.getInstances(moduleStructure.project),
linkViaSignatures = false,
signatureComposerCreator = null,
irMangler = JsManglerIr,
firManglerCreator = ::FirJsKotlinMangler,
@@ -153,10 +153,13 @@ object FirKotlinToJvmBytecodeCompiler {
performanceManager?.notifyIRTranslationStarted()
val fir2IrExtensions = JvmFir2IrExtensions(moduleConfiguration, JvmIrDeserializerImpl(), JvmIrMangler)
val fir2IrConfiguration = Fir2IrConfiguration(
linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
)
val fir2IrAndIrActualizerResult = firResult.convertToIrAndActualizeForJvm(
fir2IrExtensions,
fir2IrConfiguration,
irGenerationExtensions,
linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
diagnosticsReporter,
moduleConfiguration.languageVersionSettings
)
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
@@ -230,10 +231,12 @@ fun convertAnalyzedFirToIr(
(environment.projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let {
IrGenerationExtension.getInstances(it)
} ?: emptyList()
val linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
val fir2IrConfiguration = Fir2IrConfiguration(
linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES)
)
val (irModuleFragment, components, pluginContext, irActualizedResult) =
analysisResults.convertToIrAndActualizeForJvm(
extensions, irGenerationExtensions, linkViaSignatures,
extensions, fir2IrConfiguration, irGenerationExtensions,
environment.diagnosticsReporter, input.configuration.languageVersionSettings
)
@@ -46,14 +46,14 @@ data class Fir2IrActualizedResult(
fun FirResult.convertToIrAndActualizeForJvm(
fir2IrExtensions: Fir2IrExtensions,
fir2IrConfiguration: Fir2IrConfiguration,
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
diagnosticReporter: DiagnosticReporter,
languageVersionSettings: LanguageVersionSettings,
): Fir2IrActualizedResult = this.convertToIrAndActualize(
fir2IrExtensions,
fir2IrConfiguration,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
irMangler = JvmIrMangler,
firManglerCreator = { FirJvmKotlinMangler() },
@@ -65,8 +65,8 @@ fun FirResult.convertToIrAndActualizeForJvm(
fun FirResult.convertToIrAndActualize(
fir2IrExtensions: Fir2IrExtensions,
fir2IrConfiguration: Fir2IrConfiguration,
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
signatureComposerCreator: (() -> IdSignatureComposer)?,
irMangler: KotlinMangler.IrMangler,
firManglerCreator: () -> FirMangler,
@@ -80,7 +80,7 @@ fun FirResult.convertToIrAndActualize(
val actualizationResult: IrActualizedResult?
val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = linkViaSignatures,
generateSignatures = fir2IrConfiguration.linkViaSignatures,
signatureComposerCreator = signatureComposerCreator,
manglerCreator = firManglerCreator
)
@@ -90,8 +90,8 @@ fun FirResult.convertToIrAndActualize(
1 -> {
fir2IrResult = outputs.single().convertToIr(
fir2IrExtensions,
fir2IrConfiguration,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = null,
irMangler,
@@ -109,8 +109,8 @@ fun FirResult.convertToIrAndActualize(
val commonIrOutputs = commonOutputs.map {
it.convertToIr(
fir2IrExtensions,
fir2IrConfiguration,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = irBuiltIns,
irMangler,
@@ -125,8 +125,8 @@ fun FirResult.convertToIrAndActualize(
}
fir2IrResult = platformOutput.convertToIr(
fir2IrExtensions,
fir2IrConfiguration,
irGeneratorExtensions,
linkViaSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
irBuiltIns = irBuiltIns!!,
irMangler,
@@ -151,8 +151,8 @@ fun FirResult.convertToIrAndActualize(
private fun ModuleCompilerAnalyzedOutput.convertToIr(
fir2IrExtensions: Fir2IrExtensions,
fir2IrConfiguration: Fir2IrConfiguration,
irGeneratorExtensions: Collection<IrGenerationExtension>,
linkViaSignatures: Boolean,
commonMemberStorage: Fir2IrCommonMemberStorage,
irBuiltIns: IrBuiltInsOverFir?,
irMangler: KotlinMangler.IrMangler,
@@ -161,12 +161,11 @@ private fun ModuleCompilerAnalyzedOutput.convertToIr(
): Fir2IrResult {
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
session, scopeSession, fir,
session.languageVersionSettings, fir2IrExtensions,
session.languageVersionSettings, fir2IrExtensions, fir2IrConfiguration,
irMangler, IrFactoryImpl, visibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation for other backends.
irGeneratorExtensions,
kotlinBuiltIns = kotlinBuiltIns,
generateSignatures = linkViaSignatures,
commonMemberStorage = commonMemberStorage,
initializedIrBuiltIns = irBuiltIns
)
@@ -341,7 +341,7 @@ class Fir2IrClassifierStorage(
ClassKind.ANNOTATION_CLASS -> Modality.OPEN
else -> regularClass.modality ?: Modality.FINAL
}
val signature = runUnless(regularClass.isLocal || !generateSignatures) {
val signature = runUnless(regularClass.isLocal || !configuration.linkViaSignatures) {
signatureComposer.composeSignature(regularClass)
}
val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
@@ -591,7 +591,7 @@ class Fir2IrClassifierStorage(
// firClass may be referenced by some parent's type parameters as a bound. In that case, getIrClassSymbol will be called recursively.
getCachedIrClass(firClass)?.let { return it.symbol }
val signature = runIf(generateSignatures) {
val signature = runIf(configuration.linkViaSignatures) {
signatureComposer.composeSignature(firClass, forceTopLevelPrivate = forceTopLevelPrivate)
}
val irClass = firClass.convertWithOffsets { startOffset, endOffset ->
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.backend.generators.CallAndReferenceGenerator
import org.jetbrains.kotlin.fir.backend.generators.DelegatedMemberGenerator
import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrLock
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.linkage.IrProvider
@@ -43,5 +42,5 @@ interface Fir2IrComponents {
val delegatedMemberGenerator: DelegatedMemberGenerator
val extensions: Fir2IrExtensions
val generateSignatures: Boolean
val configuration: Fir2IrConfiguration
}
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.backend.generators.DelegatedMemberGenerator
import org.jetbrains.kotlin.fir.backend.generators.FakeOverrideGenerator
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.signaturer.FirBasedSignatureComposer
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrLock
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.linkage.IrProvider
@@ -25,7 +24,7 @@ class Fir2IrComponentsStorage(
override val irFactory: IrFactory,
override val signatureComposer: FirBasedSignatureComposer,
override val extensions: Fir2IrExtensions,
override val generateSignatures: Boolean
override val configuration: Fir2IrConfiguration,
) : Fir2IrComponents {
override lateinit var converter: Fir2IrConverter
@@ -0,0 +1,21 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.fir.backend
data class Fir2IrConfiguration(
val linkViaSignatures: Boolean
)
@@ -50,7 +50,7 @@ class Fir2IrConverter(
private var wereSourcesFakeOverridesBound = false
private val postponedDeclarationsForFakeOverridesBinding = mutableListOf<IrDeclaration>()
fun runSourcesConversion(
private fun runSourcesConversion(
allFirFiles: List<FirFile>,
irModuleFragment: IrModuleFragmentImpl,
irGenerationExtensions: Collection<IrGenerationExtension>,
@@ -442,12 +442,12 @@ class Fir2IrConverter(
firFiles: List<FirFile>,
languageVersionSettings: LanguageVersionSettings,
fir2IrExtensions: Fir2IrExtensions,
fir2IrConfiguration: Fir2IrConfiguration,
irMangler: KotlinMangler.IrMangler,
irFactory: IrFactory,
visibilityConverter: Fir2IrVisibilityConverter,
specialSymbolProvider: Fir2IrSpecialSymbolProvider,
irGenerationExtensions: Collection<IrGenerationExtension>,
generateSignatures: Boolean,
kotlinBuiltIns: KotlinBuiltIns,
commonMemberStorage: Fir2IrCommonMemberStorage,
initializedIrBuiltIns: IrBuiltInsOverFir?
@@ -460,7 +460,7 @@ class Fir2IrConverter(
irFactory,
commonMemberStorage.signatureComposer,
fir2IrExtensions,
generateSignatures
fir2IrConfiguration,
)
val converter = Fir2IrConverter(moduleDescriptor, components)
@@ -526,7 +526,7 @@ class Fir2IrDeclarationStorage(
val signature =
runUnless(
isLocal ||
!generateSignatures && irParent !is Fir2IrLazyClass &&
!configuration.linkViaSignatures && irParent !is Fir2IrLazyClass &&
function.dispatchReceiverType?.isPrimitive != true && function.containerSource == null &&
updatedOrigin != IrDeclarationOrigin.FAKE_OVERRIDE && !function.isOverride
) {
@@ -632,7 +632,7 @@ class Fir2IrDeclarationStorage(
val origin = constructor.computeIrOrigin(predefinedOrigin)
val isPrimary = constructor.isPrimary
val signature =
runUnless(isLocal || !generateSignatures) {
runUnless(isLocal || !configuration.linkViaSignatures) {
signatureComposer.composeSignature(constructor, forceTopLevelPrivate = forceTopLevelPrivate)
}
val visibility = if (irParent.isAnonymousObject) Visibilities.Public else constructor.visibility
@@ -868,7 +868,7 @@ class Fir2IrDeclarationStorage(
val signature =
runUnless(
isLocal ||
!generateSignatures && irParent !is Fir2IrLazyClass &&
!configuration.linkViaSignatures && irParent !is Fir2IrLazyClass &&
property.dispatchReceiverType?.isPrimitive != true && property.containerSource == null &&
origin != IrDeclarationOrigin.FAKE_OVERRIDE && !property.isOverride
) {
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.cli.jvm.config.*
import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions
import org.jetbrains.kotlin.fir.pipeline.FirResult
import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualizeForJvm
@@ -273,12 +274,13 @@ class IncrementalFirJvmCompilerRunner(
performanceManager?.notifyIRTranslationStarted()
val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val fir2IrConfiguration = Fir2IrConfiguration(linkViaSignatures = false)
val irGenerationExtensions =
(projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty()
val (irModuleFragment, components, pluginContext, irActualizedResult) = cycleResult.convertToIrAndActualizeForJvm(
extensions,
fir2IrConfiguration,
irGenerationExtensions,
linkViaSignatures = false,
compilerEnvironment.diagnosticsReporter,
configuration.languageVersionSettings
)
@@ -151,11 +151,11 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
session, scopeSession, firFiles.toList(),
languageVersionSettings,
fir2IrExtensions,
Fir2IrConfiguration(linkViaSignatures = false),
JsManglerIr, IrFactoryImpl,
Fir2IrVisibilityConverter.Default,
Fir2IrJvmSpecialAnnotationSymbolProvider(), // TODO: replace with appropriate (probably empty) implementation
irGeneratorExtensions,
generateSignatures = false,
kotlinBuiltIns = builtIns ?: DefaultBuiltIns.Instance, // TODO: consider passing externally,
commonMemberStorage = commonMemberStorage,
initializedIrBuiltIns = irBuiltIns
@@ -86,8 +86,8 @@ class Fir2IrResultsConverter(
lateinit var mainIrPart: JvmIrCodegenFactory.JvmIrBackendInput
lateinit var mainModuleComponents: Fir2IrComponents
val generateSignatures =
(inputArtifact.partsForDependsOnModules.last().firAnalyzerFacade as? FirAnalyzerFacade)?.generateSignatures == true
val firAnalyzerFacade = inputArtifact.partsForDependsOnModules.last().firAnalyzerFacade as? FirAnalyzerFacade
val generateSignatures = firAnalyzerFacade?.fir2IrConfiguration?.linkViaSignatures == true
val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = generateSignatures,
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.container.topologicalSort
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.deserialization.ModuleDataProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
@@ -37,9 +38,9 @@ import org.jetbrains.kotlin.platform.isJs
import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.platform.konan.isNative
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.FirParser
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
import org.jetbrains.kotlin.test.FirParser
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
import org.jetbrains.kotlin.test.directives.model.singleValue
import org.jetbrains.kotlin.test.getAnalyzerServices
@@ -304,12 +305,12 @@ open class FirFrontendFacade(
val firAnalyzerFacade = FirAnalyzerFacade(
moduleBasedSession,
module.languageVersionSettings,
Fir2IrConfiguration(linkViaSignatures = module.targetBackend == TargetBackend.JVM_IR_SERIALIZE),
ktFiles,
lightTreeFiles,
IrGenerationExtension.getInstances(project),
parser,
enablePluginPhases,
generateSignatures = module.targetBackend == TargetBackend.JVM_IR_SERIALIZE
)
val firFiles = firAnalyzerFacade.runResolution()
val filesMap = firFiles.mapNotNull { firFile ->
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.fir.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.FirTestSessionFactoryHelper
import org.jetbrains.kotlin.fir.backend.Fir2IrCommonMemberStorage
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendClassResolver
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler
@@ -122,16 +123,16 @@ object GenerationUtils {
val firAnalyzerFacade = FirAnalyzerFacade(
session,
configuration.languageVersionSettings,
Fir2IrConfiguration(linkViaSignatures = false),
files,
emptyList(),
IrGenerationExtension.getInstances(project),
FirParser.Psi,
generateSignatures = false
)
val fir2IrExtensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler)
val commonMemberStorage = Fir2IrCommonMemberStorage(
generateSignatures = firAnalyzerFacade.generateSignatures,
generateSignatures = firAnalyzerFacade.fir2IrConfiguration.linkViaSignatures,
signatureComposerCreator = { JvmIdSignatureDescriptor(JvmDescriptorMangler(null)) },
manglerCreator = { FirJvmKotlinMangler() }
)
@@ -43,12 +43,12 @@ abstract class AbstractFirAnalyzerFacade {
class FirAnalyzerFacade(
val session: FirSession,
val languageVersionSettings: LanguageVersionSettings,
val fir2IrConfiguration: Fir2IrConfiguration,
val ktFiles: Collection<KtFile> = emptyList(), // may be empty if light tree mode enabled
val lightTreeFiles: Collection<LightTreeFile> = emptyList(), // may be empty if light tree mode disabled
val irGeneratorExtensions: Collection<IrGenerationExtension>,
val parser: FirParser,
val enablePluginPhases: Boolean = false,
val generateSignatures: Boolean = false
) : AbstractFirAnalyzerFacade() {
private var firFiles: List<FirFile>? = null
private var _scopeSession: ScopeSession? = null
@@ -116,11 +116,11 @@ class FirAnalyzerFacade(
session, _scopeSession!!, firFiles!!,
languageVersionSettings,
fir2IrExtensions,
fir2IrConfiguration,
JvmIrMangler, IrFactoryImpl,
FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irGeneratorExtensions,
generateSignatures,
kotlinBuiltIns = DefaultBuiltIns.Instance, // TODO: consider passing externally,
commonMemberStorage = commonMemberStorage,
initializedIrBuiltIns = irBuiltIns
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentTypeTransformer
import org.jetbrains.kotlin.descriptors.isEmpty
import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib
import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
@@ -72,8 +73,8 @@ internal fun PhaseContext.fir2Ir(
val (irModuleFragment, components, pluginContext, irActualizedResult) = input.firResult.convertToIrAndActualize(
fir2IrExtensions,
Fir2IrConfiguration(linkViaSignatures = false),
IrGenerationExtension.getInstances(config.project),
linkViaSignatures = false,
signatureComposerCreator = null,
irMangler = KonanManglerIr,
firManglerCreator = { FirNativeKotlinMangler() },