Skip to content

Commit 1ed23d7

Browse files
author
Georgy Bronnikov
committed
IR: reorganize IrProvider handling
Make DeclarationStubGenerator a subclass of IrProvider, anticipating deserialization of IR structures for JVM_IR backend.
1 parent be04912 commit 1ed23d7

File tree

17 files changed

+194
-134
lines changed

17 files changed

+194
-134
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ extra["compilerModules"] = arrayOf(
214214
":compiler:backend.wasm",
215215
":compiler:ir.serialization.common",
216216
":compiler:ir.serialization.js",
217+
":compiler:ir.serialization.jvm",
217218
":kotlin-util-io",
218219
":kotlin-util-klib",
219220
":kotlin-util-klib-metadata",

compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFile
1414
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
1515
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
1616
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
17-
import org.jetbrains.kotlin.ir.util.ConstantValueGenerator
18-
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
19-
import org.jetbrains.kotlin.ir.util.SymbolTable
20-
import org.jetbrains.kotlin.ir.util.TypeTranslator
17+
import org.jetbrains.kotlin.ir.util.*
2118
import org.jetbrains.kotlin.psi.KtFile
2219
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
2320

@@ -57,6 +54,7 @@ object Fir2IrConverter {
5754
builtIns: IrBuiltIns
5855
) {
5956
// TODO: provide StubGeneratorExtensions for correct lazy stub IR generation on JVM
60-
ExternalDependenciesGenerator(irModule.descriptor, symbolTable, builtIns).generateUnboundSymbolsAsDependencies()
57+
ExternalDependenciesGenerator(symbolTable, generateTypicalIrProviderList(irModule.descriptor, builtIns, symbolTable))
58+
.generateUnboundSymbolsAsDependencies()
6159
}
62-
}
60+
}

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
2121
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
2222
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
2323
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
24+
import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
2425
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
2526
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
2627
import org.jetbrains.kotlin.library.KotlinLibrary
@@ -67,16 +68,18 @@ fun compile(
6768

6869
// Load declarations referenced during `context` initialization
6970
dependencyModules.forEach {
70-
ExternalDependenciesGenerator(it.descriptor, symbolTable, irBuiltIns, deserializer).generateUnboundSymbolsAsDependencies()
71+
val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer)
72+
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
7173
}
7274

7375
val irFiles = dependencyModules.flatMap { it.files } + moduleFragment.files
7476

7577
moduleFragment.files.clear()
7678
moduleFragment.files += irFiles
7779

80+
val irProvidersWithoutDeserializer = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable)
7881
// Create stubs
79-
ExternalDependenciesGenerator(moduleDescriptor, symbolTable, irBuiltIns).generateUnboundSymbolsAsDependencies()
82+
ExternalDependenciesGenerator(symbolTable, irProvidersWithoutDeserializer).generateUnboundSymbolsAsDependencies()
8083
moduleFragment.patchDeclarationParents()
8184

8285
moveBodilessDeclarationsToSeparatePlace(context, moduleFragment)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dependencies {
99
compile(project(":compiler:ir.tree"))
1010
compile(project(":compiler:ir.psi2ir"))
1111
compile(project(":compiler:ir.backend.common"))
12+
compile(project(":compiler:ir.serialization.jvm"))
1213
compileOnly(intellijCoreDep()) { includeJars("intellij-core", "asm-all", "guava", rootProject = rootProject) }
1314
compileOnly(intellijDep()) { includeJars("trove4j", rootProject = rootProject) }
1415
}

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ class JvmBackendContext(
4747
override val irBuiltIns: IrBuiltIns,
4848
irModuleFragment: IrModuleFragment,
4949
symbolTable: SymbolTable,
50-
val phaseConfig: PhaseConfig
50+
val phaseConfig: PhaseConfig,
51+
// If the JVM fqname of a class differs from what is implied by its parent, e.g. if it's a file class
52+
// annotated with @JvmPackageName, the correct name is recorded here.
53+
internal val classNameOverride: MutableMap<IrClass, JvmClassName>
5154
) : CommonBackendContext {
5255
override val transformedFunction: MutableMap<IrFunctionSymbol, IrSimpleFunctionSymbol>
5356
get() = TODO("not implemented")
@@ -86,10 +89,6 @@ class JvmBackendContext(
8689

8790
internal val localDelegatedProperties = mutableMapOf<IrClass, List<IrLocalDelegatedPropertySymbol>>()
8891

89-
// If the JVM fqname of a class differs from what is implied by its parent, e.g. if it's a file class
90-
// annotated with @JvmPackageName, the correct name is recorded here.
91-
internal lateinit var classNameOverride: MutableMap<IrClass, JvmClassName>
92-
9392
internal val multifileFacadesToAdd = mutableMapOf<JvmClassName, MutableList<IrClass>>()
9493
internal val multifileFacadeForPart = mutableMapOf<IrClass, JvmClassName>()
9594
internal val multifileFacadeMemberToPartMember = mutableMapOf<IrFunction, IrFunction>()

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ package org.jetbrains.kotlin.backend.jvm
77

88
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
99
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
10-
import org.jetbrains.kotlin.backend.common.ir.createParameterDeclarations
1110
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
1211
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
1312
import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry
13+
import org.jetbrains.kotlin.backend.jvm.serialization.JvmMangler
1414
import org.jetbrains.kotlin.codegen.CompilationErrorHandler
1515
import org.jetbrains.kotlin.codegen.state.GenerationState
1616
import org.jetbrains.kotlin.ir.declarations.IrClass
1717
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
18+
import org.jetbrains.kotlin.ir.util.*
1819
import org.jetbrains.kotlin.ir.types.defaultType
19-
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
2020
import org.jetbrains.kotlin.ir.util.SymbolTable
2121
import org.jetbrains.kotlin.ir.util.render
2222
import org.jetbrains.kotlin.psi.KtFile
@@ -30,7 +30,7 @@ object JvmBackendFacade {
3030
errorHandler: CompilationErrorHandler,
3131
phaseConfig: PhaseConfig
3232
) {
33-
val psi2ir = Psi2IrTranslator(state.languageVersionSettings)
33+
val psi2ir = Psi2IrTranslator(state.languageVersionSettings, mangler = JvmMangler)
3434
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, extensions = JvmGeneratorExtensions)
3535
val extensions = JvmStubGeneratorExtensions()
3636

@@ -50,7 +50,11 @@ object JvmBackendFacade {
5050
}
5151
}
5252

53-
val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, stubGeneratorExtensions = extensions)
53+
val irProviders = generateTypicalIrProviderList(
54+
psi2irContext.moduleDescriptor, psi2irContext.irBuiltIns, psi2irContext.symbolTable,
55+
extensions = extensions
56+
)
57+
val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files, irProviders = irProviders)
5458
doGenerateFilesInternal(
5559
state, errorHandler, irModuleFragment, psi2irContext.symbolTable, psi2irContext.sourceManager, phaseConfig, extensions
5660
)
@@ -66,7 +70,7 @@ object JvmBackendFacade {
6670
extensions: JvmStubGeneratorExtensions = JvmStubGeneratorExtensions()
6771
) {
6872
val context = JvmBackendContext(
69-
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig
73+
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride
7074
)
7175
state.irBasedMapAsmMethod = { descriptor ->
7276
context.methodSignatureMapper.mapAsmMethod(context.referenceFunction(descriptor).owner)
@@ -75,15 +79,6 @@ object JvmBackendFacade {
7579
context.typeMapper.mapType(context.referenceClass(descriptor).defaultType)
7680
}
7781

78-
ExternalDependenciesGenerator(
79-
irModuleFragment.descriptor,
80-
symbolTable,
81-
irModuleFragment.irBuiltins,
82-
extensions = extensions
83-
).generateUnboundSymbolsAsDependencies()
84-
85-
context.classNameOverride = extensions.classNameOverride
86-
8782
try {
8883
JvmLower(context).lower(irModuleFragment)
8984
} catch (e: Throwable) {

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import org.jetbrains.kotlin.codegen.*
2121
import org.jetbrains.kotlin.codegen.state.GenerationState
2222
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
2323
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
24+
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
2425
import org.jetbrains.kotlin.ir.util.SymbolTable
26+
import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
2527
import org.jetbrains.kotlin.name.FqName
2628
import org.jetbrains.kotlin.psi.KtFile
2729
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
@@ -39,7 +41,14 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
3941
symbolTable: SymbolTable,
4042
sourceManager: PsiSourceManager
4143
) {
42-
JvmBackendFacade.doGenerateFilesInternal(state, errorHandler, irModuleFragment, symbolTable, sourceManager, phaseConfig)
44+
val stubGeneratorExtensions = JvmStubGeneratorExtensions()
45+
val irProviders = generateTypicalIrProviderList(
46+
irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = stubGeneratorExtensions
47+
)
48+
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
49+
JvmBackendFacade.doGenerateFilesInternal(
50+
state, errorHandler, irModuleFragment, symbolTable, sourceManager, phaseConfig, stubGeneratorExtensions
51+
)
4352
}
4453

4554
override fun createPackageCodegen(state: GenerationState, files: Collection<KtFile>, fqName: FqName): PackageCodegen {

compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.wasm.codegen.IrModuleToWasm
1212
import org.jetbrains.kotlin.config.CompilerConfiguration
1313
import org.jetbrains.kotlin.ir.backend.js.loadIr
1414
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
15+
import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
1516
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
1617
import org.jetbrains.kotlin.library.KotlinLibrary
1718
import org.jetbrains.kotlin.library.resolver.KotlinLibraryResolveResult
@@ -37,7 +38,8 @@ fun compileWasm(
3738

3839
// Load declarations referenced during `context` initialization
3940
dependencyModules.forEach {
40-
ExternalDependenciesGenerator(it.descriptor, symbolTable, irBuiltIns, deserializer).generateUnboundSymbolsAsDependencies()
41+
val irProviders = generateTypicalIrProviderList(it.descriptor, irBuiltIns, symbolTable, deserializer)
42+
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
4143
}
4244

4345
val irFiles = dependencyModules.flatMap { it.files } + moduleFragment.files
@@ -46,10 +48,11 @@ fun compileWasm(
4648
moduleFragment.files += irFiles
4749

4850
// Create stubs
49-
ExternalDependenciesGenerator(moduleDescriptor, symbolTable, irBuiltIns).generateUnboundSymbolsAsDependencies()
51+
val irProviders = generateTypicalIrProviderList(moduleDescriptor, irBuiltIns, symbolTable, deserializer)
52+
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
5053
moduleFragment.patchDeclarationParents()
5154

5255
wasmPhases.invokeToplevel(phaseConfig, context, moduleFragment)
5356

5457
return IrModuleToWasm(context).generateModule(moduleFragment)
55-
}
58+
}

compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ typealias Psi2IrPostprocessingStep = (IrModuleFragment) -> Unit
3535

3636
class Psi2IrTranslator(
3737
val languageVersionSettings: LanguageVersionSettings,
38-
val configuration: Psi2IrConfiguration = Psi2IrConfiguration()
38+
val configuration: Psi2IrConfiguration = Psi2IrConfiguration(),
39+
val mangler: KotlinMangler? = null
3940
) {
4041
private val postprocessingSteps = SmartList<Psi2IrPostprocessingStep>()
4142

@@ -51,30 +52,37 @@ class Psi2IrTranslator(
5152
stubGeneratorExtensions: StubGeneratorExtensions
5253
): IrModuleFragment {
5354
val context = createGeneratorContext(moduleDescriptor, bindingContext, extensions = generatorExtensions)
54-
return generateModuleFragment(context, ktFiles, stubGeneratorExtensions = stubGeneratorExtensions)
55+
return generateModuleFragment(
56+
context, ktFiles,
57+
irProviders = generateTypicalIrProviderList(
58+
moduleDescriptor, context.irBuiltIns, context.symbolTable,
59+
extensions = stubGeneratorExtensions
60+
)
61+
)
5562
}
5663

5764
fun createGeneratorContext(
5865
moduleDescriptor: ModuleDescriptor,
5966
bindingContext: BindingContext,
60-
symbolTable: SymbolTable = SymbolTable(),
67+
symbolTable: SymbolTable = SymbolTable(mangler),
6168
extensions: GeneratorExtensions = GeneratorExtensions()
6269
): GeneratorContext =
6370
GeneratorContext(configuration, moduleDescriptor, bindingContext, languageVersionSettings, symbolTable, extensions)
6471

6572
fun generateModuleFragment(
6673
context: GeneratorContext,
6774
ktFiles: Collection<KtFile>,
68-
deserializer: IrDeserializer? = null,
69-
irProviders: List<IrProvider> = emptyList(),
70-
stubGeneratorExtensions: StubGeneratorExtensions = StubGeneratorExtensions()
75+
irProviders: List<IrProvider>
7176
): IrModuleFragment {
7277
val moduleGenerator = ModuleGenerator(context)
73-
val irModule = moduleGenerator.generateModuleFragment(ktFiles)
78+
val irModule = moduleGenerator.generateModuleFragmentWithoutDependencies(ktFiles)
7479

80+
moduleGenerator.generateUnboundSymbolsAsDependencies(irProviders)
7581
irModule.patchDeclarationParents()
7682
postprocess(context, irModule)
77-
moduleGenerator.generateUnboundSymbolsAsDependencies(irModule, deserializer, irProviders, stubGeneratorExtensions)
83+
irModule.computeUniqIdForDeclarations(context.symbolTable)
84+
85+
moduleGenerator.generateUnboundSymbolsAsDependencies(irProviders)
7886
return irModule
7987
}
8088

compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
2626
import org.jetbrains.kotlin.ir.util.IrDeserializer
2727
import org.jetbrains.kotlin.ir.util.IrProvider
2828
import org.jetbrains.kotlin.ir.util.StubGeneratorExtensions
29+
import org.jetbrains.kotlin.ir.util.generateTypicalIrProviderList
2930
import org.jetbrains.kotlin.psi.KtFile
3031
import org.jetbrains.kotlin.resolve.BindingContext
3132
import org.jetbrains.kotlin.resolve.lazy.descriptors.findPackageFragmentForFile
@@ -35,20 +36,30 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator {
3536

3637
private val constantValueGenerator = context.constantValueGenerator
3738

38-
fun generateModuleFragment(ktFiles: Collection<KtFile>): IrModuleFragment =
39+
fun generateModuleFragment(ktFiles: Collection<KtFile>, deserializer: IrDeserializer, extensions: StubGeneratorExtensions = StubGeneratorExtensions.EMPTY): IrModuleFragment =
40+
generateModuleFragmentWithoutDependencies(ktFiles).also { irModule ->
41+
generateUnboundSymbolsAsDependencies(irModule, deserializer, extensions)
42+
}
43+
44+
fun generateModuleFragmentWithoutDependencies(ktFiles: Collection<KtFile>): IrModuleFragment =
3945
IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns).also { irModule ->
4046
irModule.files.addAll(generateFiles(ktFiles))
4147
}
4248

4349
fun generateUnboundSymbolsAsDependencies(
4450
irModule: IrModuleFragment,
4551
deserializer: IrDeserializer? = null,
46-
irProviders: List<IrProvider> = emptyList(),
4752
extensions: StubGeneratorExtensions = StubGeneratorExtensions.EMPTY
4853
) {
49-
ExternalDependenciesGenerator(
50-
irModule.descriptor, context.symbolTable, context.irBuiltIns, deserializer, irProviders, extensions
51-
).generateUnboundSymbolsAsDependencies()
54+
val fullIrProvidersList = generateTypicalIrProviderList(
55+
irModule.descriptor, context.irBuiltIns, context.symbolTable, deserializer,
56+
extensions
57+
)
58+
ExternalDependenciesGenerator(context.symbolTable, fullIrProvidersList).generateUnboundSymbolsAsDependencies()
59+
}
60+
61+
fun generateUnboundSymbolsAsDependencies(irProviders: List<IrProvider>) {
62+
ExternalDependenciesGenerator(context.symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
5263
}
5364

5465
private fun generateFiles(ktFiles: Collection<KtFile>): List<IrFile> {

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/WrappedDescriptors.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ abstract class WrappedDeclarationDescriptor<T : IrDeclaration>(annotations: Anno
101101
fun bind(declaration: T) {
102102
owner = declaration
103103
}
104+
105+
fun isBound(): Boolean = _owner != null
104106
}
105107

106108
abstract class WrappedCallableDescriptor<T : IrDeclaration>(

0 commit comments

Comments
 (0)