IR text tests: Unmute enum class-related tests

Making enum class-related tests unmuted requires implementing
a special "compatibility" mode for IR tree dumper to filter out
fake override declarations leaking from java.enum.Enum and
kotlin.Enum (JVM-only) classes.
This commit is contained in:
Dmitriy Dolovov
2023-11-23 15:07:18 +01:00
committed by Space Team
parent fd96ee1d0b
commit 4532f52898
84 changed files with 1165 additions and 2665 deletions
@@ -22,12 +22,10 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.interpreter.intrinsicConstEvaluationAnnotation
import org.jetbrains.kotlin.ir.overrides.isEffectivelyPrivate
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.types.isUnit
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.backend.codegenSuppressionChecker
@@ -186,10 +184,6 @@ class IrMangledNameAndSignatureDumpHandler(
(symbol.descriptor as? PropertyDescriptor)?.isJavaField == true ||
parent.let { it is IrDeclaration && it.potentiallyHasDifferentMangledNamesDependingOnBackend }
private fun IrSimpleFunction.isHiddenEnumMethod() = allOverridden(includeSelf = true).any {
it.dispatchReceiverParameter?.type?.classOrNull == irBuiltIns.enumClass && it.name in HIDDEN_ENUM_METHOD_NAMES
}
private val signatureComposer = PublicIdSignatureComputer(irMangler)
private fun Printer.printCheckMarkerForNewDeclaration() {
@@ -313,11 +307,15 @@ class IrMangledNameAndSignatureDumpHandler(
// Don't print certain fake overrides coming from Java classes
if (element is IrSimpleFunction &&
element.isFakeOverride &&
(element.isStatic || element.hasPlatformDependent() || element.isHiddenEnumMethod())
(element.isStatic || element.hasPlatformDependent())
) {
return false
}
// Don't print declarations that are not printed in all IR text tests.
if (IrTextDumpHandler.isHiddenDeclaration(element, irBuiltIns))
return false
printer.printSignatureAndMangledName(element)
return true
@@ -359,8 +357,6 @@ private val EXCLUDED_ANNOTATIONS = setOf(
intrinsicConstEvaluationAnnotation,
)
private val HIDDEN_ENUM_METHOD_NAMES = setOf(Name.identifier("finalize"), Name.identifier("getDeclaringClass"))
private data class ComputedSignature(
val computedBy: ComputedBy,
val isPublic: Boolean,
@@ -6,13 +6,19 @@
package org.jetbrains.kotlin.test.backend.handlers
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.util.DumpIrTreeOptions
import org.jetbrains.kotlin.ir.util.allOverridden
import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.ir.util.dumpTreesFromLineNumber
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_EXTERNAL_CLASS
@@ -55,6 +61,21 @@ class IrTextDumpHandler(
val testFile = module.files.firstOrNull { it.name == name }
testFile to irFile
}
private val HIDDEN_ENUM_METHOD_NAMES = setOf(
Name.identifier("finalize"), // JVM-specific fake override from java.lang.Enum. TODO: remove it after fixing KT-63744
Name.identifier("getDeclaringClass"), // JVM-specific fake override from java.lang.Enum. TODO: remove it after fixing KT-63744
Name.identifier("clone"), // JVM-specific fake override from kotlin.Enum (not java.lang.Enum !).
)
private fun IrSimpleFunction.isHiddenEnumMethod(irBuiltIns: IrBuiltIns): Boolean {
return isFakeOverride && allOverridden(includeSelf = true).any {
it.dispatchReceiverParameter?.type?.classOrNull == irBuiltIns.enumClass && it.name in HIDDEN_ENUM_METHOD_NAMES
}
}
fun isHiddenDeclaration(declaration: IrDeclaration, irBuiltIns: IrBuiltIns): Boolean =
(declaration as? IrSimpleFunction)?.isHiddenEnumMethod(irBuiltIns) == true
}
override val directiveContainers: List<DirectivesContainer>
@@ -66,6 +87,8 @@ class IrTextDumpHandler(
override fun processModule(module: TestModule, info: IrBackendInput) {
if (DUMP_IR !in module.directives) return
val irBuiltins = info.irModuleFragment.irBuiltins
val dumpOptions = DumpIrTreeOptions(
normalizeNames = true,
printFacadeClassInFqNames = false,
@@ -74,6 +97,7 @@ class IrTextDumpHandler(
// PSI2IR assigns field `abbreviation` with type abbreviation. It serves only debugging purposes, and no compiler functionality relies on it.
// FIR2IR does not initialize field `abbreviation` at all.
printTypeAbbreviations = false,
isHiddenDeclaration = { isHiddenDeclaration(it, irBuiltins) }
)
val builder = baseDumper.builderForModule(module.name)