[Test] Reformat AbstractIrSerializeCompileKotlinAgainstInlineKotlinTest
- Extract IrInlineBodiesHandler to separate file
- Replace SerializeSetter environment configurator with SERIALIZE_IR
directive
This commit is contained in:
committed by
teamcityserver
parent
a66f3d26fd
commit
90e06bf403
+61
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
@@ -88,4 +88,8 @@ object JvmEnvironmentConfigurationDirectives : SimpleDirectivesContainer() {
|
|||||||
val USE_OLD_INLINE_CLASSES_MANGLING_SCHEME by directive(
|
val USE_OLD_INLINE_CLASSES_MANGLING_SCHEME by directive(
|
||||||
description = "Enable old mangling scheme for inline classes"
|
description = "Enable old mangling scheme for inline classes"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val SERIALIZE_IR by directive(
|
||||||
|
description = "Enable serialization of JVM IR"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-65
@@ -5,38 +5,27 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.test.runners.codegen
|
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.Constructor
|
||||||
import org.jetbrains.kotlin.test.TargetBackend
|
import org.jetbrains.kotlin.test.TargetBackend
|
||||||
import org.jetbrains.kotlin.test.TestInfrastructureInternals
|
import org.jetbrains.kotlin.test.TestInfrastructureInternals
|
||||||
import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
|
import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
|
||||||
import org.jetbrains.kotlin.test.backend.classic.ClassicBackendInput
|
import org.jetbrains.kotlin.test.backend.classic.ClassicBackendInput
|
||||||
import org.jetbrains.kotlin.test.backend.classic.ClassicJvmBackendFacade
|
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.IrBackendInput
|
||||||
import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade
|
import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade
|
||||||
import org.jetbrains.kotlin.test.bind
|
import org.jetbrains.kotlin.test.bind
|
||||||
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
|
||||||
import org.jetbrains.kotlin.test.builders.configureIrHandlersStep
|
import org.jetbrains.kotlin.test.builders.configureIrHandlersStep
|
||||||
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_BACKEND_MULTI_MODULE
|
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.ClassicFrontend2ClassicBackendConverter
|
||||||
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter
|
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter
|
||||||
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
|
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
|
||||||
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact
|
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact
|
||||||
import org.jetbrains.kotlin.test.model.*
|
import org.jetbrains.kotlin.test.model.*
|
||||||
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
|
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.ModuleTransformerForTwoFilesBoxTests
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
|
||||||
|
|
||||||
|
|
||||||
@OptIn(TestInfrastructureInternals::class)
|
@OptIn(TestInfrastructureInternals::class)
|
||||||
@@ -84,61 +73,13 @@ open class AbstractIrSerializeCompileKotlinAgainstInlineKotlinTest : AbstractIrC
|
|||||||
override fun configure(builder: TestConfigurationBuilder) {
|
override fun configure(builder: TestConfigurationBuilder) {
|
||||||
super.configure(builder)
|
super.configure(builder)
|
||||||
builder.apply {
|
builder.apply {
|
||||||
useConfigurators(::SerializeSetter)
|
defaultDirectives {
|
||||||
|
+SERIALIZE_IR
|
||||||
|
}
|
||||||
|
|
||||||
configureIrHandlersStep {
|
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -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.JVM_TARGET
|
||||||
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.LAMBDAS
|
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.LAMBDAS
|
||||||
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.SAM_CONVERSIONS
|
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.STRING_CONCAT
|
||||||
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME
|
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_OLD_INLINE_CLASSES_MANGLING_SCHEME
|
||||||
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives
|
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(NO_UNIFIED_NULL_CHECKS, JVMConfigurationKeys.NO_UNIFIED_NULL_CHECKS)
|
||||||
register(PARAMETERS_METADATA, JVMConfigurationKeys.PARAMETERS_METADATA)
|
register(PARAMETERS_METADATA, JVMConfigurationKeys.PARAMETERS_METADATA)
|
||||||
register(JVM_TARGET, JVMConfigurationKeys.JVM_TARGET)
|
register(JVM_TARGET, JVMConfigurationKeys.JVM_TARGET)
|
||||||
|
register(SERIALIZE_IR, JVMConfigurationKeys.SERIALIZE_IR)
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalPathApi::class, ExperimentalStdlibApi::class)
|
@OptIn(ExperimentalPathApi::class, ExperimentalStdlibApi::class)
|
||||||
|
|||||||
Reference in New Issue
Block a user