From 9b5bbb95e789e8f02649f1b6bffdda3886f65a93 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 31 Mar 2021 13:56:42 +0200 Subject: [PATCH] Refactor CirConstantValue similarly to KmAnnotationArgument Introduce LiteralValue with generic value, and remove `value` from enum/array/null subclasses. --- .../kotlin/commonizer/cir/CirAnnotation.kt | 6 +- .../kotlin/commonizer/cir/CirConstantValue.kt | 64 +++++++++---------- .../kotlin/commonizer/cir/CirProperty.kt | 6 +- .../commonizer/core/AnnotationsCommonizer.kt | 12 ++-- .../commonizer/core/PropertyCommonizer.kt | 2 +- .../commonizer/metadata/CirDeserializers.kt | 6 +- .../commonizer/metadata/CirSerializers.kt | 6 +- .../core/AnnotationsCommonizerTest.kt | 4 +- 8 files changed, 53 insertions(+), 53 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirAnnotation.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirAnnotation.kt index ab556a0d9bf..eeec33d28de 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirAnnotation.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirAnnotation.kt @@ -11,13 +11,13 @@ import org.jetbrains.kotlin.commonizer.utils.hashCode interface CirAnnotation { val type: CirClassType - val constantValueArguments: Map> + val constantValueArguments: Map val annotationValueArguments: Map companion object { fun createInterned( type: CirClassType, - constantValueArguments: Map>, + constantValueArguments: Map, annotationValueArguments: Map ): CirAnnotation = interner.intern( CirAnnotationInternedImpl( @@ -33,7 +33,7 @@ interface CirAnnotation { private data class CirAnnotationInternedImpl( override val type: CirClassType, - override val constantValueArguments: Map>, + override val constantValueArguments: Map, override val annotationValueArguments: Map ) : CirAnnotation { // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirConstantValue.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirConstantValue.kt index e8b983752fc..8205d229420 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirConstantValue.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirConstantValue.kt @@ -5,41 +5,41 @@ package org.jetbrains.kotlin.commonizer.cir -sealed class CirConstantValue { - abstract val value: T - - data class StringValue(override val value: String) : CirConstantValue() - data class CharValue(override val value: Char) : CirConstantValue() - - data class ByteValue(override val value: Byte) : CirConstantValue() - data class ShortValue(override val value: Short) : CirConstantValue() - data class IntValue(override val value: Int) : CirConstantValue() - data class LongValue(override val value: Long) : CirConstantValue() - - @ExperimentalUnsignedTypes - data class UByteValue(override val value: UByte) : CirConstantValue() - - @ExperimentalUnsignedTypes - data class UShortValue(override val value: UShort) : CirConstantValue() - - @ExperimentalUnsignedTypes - data class UIntValue(override val value: UInt) : CirConstantValue() - - @ExperimentalUnsignedTypes - data class ULongValue(override val value: ULong) : CirConstantValue() - - data class FloatValue(override val value: Float) : CirConstantValue() - data class DoubleValue(override val value: Double) : CirConstantValue() - data class BooleanValue(override val value: Boolean) : CirConstantValue() - - data class EnumValue(val enumClassId: CirEntityId, val enumEntryName: CirName) : CirConstantValue() { - override val value: String = "${enumClassId}.${enumEntryName}" +sealed class CirConstantValue { + sealed class LiteralValue : CirConstantValue() { + abstract val value: T } - data class ArrayValue(override val value: List>) : CirConstantValue>>() + data class StringValue(override val value: String) : LiteralValue() + data class CharValue(override val value: Char) : LiteralValue() - object NullValue : CirConstantValue() { - override val value: Void? get() = null + data class ByteValue(override val value: Byte) : LiteralValue() + data class ShortValue(override val value: Short) : LiteralValue() + data class IntValue(override val value: Int) : LiteralValue() + data class LongValue(override val value: Long) : LiteralValue() + + // TODO: remove @ExperimentalUnsignedTypes once bootstrap stdlib has stable unsigned types. + @ExperimentalUnsignedTypes + data class UByteValue(override val value: UByte) : LiteralValue() + + @ExperimentalUnsignedTypes + data class UShortValue(override val value: UShort) : LiteralValue() + + @ExperimentalUnsignedTypes + data class UIntValue(override val value: UInt) : LiteralValue() + + @ExperimentalUnsignedTypes + data class ULongValue(override val value: ULong) : LiteralValue() + + data class FloatValue(override val value: Float) : LiteralValue() + data class DoubleValue(override val value: Double) : LiteralValue() + data class BooleanValue(override val value: Boolean) : LiteralValue() + + data class EnumValue(val enumClassId: CirEntityId, val enumEntryName: CirName) : CirConstantValue() + + data class ArrayValue(val elements: List) : CirConstantValue() + + object NullValue : CirConstantValue() { override fun toString() = "NullValue(value=null)" } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirProperty.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirProperty.kt index fc7cf06b3ca..01a82097f21 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirProperty.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cir/CirProperty.kt @@ -19,7 +19,7 @@ interface CirProperty : CirFunctionOrProperty, CirLiftedUpDeclaration { val setter: CirPropertySetter? val backingFieldAnnotations: List val delegateFieldAnnotations: List - val compileTimeInitializer: CirConstantValue<*> + val compileTimeInitializer: CirConstantValue companion object { @Suppress("NOTHING_TO_INLINE") @@ -42,7 +42,7 @@ interface CirProperty : CirFunctionOrProperty, CirLiftedUpDeclaration { setter: CirPropertySetter?, backingFieldAnnotations: List, delegateFieldAnnotations: List, - compileTimeInitializer: CirConstantValue<*> + compileTimeInitializer: CirConstantValue ): CirProperty = CirPropertyImpl( annotations = annotations, name = name, @@ -86,7 +86,7 @@ data class CirPropertyImpl( override val setter: CirPropertySetter?, override val backingFieldAnnotations: List, override val delegateFieldAnnotations: List, - override val compileTimeInitializer: CirConstantValue<*> + override val compileTimeInitializer: CirConstantValue ) : CirProperty { // const property in "common" fragment is already lifted up override val isLiftedUp get() = isConst diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizer.kt index 03d57c36d54..7c4011b0c62 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizer.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.commonizer.core -import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.cir.CirConstantValue.* import org.jetbrains.kotlin.commonizer.core.AnnotationsCommonizer.Companion.FALLBACK_MESSAGE import org.jetbrains.kotlin.commonizer.utils.DEPRECATED_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.commonizer.utils.compactMap import org.jetbrains.kotlin.commonizer.utils.compactMapOf +import org.jetbrains.kotlin.descriptors.Visibilities import kotlin.DeprecationLevel.WARNING /** @@ -52,7 +52,7 @@ private class DeprecatedAnnotationCommonizer : Commonizer> = + val constantValueArguments: Map = if (level == WARNING) { // don't populate with the default level value compactMapOf(PROPERTY_NAME_MESSAGE, messageValue) @@ -186,17 +186,17 @@ private class DeprecatedAnnotationCommonizer : Commonizer): CirAnnotation = createReplaceWithAnnotation(this, imports) - private inline fun Map>.getString(name: CirName): String? = + private inline fun Map.getString(name: CirName): String? = (this[name] as? StringValue)?.value - private inline fun Map>.getEnumEntryName(name: CirName): String? = + private inline fun Map.getEnumEntryName(name: CirName): String? = (this[name] as? EnumValue)?.enumEntryName?.name private inline fun Map.getAnnotation(name: CirName): CirAnnotation? = this[name] - private inline fun Map>.getStringArray(name: CirName): List? { - val elements: List> = (this[name] as? ArrayValue)?.value ?: return null + private inline fun Map.getStringArray(name: CirName): List? { + val elements: List = (this[name] as? ArrayValue)?.elements ?: return null if (elements.isEmpty()) return emptyList() val result = ArrayList(elements.size) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt index a6b773e64f3..e18b0176370 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/core/PropertyCommonizer.kt @@ -109,7 +109,7 @@ class PropertyCommonizer(classifiers: CirKnownClassifiers) : AbstractFunctionOrP val properties: MutableList = mutableListOf() } - class ConstSameValue(val compileTimeInitializer: CirConstantValue<*>) : Const() { + class ConstSameValue(val compileTimeInitializer: CirConstantValue) : Const() { init { check(compileTimeInitializer != CirConstantValue.NullValue) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt index 4d23629abb1..f77928e7863 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt @@ -49,7 +49,7 @@ object CirDeserializers { if (allValueArguments.isEmpty()) return CirAnnotation.createInterned(type = type, constantValueArguments = emptyMap(), annotationValueArguments = emptyMap()) - val constantValueArguments: MutableMap> = THashMap(allValueArguments.size) + val constantValueArguments: MutableMap = THashMap(allValueArguments.size) val annotationValueArguments: MutableMap = THashMap(allValueArguments.size) allValueArguments.forEach { (name, constantValue) -> @@ -208,7 +208,7 @@ object CirDeserializers { constantValue: KmAnnotationArgument?, constantName: CirName? = null, owner: Any, - ): CirConstantValue<*> = constantValue( + ): CirConstantValue = constantValue( constantValue = constantValue, location = { "${owner::class.java}, $owner" + constantName?.toString()?.let { "[$it]" } } ) @@ -217,7 +217,7 @@ object CirDeserializers { private fun constantValue( constantValue: KmAnnotationArgument?, location: () -> String - ): CirConstantValue<*> = when (constantValue) { + ): CirConstantValue = when (constantValue) { null -> CirConstantValue.NullValue is KmAnnotationArgument.StringValue -> CirConstantValue.StringValue(constantValue.value) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirSerializers.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirSerializers.kt index a6efe0acfd7..11c9f7e24c9 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirSerializers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirSerializers.kt @@ -197,7 +197,7 @@ internal fun CirFunction.serializeFunction( private fun CirAnnotation.serializeAnnotation(): KmAnnotation { val arguments = LinkedHashMap(constantValueArguments.size + annotationValueArguments.size, 1F) - constantValueArguments.forEach { (name: CirName, value: CirConstantValue<*>) -> + constantValueArguments.forEach { (name: CirName, value: CirConstantValue) -> arguments[name.name] = value.serializeConstantValue() ?: error("Unexpected constant value inside of $this") } @@ -213,7 +213,7 @@ private fun CirAnnotation.serializeAnnotation(): KmAnnotation { } @OptIn(ExperimentalUnsignedTypes::class) -private fun CirConstantValue<*>.serializeConstantValue(): KmAnnotationArgument? = when (this) { +private fun CirConstantValue.serializeConstantValue(): KmAnnotationArgument? = when (this) { is CirConstantValue.StringValue -> KmAnnotationArgument.StringValue(value) is CirConstantValue.CharValue -> KmAnnotationArgument.CharValue(value) @@ -234,7 +234,7 @@ private fun CirConstantValue<*>.serializeConstantValue(): KmAnnotationArgument? is CirConstantValue.EnumValue -> KmAnnotationArgument.EnumValue(enumClassId.toString(), enumEntryName.name) is CirConstantValue.NullValue -> null - is CirConstantValue.ArrayValue -> KmAnnotationArgument.ArrayValue(value.compactMap { element -> + is CirConstantValue.ArrayValue -> KmAnnotationArgument.ArrayValue(elements.compactMap { element -> element.serializeConstantValue() ?: error("Unexpected constant value inside of $this") }) } diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizerTest.kt index 8b13cb8c345..c990ee7ce0d 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/AnnotationsCommonizerTest.kt @@ -281,7 +281,7 @@ class AnnotationsCommonizerTest : AbstractCommonizerTest, Li private fun mockAnnotation( classId: String, - constantValueArguments: Map> = emptyMap(), + constantValueArguments: Map = emptyMap(), annotationValueArguments: Map = emptyMap() ): CirAnnotation = CirAnnotation.createInterned( type = mockClassType(classId), @@ -308,7 +308,7 @@ private fun mockDeprecated( return mockAnnotation( classId = "kotlin/Deprecated", - constantValueArguments = HashMap>().apply { + constantValueArguments = HashMap().apply { this[CirName.create("message")] = StringValue(message) if (level != WARNING)