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:
committed by
Space Team
parent
fd96ee1d0b
commit
4532f52898
+5
-9
@@ -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,
|
||||
|
||||
+24
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user