From ad8892f71f0d99cd046ca63dcb696313a2292e1e Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 21 Apr 2021 17:19:03 +0300 Subject: [PATCH] JVM_IR: test that inline functions have deserialized bodies --- ...actCompileKotlinAgainstInlineKotlinTest.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) 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 44a1ae81f80..ec393f90494 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 @@ -7,12 +7,21 @@ 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.IrCall +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +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.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade import org.jetbrains.kotlin.test.bind @@ -77,6 +86,7 @@ open class AbstractIrSerializeCompileKotlinAgainstInlineKotlinTest : AbstractIrC // call super configurationImpl() useConfigurators(::SerializeSetter) + useBackendHandlers(::CheckInlineBodies) } private class SerializeSetter(testServices: TestServices) : EnvironmentConfigurator(testServices) { @@ -84,4 +94,48 @@ open class AbstractIrSerializeCompileKotlinAgainstInlineKotlinTest : AbstractIrC configuration.put(JVMConfigurationKeys.SERIALIZE_IR, true) } } + + private class CheckInlineBodies(testServices: TestServices) : AbstractIrHandler(testServices) { + val declaredInlineFunctions = 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) declaredInlineFunctions.add(declaration) + 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 in declaredInlineFunctions) { + val trueCallee = (callee as IrSimpleFunction).resolveFakeOverride()!! + assertions.assertNotNull(trueCallee.body) + } + super.visitMemberAccess(expression) + } + } + + } } \ No newline at end of file