Skip to content

Commit 34ae35b

Browse files
committed
Move FirJvmClassCodegen inside fir:fir2ir:jvm-backend #KT-38156 Fixed
This removes dependency of IR JVM backend from FIR
1 parent dbd4cec commit 34ae35b

File tree

14 files changed

+59
-38
lines changed

14 files changed

+59
-38
lines changed

compiler/cli/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ dependencies {
2525
compile(project(":compiler:fir:jvm"))
2626
compile(project(":compiler:fir:java"))
2727
compile(project(":compiler:fir:fir2ir"))
28+
compile(project(":compiler:fir:fir2ir:jvm-backend"))
2829
compile(project(":compiler:fir:checkers"))
2930
compile(project(":kotlin-util-klib"))
3031
compile(project(":kotlin-util-io"))

compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import org.jetbrains.kotlin.config.*
5151
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
5252
import org.jetbrains.kotlin.fir.FirSession
5353
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
54+
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmClassCodegen
5455
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
5556
import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession
5657
import org.jetbrains.kotlin.fir.java.FirLibrarySession
@@ -76,7 +77,6 @@ import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade
7677
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
7778
import org.jetbrains.kotlin.utils.newLinkedHashMapWithExpectedSize
7879
import java.io.File
79-
import java.net.URLClassLoader
8080

8181
object KotlinToJVMBytecodeCompiler {
8282
private fun writeOutput(
@@ -369,7 +369,11 @@ object KotlinToJVMBytecodeCompiler {
369369
val performanceManager = environment.configuration.get(CLIConfigurationKeys.PERF_MANAGER)
370370
performanceManager?.notifyGenerationStarted()
371371
generationState.beforeCompile()
372-
codegenFactory.generateModuleInFrontendIRMode(generationState, moduleFragment, symbolTable, sourceManager)
372+
codegenFactory.generateModuleInFrontendIRMode(
373+
generationState, moduleFragment, symbolTable, sourceManager
374+
) { irClass, context, parentFunction ->
375+
FirJvmClassCodegen(irClass, context, parentFunction, session)
376+
}
373377
CodegenFactory.doCheckCancelled(generationState)
374378
generationState.factory.done()
375379
performanceManager?.notifyGenerationFinished(

compiler/fir/fir2ir/jvm-backend/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies {
1212
compileOnly(project(":compiler:fir:fir-serialization"))
1313
compileOnly(project(":compiler:ir.tree"))
1414
compileOnly(project(":compiler:backend"))
15+
compileOnly(project(":compiler:backend.jvm"))
1516

1617
compileOnly(intellijCoreDep()) { includeJars("intellij-core", "asm-all", rootProject = rootProject) }
1718
}

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FirBasedClassCodegen.kt renamed to compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmClassCodegen.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
44
*/
55

6-
package org.jetbrains.kotlin.backend.jvm.codegen
6+
package org.jetbrains.kotlin.fir.backend.jvm
77

88
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
9+
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
10+
import org.jetbrains.kotlin.backend.jvm.codegen.fileParent
11+
import org.jetbrains.kotlin.backend.jvm.codegen.mapClass
912
import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry
10-
import org.jetbrains.kotlin.codegen.*
13+
import org.jetbrains.kotlin.codegen.AsmUtil
14+
import org.jetbrains.kotlin.codegen.MultifileClassCodegenImpl
1115
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
16+
import org.jetbrains.kotlin.codegen.writeKotlinMetadata
17+
import org.jetbrains.kotlin.codegen.writeSyntheticClassMetadata
18+
import org.jetbrains.kotlin.fir.FirSession
1219
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
13-
import org.jetbrains.kotlin.fir.backend.jvm.FirJvmSerializerExtension
1420
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
1521
import org.jetbrains.kotlin.fir.declarations.FirFunction
1622
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
@@ -28,19 +34,17 @@ import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable
2834
import org.jetbrains.org.objectweb.asm.Type
2935
import org.jetbrains.org.objectweb.asm.commons.Method
3036

31-
class FirBasedClassCodegen internal constructor(
37+
class FirJvmClassCodegen(
3238
irClass: IrClass,
3339
context: JvmBackendContext,
34-
parentFunction: IrFunction? = null
40+
parentFunction: IrFunction?,
41+
session: FirSession,
3542
) : ClassCodegen(irClass, context, parentFunction) {
36-
37-
private val session = (irClass.metadata as FirMetadataSource).session
38-
3943
private val serializerExtension = FirJvmSerializerExtension(session, visitor.serializationBindings, state, irClass, typeMapper)
4044
private val serializer: FirElementSerializer? =
4145
when (val metadata = irClass.metadata) {
4246
is FirMetadataSource.Class -> FirElementSerializer.create(
43-
metadata.klass, serializerExtension, (parentClassCodegen as? FirBasedClassCodegen)?.serializer
47+
metadata.klass, serializerExtension, (parentClassCodegen as? FirJvmClassCodegen)?.serializer
4448
)
4549
is FirMetadataSource.File -> FirElementSerializer.createTopLevel(session, serializerExtension)
4650
is FirMetadataSource.Function -> FirElementSerializer.createForLambda(session, serializerExtension)

compiler/ir/backend.jvm/build.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ plugins {
55

66
dependencies {
77
compile(project(":kotlin-annotations-jvm"))
8-
compile(project(":compiler:fir:fir-serialization"))
9-
compile(project(":compiler:fir:fir2ir"))
10-
compile(project(":compiler:fir:fir2ir:jvm-backend"))
118
compile(project(":compiler:backend"))
129
compile(project(":compiler:ir.tree"))
1310
compile(project(":compiler:ir.psi2ir"))

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ class JvmBackendContext(
5353
val phaseConfig: PhaseConfig,
5454
// If the JVM fqname of a class differs from what is implied by its parent, e.g. if it's a file class
5555
// annotated with @JvmPackageName, the correct name is recorded here.
56-
internal val classNameOverride: MutableMap<IrClass, JvmClassName>
56+
val classNameOverride: MutableMap<IrClass, JvmClassName>,
57+
internal val createCodegen: (IrClass, JvmBackendContext, IrFunction?) -> ClassCodegen?,
5758
) : CommonBackendContext {
5859
override val transformedFunction: MutableMap<IrFunctionSymbol, IrSimpleFunctionSymbol>
5960
get() = TODO("not implemented")
@@ -92,10 +93,10 @@ class JvmBackendContext(
9293

9394
internal val classCodegens = mutableMapOf<IrClass, ClassCodegen>()
9495

95-
internal val localDelegatedProperties = mutableMapOf<IrClass, List<IrLocalDelegatedPropertySymbol>>()
96+
val localDelegatedProperties = mutableMapOf<IrClass, List<IrLocalDelegatedPropertySymbol>>()
9697

9798
internal val multifileFacadesToAdd = mutableMapOf<JvmClassName, MutableList<IrClass>>()
98-
internal val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
99+
val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
99100
internal val multifileFacadeClassForPart = mutableMapOf<IrClass, IrClass>()
100101
internal val multifileFacadeMemberToPartMember = mutableMapOf<IrFunction, IrFunction>()
101102

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
1515
import org.jetbrains.kotlin.codegen.state.GenerationState
1616
import org.jetbrains.kotlin.descriptors.konan.DeserializedKlibModuleOrigin
1717
import org.jetbrains.kotlin.descriptors.konan.KlibModuleOrigin
18-
import org.jetbrains.kotlin.descriptors.konan.klibModuleOrigin
19-
import org.jetbrains.kotlin.descriptors.konan.kotlinLibrary
2018
import org.jetbrains.kotlin.idea.MainFunctionDetector
2119
import org.jetbrains.kotlin.ir.backend.jvm.serialization.EmptyLoggingContext
2220
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmIrLinker
2321
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc
2422
import org.jetbrains.kotlin.ir.declarations.IrClass
23+
import org.jetbrains.kotlin.ir.declarations.IrFunction
2524
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
2625
import org.jetbrains.kotlin.ir.types.defaultType
2726
import org.jetbrains.kotlin.ir.util.*
@@ -86,10 +85,12 @@ object JvmBackendFacade {
8685
sourceManager: PsiSourceManager,
8786
phaseConfig: PhaseConfig,
8887
irProviders: List<IrProvider>,
89-
extensions: JvmGeneratorExtensions
88+
extensions: JvmGeneratorExtensions,
89+
createCodegen: (IrClass, JvmBackendContext, IrFunction?) -> ClassCodegen? = { _, _, _ -> null },
9090
) {
9191
val context = JvmBackendContext(
92-
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride
92+
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment,
93+
symbolTable, phaseConfig, extensions.classNameOverride, createCodegen
9394
)
9495
/* JvmBackendContext creates new unbound symbols, have to resolve them. */
9596
ExternalDependenciesGenerator(symbolTable, irProviders, state.languageVersionSettings).generateUnboundSymbolsAsDependencies()

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@
1717
package org.jetbrains.kotlin.backend.jvm
1818

1919
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
20+
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
2021
import org.jetbrains.kotlin.codegen.CodegenFactory
2122
import org.jetbrains.kotlin.codegen.MultifileClassCodegen
2223
import org.jetbrains.kotlin.codegen.PackageCodegen
2324
import org.jetbrains.kotlin.codegen.PackageCodegenImpl
2425
import org.jetbrains.kotlin.codegen.state.GenerationState
2526
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
27+
import org.jetbrains.kotlin.ir.declarations.IrClass
28+
import org.jetbrains.kotlin.ir.declarations.IrFunction
2629
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
2730
import org.jetbrains.kotlin.ir.descriptors.WrappedDeclarationDescriptor
2831
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
@@ -40,7 +43,11 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
4043
}
4144

4245
fun generateModuleInFrontendIRMode(
43-
state: GenerationState, irModuleFragment: IrModuleFragment, symbolTable: SymbolTable, sourceManager: PsiSourceManager
46+
state: GenerationState,
47+
irModuleFragment: IrModuleFragment,
48+
symbolTable: SymbolTable,
49+
sourceManager: PsiSourceManager,
50+
createCodegen: (IrClass, JvmBackendContext, IrFunction?) -> ClassCodegen?,
4451
) {
4552
val extensions = JvmGeneratorExtensions()
4653
val irProviders = generateTypicalIrProviderList(
@@ -55,7 +62,7 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
5562
}
5663

5764
JvmBackendFacade.doGenerateFilesInternal(
58-
state, irModuleFragment, symbolTable, sourceManager, phaseConfig, irProviders, extensions
65+
state, irModuleFragment, symbolTable, sourceManager, phaseConfig, irProviders, extensions, createCodegen
5966
)
6067
}
6168

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@ import org.jetbrains.kotlin.backend.jvm.lower.buildAssertionsDisabledField
1212
import org.jetbrains.kotlin.backend.jvm.lower.hasAssertionsDisabledField
1313
import org.jetbrains.kotlin.codegen.*
1414
import org.jetbrains.kotlin.codegen.inline.*
15-
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
1615
import org.jetbrains.kotlin.config.LanguageFeature
1716
import org.jetbrains.kotlin.descriptors.Modality
1817
import org.jetbrains.kotlin.descriptors.Visibility
19-
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
2018
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
2119
import org.jetbrains.kotlin.ir.declarations.*
2220
import org.jetbrains.kotlin.ir.descriptors.WrappedClassDescriptor
@@ -28,7 +26,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
2826
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
2927
import org.jetbrains.kotlin.ir.types.IrSimpleType
3028
import org.jetbrains.kotlin.ir.util.*
31-
import org.jetbrains.kotlin.load.java.JvmAbi
3229
import org.jetbrains.kotlin.name.Name
3330
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
3431
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
@@ -44,9 +41,9 @@ import org.jetbrains.org.objectweb.asm.tree.MethodNode
4441
import java.io.File
4542

4643
abstract class ClassCodegen protected constructor(
47-
internal val irClass: IrClass,
44+
val irClass: IrClass,
4845
val context: JvmBackendContext,
49-
private val parentFunction: IrFunction? = null
46+
private val parentFunction: IrFunction?,
5047
) : InnerClassConsumer {
5148
protected val parentClassCodegen = (parentFunction?.parentAsClass ?: irClass.parent as? IrClass)?.let { getOrCreate(it, context) }
5249
private val withinInline: Boolean = parentClassCodegen?.withinInline == true || parentFunction?.isInline == true
@@ -203,13 +200,13 @@ abstract class ClassCodegen protected constructor(
203200
}
204201

205202
companion object {
206-
fun getOrCreate(irClass: IrClass, context: JvmBackendContext, parentFunction: IrFunction? = null): ClassCodegen =
203+
fun getOrCreate(
204+
irClass: IrClass,
205+
context: JvmBackendContext,
206+
parentFunction: IrFunction? = null,
207+
): ClassCodegen =
207208
context.classCodegens.getOrPut(irClass) {
208-
if (irClass.metadata is FirMetadataSource) {
209-
FirBasedClassCodegen(irClass, context, parentFunction)
210-
} else {
211-
DescriptorBasedClassCodegen(irClass, context, parentFunction)
212-
}
209+
context.createCodegen(irClass, context, parentFunction) ?: DescriptorBasedClassCodegen(irClass, context, parentFunction)
213210
}.also {
214211
assert(parentFunction == null || it.parentFunction == parentFunction) {
215212
"inconsistent parent function for ${irClass.render()}:\n" +

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorBasedClassCodegen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import org.jetbrains.org.objectweb.asm.commons.Method
2626
class DescriptorBasedClassCodegen internal constructor(
2727
irClass: IrClass,
2828
context: JvmBackendContext,
29-
parentFunction: IrFunction? = null
29+
parentFunction: IrFunction?,
3030
) : ClassCodegen(irClass, context, parentFunction) {
3131

3232
private val serializerExtension = JvmSerializerExtension(visitor.serializationBindings, state, typeMapper)

0 commit comments

Comments
 (0)