diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrInlineBodiesHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrInlineBodiesHandler.kt new file mode 100644 index 00000000000..d8ad471108f --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/IrInlineBodiesHandler.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test.backend.handlers + +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +import org.jetbrains.kotlin.ir.util.IdSignature +import org.jetbrains.kotlin.ir.util.allUnbound +import org.jetbrains.kotlin.ir.util.resolveFakeOverride +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices + +class IrInlineBodiesHandler(testServices: TestServices) : AbstractIrHandler(testServices) { + val declaredInlineFunctionSignatures = mutableSetOf() + + override fun processModule(module: TestModule, info: IrBackendInput) { + val irModule = info.backendInput.irModuleFragment + irModule.acceptChildrenVoid(InlineFunctionsCollector()) + irModule.acceptChildrenVoid(InlineCallBodiesCheck()) + assertions.assertTrue(info.backendInput.symbolTable.allUnbound.isEmpty()) + } + + override fun processAfterAllModules(someAssertionWasFailed: Boolean) { + // TODO("Not yet implemented") + } + + inner class InlineFunctionsCollector : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitSimpleFunction(declaration: IrSimpleFunction) { + if (declaration.isInline) declaration.symbol.signature?.let { declaredInlineFunctionSignatures.add(it) } + super.visitSimpleFunction(declaration) + } + } + + inner class InlineCallBodiesCheck : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitMemberAccess(expression: IrMemberAccessExpression<*>) { + val symbol = expression.symbol + assertions.assertTrue(symbol.isBound) + val callee = symbol.owner + if (callee.symbol.signature in declaredInlineFunctionSignatures) { + val trueCallee = (callee as IrSimpleFunction).resolveFakeOverride()!! + assertions.assertNotNull(trueCallee.body) + } + super.visitMemberAccess(expression) + } + } +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/JvmEnvironmentConfigurationDirectives.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/JvmEnvironmentConfigurationDirectives.kt index 7435f30cc65..3e55982621f 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/JvmEnvironmentConfigurationDirectives.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/JvmEnvironmentConfigurationDirectives.kt @@ -88,4 +88,8 @@ object JvmEnvironmentConfigurationDirectives : SimpleDirectivesContainer() { val USE_OLD_INLINE_CLASSES_MANGLING_SCHEME by directive( description = "Enable old mangling scheme for inline classes" ) + + val SERIALIZE_IR by directive( + description = "Enable serialization of JVM IR" + ) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt index 4953d73bed9..d4ba98fade0 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/codegen/AbstractCompileKotlinAgainstInlineKotlinTest.kt @@ -5,38 +5,27 @@ package org.jetbrains.kotlin.test.runners.codegen -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.JVMConfigurationKeys -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.ir.util.IdSignature -import org.jetbrains.kotlin.ir.util.allUnbound -import org.jetbrains.kotlin.ir.util.resolveFakeOverride -import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid -import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor import org.jetbrains.kotlin.test.backend.classic.ClassicBackendInput import org.jetbrains.kotlin.test.backend.classic.ClassicJvmBackendFacade -import org.jetbrains.kotlin.test.backend.handlers.AbstractIrHandler +import org.jetbrains.kotlin.test.backend.handlers.IrInlineBodiesHandler import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.configureIrHandlersStep import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_BACKEND_MULTI_MODULE +import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.SERIALIZE_IR import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2ClassicBackendConverter import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest -import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.services.ModuleTransformerForTwoFilesBoxTests -import org.jetbrains.kotlin.test.services.TestServices @OptIn(TestInfrastructureInternals::class) @@ -84,61 +73,13 @@ open class AbstractIrSerializeCompileKotlinAgainstInlineKotlinTest : AbstractIrC override fun configure(builder: TestConfigurationBuilder) { super.configure(builder) builder.apply { - useConfigurators(::SerializeSetter) + defaultDirectives { + +SERIALIZE_IR + } configureIrHandlersStep { - useHandlers(::CheckInlineBodies) + useHandlers(::IrInlineBodiesHandler) } } } - - private class SerializeSetter(testServices: TestServices) : EnvironmentConfigurator(testServices) { - override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) { - configuration.put(JVMConfigurationKeys.SERIALIZE_IR, true) - } - } - - private class CheckInlineBodies(testServices: TestServices) : AbstractIrHandler(testServices) { - val declaredInlineFunctionSignatures = mutableSetOf() - - override fun processModule(module: TestModule, info: IrBackendInput) { - val irModule = info.backendInput.irModuleFragment - irModule.acceptChildrenVoid(InlineFunctionsCollector()) - irModule.acceptChildrenVoid(InlineCallBodiesCheck()) - assertions.assertTrue(info.backendInput.symbolTable.allUnbound.isEmpty()) - } - - override fun processAfterAllModules(someAssertionWasFailed: Boolean) { - // TODO("Not yet implemented") - } - - inner class InlineFunctionsCollector : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitSimpleFunction(declaration: IrSimpleFunction) { - if (declaration.isInline) declaration.symbol.signature?.let { declaredInlineFunctionSignatures.add(it) } - super.visitSimpleFunction(declaration) - } - } - - inner class InlineCallBodiesCheck : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitMemberAccess(expression: IrMemberAccessExpression<*>) { - val symbol = expression.symbol - assertions.assertTrue(symbol.isBound) - val callee = symbol.owner - if (callee.symbol.signature in declaredInlineFunctionSignatures) { - val trueCallee = (callee as IrSimpleFunction).resolveFakeOverride()!! - assertions.assertNotNull(trueCallee.body) - } - super.visitMemberAccess(expression) - } - } - - } } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt index f1bc773f2e8..9b538192ccf 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmEnvironmentConfigurator.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirective import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.JVM_TARGET import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.LAMBDAS import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.SAM_CONVERSIONS +import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.SERIALIZE_IR import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.STRING_CONCAT import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives @@ -145,6 +146,7 @@ class JvmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfig register(NO_UNIFIED_NULL_CHECKS, JVMConfigurationKeys.NO_UNIFIED_NULL_CHECKS) register(PARAMETERS_METADATA, JVMConfigurationKeys.PARAMETERS_METADATA) register(JVM_TARGET, JVMConfigurationKeys.JVM_TARGET) + register(SERIALIZE_IR, JVMConfigurationKeys.SERIALIZE_IR) } @OptIn(ExperimentalPathApi::class, ExperimentalStdlibApi::class)