JVM_IR: test that inline functions have deserialized bodies

This commit is contained in:
Georgy Bronnikov
2021-04-21 17:19:03 +03:00
committed by TeamCityServer
parent 7b52a8c07d
commit ad8892f71f
@@ -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<IrSimpleFunction>()
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)
}
}
}
}