[Commonizer] Commonize 'HAS_ENUM_ENTRIES' flag

^KT-56207 Verification Pending
This commit is contained in:
Sebastian Sellmair
2023-02-06 13:49:28 +01:00
committed by Space Team
parent e232cc92f9
commit 513f4a3c42
10 changed files with 27 additions and 28 deletions
@@ -15,6 +15,7 @@ interface CirClass : CirClassifier, CirContainingClass, AnyClass {
val isValue: Boolean
val isInner: Boolean
val isExternal: Boolean
val hasEnumEntries: Boolean
val supertypes: List<CirType>
companion object {
@@ -33,6 +34,7 @@ interface CirClass : CirClassifier, CirContainingClass, AnyClass {
isValue: Boolean,
isInner: Boolean,
isExternal: Boolean,
hasEnumEntries: Boolean
): CirClass = CirClassImpl(
annotations = annotations,
name = name,
@@ -46,7 +48,8 @@ interface CirClass : CirClassifier, CirContainingClass, AnyClass {
isData = isData,
isValue = isValue,
isInner = isInner,
isExternal = isExternal
isExternal = isExternal,
hasEnumEntries = hasEnumEntries
)
}
}
@@ -65,4 +68,5 @@ data class CirClassImpl(
override val isValue: Boolean,
override val isInner: Boolean,
override val isExternal: Boolean,
override val hasEnumEntries: Boolean
) : CirClass
@@ -20,6 +20,7 @@ object CirClassRecursionMarker : CirClass, CirRecursionMarker {
override val isValue get() = unsupported()
override val isInner get() = unsupported()
override val isExternal get() = unsupported()
override val hasEnumEntries: Boolean get() = unsupported()
override var supertypes: List<CirType>
get() = unsupported()
set(_) = unsupported()
@@ -18,6 +18,7 @@ class ClassCommonizer internal constructor(
private var isInner = false
private var isValue = false
private var isCompanion = false
private var hasEnumEntries = false
private val supertypesCommonizer = supertypesCommonizer.asCommonizer()
private val typeParameterListCommonizer: TypeParameterListCommonizer = TypeParameterListCommonizer(typeCommonizer)
private val modalityCommonizer: ModalityCommonizer = ModalityCommonizer()
@@ -37,7 +38,8 @@ class ClassCommonizer internal constructor(
isData = false,
isValue = isValue,
isInner = isInner,
isExternal = false
isExternal = false,
hasEnumEntries = hasEnumEntries
)
}
@@ -47,10 +49,13 @@ class ClassCommonizer internal constructor(
isInner = first.isInner
isValue = first.isValue
isCompanion = first.isCompanion
hasEnumEntries = first.hasEnumEntries
}
override fun doCommonizeWith(next: CirClass) =
kind == next.kind
override fun doCommonizeWith(next: CirClass): Boolean {
this.hasEnumEntries = this.hasEnumEntries && next.hasEnumEntries
return kind == next.kind
&& isInner == next.isInner
&& isValue == next.isValue
&& isCompanion == next.isCompanion
@@ -58,4 +63,5 @@ class ClassCommonizer internal constructor(
&& visibilityCommonizer.commonizeWith(next)
&& typeParameterListCommonizer.commonizeWith(next.typeParameters)
&& supertypesCommonizer.commonizeWith(next.supertypes)
}
}
@@ -12,7 +12,6 @@ import kotlinx.metadata.klib.compileTimeValue
import kotlinx.metadata.klib.getterAnnotations
import kotlinx.metadata.klib.setterAnnotations
import org.jetbrains.kotlin.commonizer.cir.*
import org.jetbrains.kotlin.commonizer.cir.CirProvided
import org.jetbrains.kotlin.commonizer.utils.*
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.types.Variance
@@ -266,13 +265,15 @@ object CirDeserializers {
isData = Flag.Class.IS_DATA(source.flags),
isValue = Flag.Class.IS_VALUE(source.flags),
isInner = Flag.Class.IS_INNER(source.flags),
isExternal = Flag.Class.IS_EXTERNAL(source.flags)
isExternal = Flag.Class.IS_EXTERNAL(source.flags),
hasEnumEntries = Flag.Class.HAS_ENUM_ENTRIES(source.flags)
)
fun defaultEnumEntry(
name: CirName,
annotations: List<KmAnnotation>,
enumClassId: CirEntityId,
hasEnumEntries: Boolean,
typeResolver: CirTypeResolver
): CirClass = CirClass.create(
annotations = annotations.compactMap { annotation(it, typeResolver) },
@@ -294,7 +295,8 @@ object CirDeserializers {
isData = false,
isValue = false,
isInner = false,
isExternal = false
isExternal = false,
hasEnumEntries = hasEnumEntries
)
@Suppress("NOTHING_TO_INLINE")
@@ -91,6 +91,7 @@ internal fun CirClass.classFlags(isExpect: Boolean): Flags =
Flag.Class.IS_EXTERNAL.takeIf { isExternal },
Flag.Class.IS_EXPECT.takeIf { isExpect },
Flag.Class.IS_VALUE.takeIf { isValue },
Flag.Class.HAS_ENUM_ENTRIES.takeIf { hasEnumEntries }
//Flag.Class.IS_FUN.takeIf { false }
)
@@ -127,7 +127,7 @@ internal class InlineTypeAliasCirNodeTransformer(
private fun CirTypeAlias.toArtificialCirClass(targetIndex: Int): CirClass = CirClass.create(
annotations = emptyList(), name = name, typeParameters = typeParameters, supertypes = resolveSupertypes(targetIndex),
visibility = this.visibility, modality = Modality.FINAL, kind = ClassKind.CLASS,
companion = null, isCompanion = false, isData = false, isValue = false, isInner = false, isExternal = false
companion = null, isCompanion = false, isData = false, isValue = false, isInner = false, isExternal = false, hasEnumEntries = false
)
private fun CirTypeAlias.resolveSupertypes(targetIndex: Int): List<CirType> {
@@ -40,6 +40,7 @@ internal class CirTreeClassDeserializer(
name = className,
annotations = classEntry.annotations,
enumClassId = classEntry.enumClassId,
hasEnumEntries = Flag.Class.HAS_ENUM_ENTRIES(classEntry.enumClass.flags),
typeResolver = classTypeResolver
)
}
@@ -10,13 +10,13 @@ import kotlin.contracts.ExperimentalContracts
@ExperimentalContracts
class ClassifierCommonizationFromSourcesTest : AbstractCommonizationFromSourcesTest() {
fun testClassKindAndModifiers() = ignore { doTestSuccessfulCommonization() }
fun testClassKindAndModifiers() = doTestSuccessfulCommonization()
fun testModality() = doTestSuccessfulCommonization()
fun testVisibility() = doTestSuccessfulCommonization()
fun testConstructors() = ignore { doTestSuccessfulCommonization() }
fun testConstructors() = doTestSuccessfulCommonization()
fun testTypeParameters() = doTestSuccessfulCommonization()
@@ -25,13 +25,4 @@ class ClassifierCommonizationFromSourcesTest : AbstractCommonizationFromSourcesT
fun testTypeAliases() = doTestSuccessfulCommonization()
fun testDifferentTypeAliasesInArguments() = doTestSuccessfulCommonization()
private inline fun ignore(block: () -> Unit) {
try {
block()
error("Test is passing, remove `ignore` call")
} catch (e: AssertionError) {
return
}
}
}
@@ -8,19 +8,12 @@ package org.jetbrains.kotlin.commonizer.utils
import kotlinx.metadata.klib.KlibModuleMetadata
import kotlinx.metadata.klib.annotations
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.cir.CirFunction
import org.jetbrains.kotlin.commonizer.cir.CirProperty
import org.jetbrains.kotlin.commonizer.identityString
import org.jetbrains.kotlin.commonizer.metadata.utils.MetadataDeclarationsComparator
import org.jetbrains.kotlin.commonizer.metadata.utils.MetadataDeclarationsComparator.*
import org.jetbrains.kotlin.commonizer.metadata.utils.SerializedMetadataLibraryProvider
import org.jetbrains.kotlin.commonizer.tree.CirTreeClass
import org.jetbrains.kotlin.commonizer.tree.CirTreeModule
import org.jetbrains.kotlin.commonizer.tree.CirTreePackage
import org.jetbrains.kotlin.commonizer.tree.CirTreeTypeAlias
import org.jetbrains.kotlin.library.SerializedMetadata
import java.io.File
import kotlin.contracts.ExperimentalContracts
import kotlin.test.fail
fun assertIsDirectory(file: File) {
@@ -28,7 +21,6 @@ fun assertIsDirectory(file: File) {
fail("Not a directory: $file")
}
@OptIn(ExperimentalContracts::class)
fun assertModulesAreEqual(reference: SerializedMetadata, generated: SerializedMetadata, target: CommonizerTarget) {
val referenceModule = KlibModuleMetadata.read(SerializedMetadataLibraryProvider(reference))
val generatedModule = KlibModuleMetadata.read(SerializedMetadataLibraryProvider(generated))
@@ -75,7 +75,8 @@ internal val MOCK_CLASSIFIERS = CirKnownClassifiers(
isData = false,
isValue = false,
isInner = false,
isExternal = false
isExternal = false,
hasEnumEntries = false
)
}
)