From 4fca52b66c820ee087060cdac33a93ef0e5d5a05 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 6 Nov 2023 08:49:04 +0000 Subject: [PATCH] FIR entrypoint: deduplicate some code and remove JVM dependency Deduplicate Fir2IrExtensions creation and move the convertToIrAndActualizeForJvm function to 'cli', which allows to remove the dependency of 'fir.entrypoint' on 'backend.jvm'. Note that behavior slightly changes in IncrementalFirJvmCompilerRunner: previously the value of linkViaSignatures was always false, now it is taken from the compiler configuration, which seems more correct. --- .../FirKotlinToJvmBytecodeCompiler.kt | 36 +----------- .../compiler/KotlinToJVMBytecodeCompiler.kt | 7 +-- .../jvm/compiler/pipeline/compilerPipeline.kt | 57 ++++++++++++------- compiler/fir/entrypoint/build.gradle.kts | 2 +- .../kotlin/fir/pipeline/convertToIr.kt | 21 ------- .../IncrementalFirJvmCompilerRunner.kt | 21 ++----- 6 files changed, 50 insertions(+), 94 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index 6ca407b8547..0b0abafa36e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -17,21 +17,17 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.ModuleCompilerEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.ModuleCompilerIrBackendInput +import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.convertToIrAndActualizeForJvm import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.generateCodeFromIr import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar -import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys -import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.constant.EvaluatedConstTracker -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector import org.jetbrains.kotlin.diagnostics.impl.PendingDiagnosticsCollectorWithSuppress import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.backend.Fir2IrConfiguration import org.jetbrains.kotlin.fir.backend.jvm.JvmFir2IrExtensions import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction @@ -41,7 +37,6 @@ import org.jetbrains.kotlin.fir.packageFqName import org.jetbrains.kotlin.fir.pipeline.Fir2IrActualizedResult import org.jetbrains.kotlin.fir.pipeline.FirResult import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFirFromKtFiles -import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualizeForJvm import org.jetbrains.kotlin.fir.types.arrayElementType import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isArrayType @@ -163,9 +158,8 @@ object FirKotlinToJvmBytecodeCompiler { performanceManager?.notifyIRTranslationStarted() val fir2IrExtensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler) - val fir2IrAndIrActualizerResult = convertToIrAndActualizeForJvm( - firResult, diagnosticsReporter, fir2IrExtensions, irGenerationExtensions - ) + val fir2IrAndIrActualizerResult = + firResult.convertToIrAndActualizeForJvm(fir2IrExtensions, configuration, diagnosticsReporter, irGenerationExtensions) performanceManager?.notifyIRTranslationFinished() @@ -230,30 +224,6 @@ object FirKotlinToJvmBytecodeCompiler { return runUnless(syntaxErrors || diagnosticsReporter.hasErrors) { FirResult(outputs) } } - fun FrontendContext.convertToIrAndActualizeForJvm( - firResult: FirResult, - diagnosticsReporter: DiagnosticReporter, - fir2IrExtensions: JvmFir2IrExtensions, - irGenerationExtensions: Collection, - ): Fir2IrActualizedResult { - val fir2IrConfiguration = Fir2IrConfiguration( - languageVersionSettings = configuration.languageVersionSettings, - diagnosticReporter = diagnosticsReporter, - linkViaSignatures = configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES), - evaluatedConstTracker = configuration - .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), - inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], - expectActualTracker = configuration[CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER], - allowNonCachedDeclarations = false, - useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), - ) - return firResult.convertToIrAndActualizeForJvm( - fir2IrExtensions, - fir2IrConfiguration, - irGenerationExtensions, - ) - } - private fun CompilationContext.runBackend( fir2IrExtensions: JvmFir2IrExtensions, fir2IrActualizedResult: Fir2IrActualizedResult, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index 64b3f5b1bf5..40242b2af7c 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -24,8 +24,8 @@ import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot import org.jetbrains.kotlin.cli.common.fir.FirDiagnosticsCompilerResultsReporter import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport import org.jetbrains.kotlin.cli.common.toLogger -import org.jetbrains.kotlin.cli.jvm.compiler.FirKotlinToJvmBytecodeCompiler.convertToIrAndActualizeForJvm import org.jetbrains.kotlin.cli.jvm.compiler.FirKotlinToJvmBytecodeCompiler.runFrontend +import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.convertToIrAndActualizeForJvm import org.jetbrains.kotlin.cli.jvm.config.* import org.jetbrains.kotlin.cli.jvm.config.ClassicFrontendSpecificJvmConfigurationKeys.JAVA_CLASSES_TRACKER import org.jetbrains.kotlin.codegen.ClassBuilderFactories @@ -178,9 +178,8 @@ object KotlinToJVMBytecodeCompiler { // K2/PSI: FIR2IR val fir2IrExtensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler) val irGenerationExtensions = IrGenerationExtension.getInstances(project) - val fir2IrAndIrActualizerResult = convertToIrAndActualizeForJvm( - firResult, diagnosticsReporter, fir2IrExtensions, irGenerationExtensions - ) + val fir2IrAndIrActualizerResult = + firResult.convertToIrAndActualizeForJvm(fir2IrExtensions, configuration, diagnosticsReporter, irGenerationExtensions) val (factory, input) = fir2IrAndIrActualizerResult.codegenFactoryWithJvmIrBackendInput(configuration) return BackendInputForMultiModuleChunk( factory, diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt index b4a93ffbfc3..5979497333e 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/pipeline/compilerPipeline.kt @@ -20,6 +20,8 @@ import org.jetbrains.kotlin.KtSourceFile import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.backend.jvm.JvmIrDeserializerImpl +import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext +import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.cli.common.* import org.jetbrains.kotlin.cli.common.fir.reportToMessageCollector import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity @@ -41,16 +43,14 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.constant.EvaluatedConstTracker +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector 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 +import org.jetbrains.kotlin.fir.backend.Fir2IrExtensions +import org.jetbrains.kotlin.fir.backend.jvm.* import org.jetbrains.kotlin.fir.extensions.FirAnalysisHandlerExtension import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.pipeline.FirResult -import org.jetbrains.kotlin.fir.pipeline.buildResolveAndCheckFirViaLightTree -import org.jetbrains.kotlin.fir.pipeline.convertToIrAndActualizeForJvm +import org.jetbrains.kotlin.fir.pipeline.* import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.session.IncrementalCompilationContext import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment @@ -172,25 +172,13 @@ fun convertAnalyzedFirToIr( ): ModuleCompilerIrBackendInput { val extensions = JvmFir2IrExtensions(input.configuration, JvmIrDeserializerImpl(), JvmIrMangler) - // fir2ir val irGenerationExtensions = (environment.projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) } ?: emptyList() - val fir2IrConfiguration = Fir2IrConfiguration( - languageVersionSettings = input.configuration.languageVersionSettings, - diagnosticReporter = environment.diagnosticsReporter, - linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES), - evaluatedConstTracker = input.configuration - .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), - inlineConstTracker = input.configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], - expectActualTracker = input.configuration[CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER], - allowNonCachedDeclarations = false, - useIrFakeOverrideBuilder = input.configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), - ) val (moduleFragment, components, pluginContext, irActualizedResult) = analysisResults.convertToIrAndActualizeForJvm( - extensions, fir2IrConfiguration, irGenerationExtensions, + extensions, input.configuration, environment.diagnosticsReporter, irGenerationExtensions, ) return ModuleCompilerIrBackendInput( @@ -204,6 +192,37 @@ fun convertAnalyzedFirToIr( ) } +fun FirResult.convertToIrAndActualizeForJvm( + fir2IrExtensions: Fir2IrExtensions, + configuration: CompilerConfiguration, + diagnosticsReporter: DiagnosticReporter, + irGeneratorExtensions: Collection, +): Fir2IrActualizedResult { + val fir2IrConfiguration = Fir2IrConfiguration( + languageVersionSettings = configuration.languageVersionSettings, + diagnosticReporter = diagnosticsReporter, + linkViaSignatures = configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES), + evaluatedConstTracker = configuration + .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), + inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], + expectActualTracker = configuration[CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER], + allowNonCachedDeclarations = false, + useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), + ) + + return convertToIrAndActualize( + fir2IrExtensions, + fir2IrConfiguration, + irGeneratorExtensions, + signatureComposerForJvmFir2Ir(fir2IrConfiguration.linkViaSignatures), + JvmIrMangler, + FirJvmKotlinMangler(), + FirJvmVisibilityConverter, + DefaultBuiltIns.Instance, + ::JvmIrTypeSystemContext, + ) +} + fun generateCodeFromIr( input: ModuleCompilerIrBackendInput, environment: ModuleCompilerEnvironment, diff --git a/compiler/fir/entrypoint/build.gradle.kts b/compiler/fir/entrypoint/build.gradle.kts index ec3bef1e147..115fdbdbf31 100644 --- a/compiler/fir/entrypoint/build.gradle.kts +++ b/compiler/fir/entrypoint/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { implementation(project(":compiler:fir:resolve")) implementation(project(":compiler:fir:fir-serialization")) implementation(project(":compiler:fir:fir2ir:jvm-backend")) - implementation(project(":compiler:backend.jvm")) + implementation(project(":compiler:ir.backend.common")) implementation(project(":compiler:ir.serialization.common")) implementation(project(":compiler:ir.serialization.jvm")) implementation(project(":compiler:ir.serialization.js")) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt index 40998d0e09c..e6b6f82b793 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt @@ -9,20 +9,15 @@ import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext -import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor -import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProvider -import org.jetbrains.kotlin.fir.backend.jvm.FirJvmKotlinMangler -import org.jetbrains.kotlin.fir.backend.jvm.FirJvmVisibilityConverter import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler -import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrMangler import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.types.IrTypeSystemContext @@ -66,22 +61,6 @@ data class Fir2IrActualizedResult( val irActualizedResult: IrActualizedResult?, ) -fun FirResult.convertToIrAndActualizeForJvm( - fir2IrExtensions: Fir2IrExtensions, - fir2IrConfiguration: Fir2IrConfiguration, - irGeneratorExtensions: Collection, -): Fir2IrActualizedResult = this.convertToIrAndActualize( - fir2IrExtensions, - fir2IrConfiguration, - irGeneratorExtensions, - signatureComposer = signatureComposerForJvmFir2Ir(fir2IrConfiguration.linkViaSignatures), - irMangler = JvmIrMangler, - firMangler = FirJvmKotlinMangler(), - visibilityConverter = FirJvmVisibilityConverter, - kotlinBuiltIns = DefaultBuiltIns.Instance, - actualizerTypeContextProvider = ::JvmIrTypeSystemContext, -) - fun signatureComposerForJvmFir2Ir(generateSignatures: Boolean): IdSignatureComposer { val mangler = JvmDescriptorMangler(null) return if (generateSignatures) { diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt index 8a58d5e3b9a..c2b8ef0d732 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalFirJvmCompilerRunner.kt @@ -29,17 +29,17 @@ import org.jetbrains.kotlin.cli.common.messages.IrMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.modules.ModuleBuilder import org.jetbrains.kotlin.cli.jvm.* -import org.jetbrains.kotlin.cli.jvm.compiler.* +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.cli.jvm.compiler.findMainClass +import org.jetbrains.kotlin.cli.jvm.compiler.forAllFiles import org.jetbrains.kotlin.cli.jvm.compiler.pipeline.* +import org.jetbrains.kotlin.cli.jvm.compiler.writeOutputsIfNeeded import org.jetbrains.kotlin.cli.jvm.config.* import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.constant.EvaluatedConstTracker 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 import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.InlineConstTracker @@ -271,20 +271,9 @@ open class IncrementalFirJvmCompilerRunner( performanceManager?.notifyIRTranslationStarted() val extensions = JvmFir2IrExtensions(configuration, JvmIrDeserializerImpl(), JvmIrMangler) - val fir2IrConfiguration = Fir2IrConfiguration( - languageVersionSettings = configuration.languageVersionSettings, - diagnosticReporter = compilerEnvironment.diagnosticsReporter, - linkViaSignatures = false, - evaluatedConstTracker = configuration - .putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()), - inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER], - expectActualTracker = configuration[CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER], - allowNonCachedDeclarations = false, - useIrFakeOverrideBuilder = configuration.getBoolean(CommonConfigurationKeys.USE_IR_FAKE_OVERRIDE_BUILDER), - ) val irGenerationExtensions = projectEnvironment.project.let { IrGenerationExtension.getInstances(it) } val (irModuleFragment, components, pluginContext, irActualizedResult) = cycleResult.convertToIrAndActualizeForJvm( - extensions, fir2IrConfiguration, irGenerationExtensions, + extensions, configuration, compilerEnvironment.diagnosticsReporter, irGenerationExtensions, ) performanceManager?.notifyIRTranslationFinished()