From 1c4466951f88243a0b0e1f7aa13ae5acf709ec13 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 26 May 2021 00:21:16 +0300 Subject: [PATCH] IR: a flag to GeneratorExtensions to control IR deserialization There is no need to search for IR embedded in toplevel classes when none is expected (in npon-JVM backends or when -Xserialize-ir is not set). --- .../kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt | 5 ++++- .../kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt | 7 ++++--- .../kotlin/ir/declarations/lazy/IrLazyFunction.kt | 1 + .../jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt | 4 ++-- .../test/frontend/classic/ClassicFrontend2IrConverter.kt | 7 ++++++- 5 files changed, 17 insertions(+), 7 deletions(-) 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 d87f48f4d74..84f3d2530c7 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 @@ -306,7 +306,10 @@ object KotlinToJVMBytecodeCompiler { ) .codegenFactory( if (configuration.getBoolean(JVMConfigurationKeys.IR)) JvmIrCodegenFactory( - configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases) + configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases), + jvmGeneratorExtensions = JvmGeneratorExtensionsImpl( + irDeserializationEnabled = configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR) + ) ) else DefaultCodegenFactory ) .withModule(module) diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt index b500946fe51..1b00f498afa 100644 --- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt +++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt @@ -31,8 +31,6 @@ import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.constructors -import org.jetbrains.kotlin.ir.visitors.acceptVoid -import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor @@ -61,7 +59,10 @@ import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations -open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = true) : GeneratorExtensions(), JvmGeneratorExtensions { +open class JvmGeneratorExtensionsImpl( + private val generateFacades: Boolean = true, + override val irDeserializationEnabled: Boolean = false, +) : GeneratorExtensions(), JvmGeneratorExtensions { override val classNameOverride: MutableMap = mutableMapOf() override val samConversion: SamConversion diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt index fe16c0d6705..a1e12b69e2e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/lazy/IrLazyFunction.kt @@ -109,6 +109,7 @@ class IrLazyFunction( get() = (descriptor as? DescriptorWithContainerSource)?.containerSource private fun tryLoadIr(): Boolean { + if (!stubGenerator.extensions.irDeserializationEnabled) return false if (!isInline || isFakeOverride) return false val toplevel = getToplevel() return (toplevel as? DeserializableClass)?.loadIr() ?: false diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt index 4db269daba4..58f4ba9ae18 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/StubGeneratorExtensions.kt @@ -7,11 +7,9 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass -import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.types.KotlinType @@ -57,6 +55,8 @@ open class StubGeneratorExtensions { companion object Instance : EnhancedNullability() } + open val irDeserializationEnabled: Boolean = false + open val flexibleNullabilityAnnotationConstructor: IrConstructor? get() = null diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt index 10b960cc1b6..06ddb31115b 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt @@ -6,11 +6,13 @@ package org.jetbrains.kotlin.test.frontend.classic import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig +import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.backend.jvm.jvmPhases import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.codegen.ClassBuilderFactories import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.model.BackendKinds @@ -37,7 +39,10 @@ class ClassicFrontend2IrConverter( val files = psiFiles.values.toList() val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases) - val codegenFactory = JvmIrCodegenFactory(phaseConfig) + val codegenFactory = JvmIrCodegenFactory( + phaseConfig, + jvmGeneratorExtensions = JvmGeneratorExtensionsImpl(irDeserializationEnabled = configuration.getBoolean(JVMConfigurationKeys.SERIALIZE_IR)) + ) val state = GenerationState.Builder( project, ClassBuilderFactories.TEST, analysisResult.moduleDescriptor, analysisResult.bindingContext, files, configuration