[Test] Reformat AbstractIrSerializeCompileKotlinAgainstInlineKotlinTest

- Extract IrInlineBodiesHandler to separate file
- Replace SerializeSetter environment configurator with SERIALIZE_IR
    directive
This commit is contained in:
Dmitriy Novozhilov
2021-07-27 11:16:40 +03:00
committed by teamcityserver
parent a66f3d26fd
commit 90e06bf403
4 changed files with 73 additions and 65 deletions
@@ -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<IdSignature>()
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)
}
}
}
@@ -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"
)
}
@@ -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<IdSignature>()
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)
}
}
}
}
@@ -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)