[Fir2Ir] Introduce testing with IrFakeOverrideBuilder

^KT-61514
This commit is contained in:
Pavel Kunyavskiy
2023-08-28 15:09:22 +02:00
committed by Space Team
parent bf9cae6410
commit 91e96e9f31
58 changed files with 54467 additions and 7 deletions
@@ -1,6 +1,7 @@
// TARGET_BACKEND: JVM
// WITH_STDLIB
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// MODULE: lib
// FILE: JavaAnn.java
@@ -1,5 +1,6 @@
// WITH_STDLIB
// WITH_REFLECT
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// TARGET_BACKEND: JVM_IR
// FIR_DUMP
// DUMP_IR
@@ -1,5 +1,6 @@
// FIR_DUMP
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
annotation class Ann(@Ann(1) val e: Int)
@@ -1,6 +1,7 @@
// WITH_STDLIB
// WITH_REFLECT
// TARGET_BACKEND: JVM_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// FIR_DUMP
// DUMP_IR
@@ -1,4 +1,5 @@
// IGNORE_BACKEND: WASM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61384
// WITH_STDLIB
// MODULE: lib1
@@ -1,5 +1,6 @@
// IGNORE_BACKEND: WASM
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61384
// MODULE: lib1
+1
View File
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
import java.util.HashSet
interface A : Set<String>
@@ -1,5 +1,6 @@
// !JVM_DEFAULT_MODE: all
// SKIP_JDK6
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// TARGET_BACKEND: JVM
// JVM_TARGET: 1.8
// WITH_STDLIB
@@ -2,6 +2,7 @@
// FE 1.0 incorrectly resolves reference `Some::foo` (KT-45315)
// DONT_TARGET_EXACT_BACKEND: WASM
// WASM_MUTE_REASON: Wasm box test does not support disabling only K1 mode with IGNORE_BACKEND directive
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// ISSUE: KT-55909
// DUMP_IR
@@ -1,6 +1,7 @@
// IGNORE_BACKEND: WASM
// WASM_MUTE_REASON: STDLIB_COLLECTION_INHERITANCE
// KJS_WITH_FULL_RUNTIME
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// DONT_TARGET_EXACT_BACKEND: NATIVE
interface A : Set<String>
@@ -1,4 +1,5 @@
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
abstract class A : AbstractMutableList<Int>()
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// FILE: J.java
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// FILE: B.java
public abstract class B<E> extends A<E> implements L<E> {
@@ -1,5 +1,6 @@
// TARGET_BACKEND: JVM
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// FILE: removeAtBridgeClashWithJava.kt
abstract class AJALI : JavaAbstractList<Int>()
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// WITH_STDLIB
// FULL_JDK
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61384
// WITH_STDLIB
// MODULE: lib
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61384
// WITH_STDLIB
// MODULE: lib
@@ -1,4 +1,5 @@
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
fun <T> select(a: T, b: T) : T = a
@@ -1,6 +1,7 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_K1: ANY
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// K1_STATUS: java.lang.AssertionError: There is still an unbound symbol after generation of IR module <main>
fun <T> select(a: T, b: T) : T = a
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// ISSUE: KT-51194
// MODULE: coreLib_1
@@ -1,4 +1,5 @@
// IGNORE_BACKEND: WASM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61384
// MODULE: lib
// FILE: l.kt
@@ -1,5 +1,6 @@
// TARGET_BACKEND: JVM_IR
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// MODULE: m1
// FILE: m1/THash.java
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// DUMP_IR
// FULL_JDK
// WITH_REFLECT
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// ISSUE: KT-59550
// FILE: Intermediate.java
@@ -1,5 +1,6 @@
// TARGET_BACKEND: JVM_IR
// ISSUE: KT-59550 (related)
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// MODULE: m1
// FILE: Base.kt
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// ISSUE: KT-59550
// FILE: Intermediate.java
@@ -1,5 +1,7 @@
// ISSUE: KT-55828
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
interface MyCollection<out E1> {
fun foo(): E1
val bar: E1
@@ -1,5 +1,7 @@
// ISSUE: KT-55828
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
interface MyCollection {
fun foo(): String
val bar: String
@@ -1,4 +1,5 @@
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
class ArrayDeque<E> : AbstractMutableList<E> {
+1
View File
@@ -1,4 +1,5 @@
// MODULE: lib
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61543
// FILE: lib.kt
// KT-41765
@@ -1,5 +1,6 @@
// TARGET_BACKEND: JVM_IR
// IGNORE_BACKEND_K1: JVM_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// Field VS property: case 4.1
// See KT-50082
// DUMP_IR
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// FULL_JDK
// ISSUE: KT-45584
@@ -1,5 +1,6 @@
// TARGET_BACKEND: JVM
// FULL_JDK
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// ISSUE: KT-45584
// FILE: PlaceholderExceptionSupport.java
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// WITH_STDLIB
// ISSUE: KT-56538
@@ -1,5 +1,6 @@
// TARGET_BACKEND: JVM_IR
// DUMP_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// FILE: javapackage/PackagePrivateGrandparentInterface.java
package javapackage;
+1
View File
@@ -1,5 +1,6 @@
// SKIP_JDK6
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// FULL_JDK
// WITH_STDLIB
@@ -1,5 +1,6 @@
// !JVM_DEFAULT_MODE: all-compatibility
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// JVM_TARGET: 1.8
// WITH_STDLIB
// FULL_JDK
@@ -1,5 +1,6 @@
// !JVM_DEFAULT_MODE: all
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// JVM_TARGET: 1.8
// WITH_STDLIB
// FULL_JDK
+1
View File
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// java.lang.NoSuchMethodError: java.util.TreeMap.remove
// IGNORE_BACKEND: ANDROID
+1
View File
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// WITH_STDLIB
// FILE: Fn.java
public interface Fn<T, R> {
+1
View File
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// WITH_STDLIB
// FILE: Fn.java
public interface Fn<T, R> {
+1
View File
@@ -2,6 +2,7 @@
// WITH_STDLIB
// DUMP_IR
// DUMP_CFG
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// RENDERER_CFG_LEVELS
class FlyweightCapableTreeStructure
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// WITH_STDLIB
// binary representation of fractional part of phi = (sqrt(5) - 1) / 2
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
import java.util.AbstractMap
@@ -1,5 +1,6 @@
// ISSUE: KT-57655
// !LANGUAGE: +ImplicitSignedToUnsignedIntegerConversion
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61386
// ALLOW_KOTLIN_PACKAGE
// WITH_STDLIB
// DUMP_IR
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// MODULE: lib
// FILE: A.java
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// MODULE: lib
// FILE: A.java
@@ -1,4 +1,6 @@
// TARGET_BACKEND: JVM
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-61370
// MODULE: lib
// FILE: A.java
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2023 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.ir
import org.jetbrains.kotlin.test.WrappedException
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION
import org.jetbrains.kotlin.test.model.AfterAnalysisChecker
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
import org.jetbrains.kotlin.test.services.moduleStructure
class CodegenWithIrFakeOverrideGeneratorSuppressor(testServices: TestServices) : AfterAnalysisChecker(testServices) {
override fun check(failedAssertions: List<WrappedException>) {
if (!mainDirectiveEnabled) return
if (failedAssertions.isEmpty() && suppressDirectiveEnabled) {
testServices.assertions.fail {
"Looks like this test can be unmuted. Remove $IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION directive "
}
}
}
override fun suppressIfNeeded(failedAssertions: List<WrappedException>): List<WrappedException> {
return when {
!mainDirectiveEnabled -> failedAssertions
suppressDirectiveEnabled -> emptyList()
else -> failedAssertions
}
}
private val mainDirectiveEnabled: Boolean
get() = ENABLE_IR_FAKE_OVERRIDE_GENERATION in testServices.moduleStructure.allDirectives
private val suppressDirectiveEnabled: Boolean
get() = IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION in testServices.moduleStructure.allDirectives
}
@@ -39,7 +39,7 @@ class IrActualizerAndPluginsFacade(
inputArtifact.irPluginContext.symbolTable as SymbolTable, // TODO: it's strange place to get it.
inputArtifact.irMangler,
mapOf(module.name to module.friendDependencies.map { it.moduleName }),
useIrFakeOverrideBuilder = false,
useIrFakeOverrideBuilder = CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION in module.directives,
)
inputArtifact.irActualizerResult = result
}
@@ -242,6 +242,19 @@ object CodegenTestDirectives : SimpleDirectivesContainer() {
Ignore exceptions in AbstractFirLoadK2CompiledKotlin tests
""".trimIndent()
)
val ENABLE_IR_FAKE_OVERRIDE_GENERATION by directive(
description = """
Enables fake-override generation in FIR2IR using IR f/o generator. KT-61514
""".trimIndent()
)
// String to allow and enforce issue id. Value is not actually used.
val IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION by stringDirective(
description = """
Suppresses test if $ENABLE_IR_FAKE_OVERRIDE_GENERATION directive enabled
""".trimIndent()
)
}
fun extractIgnoredDirectiveForTargetBackend(
@@ -10,10 +10,7 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureDescriptor
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
@@ -172,6 +169,7 @@ fun ModuleCompilerAnalyzedOutput.convertToJsIr(
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = null,
allowNonCachedDeclarations = false,
useIrFakeOverrideBuilder = module.shouldUseIrFakeOverrideBuilderInConvertToIr()
)
return convertToIr(
@@ -105,7 +105,8 @@ class Fir2IrJvmResultsConverter(
evaluatedConstTracker = compilerConfiguration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = compilerConfiguration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
allowNonCachedDeclarations = false
allowNonCachedDeclarations = false,
useIrFakeOverrideBuilder = module.shouldUseIrFakeOverrideBuilderInConvertToIr(),
)
val (irModuleFragment, components, pluginContext) = firOutputPart.firAnalyzerFacade.result.outputs.single().convertToIr(
fir2IrExtensions,
@@ -5,16 +5,26 @@
package org.jetbrains.kotlin.test.frontend.fir
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.isJs
import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
import org.jetbrains.kotlin.test.model.BackendKinds
import org.jetbrains.kotlin.test.model.Frontend2BackendConverter
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
/**
* In multi-platform projects this option is passed to IrActualizer instead
* @see [IrActualizerAndPluginsFacade]
*/
fun TestModule.shouldUseIrFakeOverrideBuilderInConvertToIr() =
CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION in directives &&
!languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)
class Fir2IrResultsConverter(
testServices: TestServices
) : Frontend2BackendConverter<FirOutputArtifact, IrBackendInput>(
@@ -167,7 +167,8 @@ fun ModuleCompilerAnalyzedOutput.convertToWasmIr(
evaluatedConstTracker = configuration
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
inlineConstTracker = null,
allowNonCachedDeclarations = false
allowNonCachedDeclarations = false,
useIrFakeOverrideBuilder = module.shouldUseIrFakeOverrideBuilderInConvertToIr(),
)
return convertToIr(
@@ -14,8 +14,10 @@ import org.jetbrains.kotlin.test.builders.configureFirHandlersStep
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_PSI_CLASS_FILES_READING
import org.jetbrains.kotlin.test.directives.ConfigurationDirectives.WITH_STDLIB
import org.jetbrains.kotlin.test.FirParser
import org.jetbrains.kotlin.test.backend.ir.CodegenWithIrFakeOverrideGeneratorSuppressor
import org.jetbrains.kotlin.test.backend.ir.IrDiagnosticsHandler
import org.jetbrains.kotlin.test.builders.configureIrHandlersStep
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.ENABLE_IR_FAKE_OVERRIDE_GENERATION
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives
import org.jetbrains.kotlin.test.directives.configureFirParser
import org.jetbrains.kotlin.test.frontend.fir.Fir2IrResultsConverter
@@ -90,3 +92,16 @@ open class AbstractFirLightTreeBlackBoxCodegenTest : AbstractFirBlackBoxCodegenT
@FirPsiCodegenTest
open class AbstractFirPsiBlackBoxCodegenTest : AbstractFirBlackBoxCodegenTestBase(FirParser.Psi)
open class AbstractFirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTest : AbstractFirLightTreeBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
with(builder) {
defaultDirectives {
+ENABLE_IR_FAKE_OVERRIDE_GENERATION
}
useAfterAnalysisCheckers(::CodegenWithIrFakeOverrideGeneratorSuppressor)
}
}
}
@@ -279,6 +279,10 @@ fun generateJUnit5CompilerTests(args: Array<String>, mainClassName: String?) {
model("codegen/box")
}
testClass<AbstractFirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTest> {
model("codegen/box")
}
testClass<AbstractFirLightTreeBlackBoxCodegenTest>("FirLightTreeBlackBoxModernJdkCodegenTestGenerated") {
model("codegen/boxModernJdk")
}