[Commonizer] Commonize 'HAS_ENUM_ENTRIES' flag
^KT-56207 Verification Pending
This commit is contained in:
committed by
Space Team
parent
e232cc92f9
commit
513f4a3c42
@@ -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 }
|
||||
)
|
||||
|
||||
|
||||
+1
-1
@@ -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> {
|
||||
|
||||
+1
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
+2
-11
@@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user