[commonizer] Don't commonize "tailrec" and "external" modifiers

expect external and tailrec were prohibited
in previous commit.

^KT-58536
This commit is contained in:
Roman Efremov
2023-05-22 15:21:24 +02:00
committed by Space Team
parent 439cc88525
commit c8023eac13
23 changed files with 20 additions and 108 deletions
@@ -14,7 +14,6 @@ interface CirClass : CirClassifier, CirContainingClass, AnyClass {
val isCompanion: Boolean
val isValue: Boolean
val isInner: Boolean
val isExternal: Boolean
val hasEnumEntries: Boolean
val supertypes: List<CirType>
@@ -33,7 +32,6 @@ interface CirClass : CirClassifier, CirContainingClass, AnyClass {
isData: Boolean,
isValue: Boolean,
isInner: Boolean,
isExternal: Boolean,
hasEnumEntries: Boolean
): CirClass = CirClassImpl(
annotations = annotations,
@@ -48,7 +46,6 @@ interface CirClass : CirClassifier, CirContainingClass, AnyClass {
isData = isData,
isValue = isValue,
isInner = isInner,
isExternal = isExternal,
hasEnumEntries = hasEnumEntries
)
}
@@ -67,6 +64,5 @@ data class CirClassImpl(
override val isData: Boolean,
override val isValue: Boolean,
override val isInner: Boolean,
override val isExternal: Boolean,
override val hasEnumEntries: Boolean
) : CirClass
@@ -11,26 +11,20 @@ interface CirFunctionModifiers {
val isOperator: Boolean
val isInfix: Boolean
val isInline: Boolean
val isTailrec: Boolean
val isSuspend: Boolean
val isExternal: Boolean
companion object {
fun createInterned(
isOperator: Boolean,
isInfix: Boolean,
isInline: Boolean,
isTailrec: Boolean,
isSuspend: Boolean,
isExternal: Boolean
): CirFunctionModifiers = interner.intern(
CirFunctionModifiersInternedImpl(
isOperator = isOperator,
isInfix = isInfix,
isInline = isInline,
isTailrec = isTailrec,
isSuspend = isSuspend,
isExternal = isExternal
)
)
@@ -42,7 +36,5 @@ private data class CirFunctionModifiersInternedImpl(
override val isOperator: Boolean,
override val isInfix: Boolean,
override val isInline: Boolean,
override val isTailrec: Boolean,
override val isSuspend: Boolean,
override val isExternal: Boolean
) : CirFunctionModifiers
@@ -16,7 +16,6 @@ data class CirProperty(
override val visibility: Visibility,
override val modality: Modality,
override val containingClass: CirContainingClass?,
val isExternal: Boolean,
override val extensionReceiver: CirExtensionReceiver?,
override val returnType: CirType,
override val kind: CallableMemberDescriptor.Kind,
@@ -7,6 +7,5 @@ package org.jetbrains.kotlin.commonizer.cir
interface CirPropertyAccessor : CirHasAnnotations {
val isDefault: Boolean
val isExternal: Boolean
val isInline: Boolean
}
@@ -15,13 +15,11 @@ interface CirPropertyGetter : CirPropertyAccessor {
fun createInterned(
annotations: List<CirAnnotation>,
isDefault: Boolean,
isExternal: Boolean,
isInline: Boolean
): CirPropertyGetter = interner.intern(
CirPropertyGetterInternedImpl(
annotations = annotations,
isDefault = isDefault,
isExternal = isExternal,
isInline = isInline
)
)
@@ -32,7 +30,6 @@ interface CirPropertyGetter : CirPropertyAccessor {
DEFAULT_NO_ANNOTATIONS = createInterned(
annotations = emptyList(),
isDefault = true,
isExternal = false,
isInline = false
)
}
@@ -42,6 +39,5 @@ interface CirPropertyGetter : CirPropertyAccessor {
private data class CirPropertyGetterInternedImpl(
override val annotations: List<CirAnnotation>,
override val isDefault: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean
) : CirPropertyGetter
@@ -18,7 +18,6 @@ interface CirPropertySetter : CirDeclaration, CirPropertyAccessor, CirHasVisibil
parameterAnnotations: List<CirAnnotation>,
visibility: Visibility,
isDefault: Boolean,
isExternal: Boolean,
isInline: Boolean
): CirPropertySetter = interner.intern(
CirPropertySetterInternedImpl(
@@ -26,7 +25,6 @@ interface CirPropertySetter : CirDeclaration, CirPropertyAccessor, CirHasVisibil
parameterAnnotations = parameterAnnotations,
visibility = visibility,
isDefault = isDefault,
isExternal = isExternal,
isInline = isInline
)
)
@@ -37,7 +35,6 @@ interface CirPropertySetter : CirDeclaration, CirPropertyAccessor, CirHasVisibil
parameterAnnotations = emptyList(),
visibility = visibility,
isDefault = visibility == Visibilities.Public,
isExternal = false,
isInline = false
)
@@ -50,6 +47,5 @@ private data class CirPropertySetterInternedImpl(
override val parameterAnnotations: List<CirAnnotation>,
override val visibility: Visibility,
override val isDefault: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean
) : CirPropertySetter
@@ -19,7 +19,6 @@ object CirClassRecursionMarker : CirClass, CirRecursionMarker {
override val isData get() = unsupported()
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()
@@ -38,7 +38,6 @@ class ClassCommonizer internal constructor(
isData = false,
isValue = isValue,
isInner = isInner,
isExternal = false,
hasEnumEntries = hasEnumEntries
)
}
@@ -12,26 +12,20 @@ class FunctionModifiersCommonizer : AbstractStandardCommonizer<CirFunctionModifi
var isOperator: Boolean,
var isInfix: Boolean,
var isInline: Boolean,
var isTailrec: Boolean,
var isSuspend: Boolean,
var isExternal: Boolean
) {
constructor(immutable: CirFunctionModifiers) : this(
isOperator = immutable.isOperator,
isInfix = immutable.isInfix,
isInline = immutable.isInline,
isTailrec = immutable.isTailrec,
isSuspend = immutable.isSuspend,
isExternal = immutable.isExternal
)
fun toImmutableModifiers() = CirFunctionModifiers.createInterned(
isOperator = isOperator,
isInfix = isInfix,
isInline = isInline,
isTailrec = isTailrec,
isSuspend = isSuspend,
isExternal = isExternal
)
}
@@ -50,8 +44,6 @@ class FunctionModifiersCommonizer : AbstractStandardCommonizer<CirFunctionModifi
modifiers.isOperator = modifiers.isOperator && next.isOperator
modifiers.isInfix = modifiers.isInfix && next.isInfix
modifiers.isInline = modifiers.isInline && next.isInline
modifiers.isTailrec = modifiers.isTailrec && next.isTailrec
modifiers.isExternal = modifiers.isExternal && next.isExternal
return true
}
@@ -15,7 +15,6 @@ class PropertyCommonizer(
functionOrPropertyBaseCommonizer: FunctionOrPropertyBaseCommonizer
) : AbstractStandardCommonizer<CirProperty, CirProperty?>() {
private val setter = PropertySetterCommonizer.asNullableCommonizer()
private var isExternal = true
private lateinit var constCommonizationState: ConstCommonizationState
private val functionOrPropertyBaseCommonizer = functionOrPropertyBaseCommonizer.asCommonizer()
@@ -36,7 +35,6 @@ class PropertyCommonizer(
visibility = functionOrPropertyBase.visibility,
modality = functionOrPropertyBase.modality,
containingClass = null, // does not matter
isExternal = isExternal,
extensionReceiver = functionOrPropertyBase.extensionReceiver,
returnType = functionOrPropertyBase.returnType,
kind = functionOrPropertyBase.kind,
@@ -92,10 +90,6 @@ class PropertyCommonizer(
val result = functionOrPropertyBaseCommonizer.commonizeWith(next)
&& setter.commonizeWith(next.setter)
if (result) {
isExternal = isExternal && next.isExternal
}
return result
}
@@ -102,7 +102,6 @@ object CirDeserializers {
visibility = visibility(source.flags),
modality = modality(source.flags),
containingClass = containingClass,
isExternal = Flag.Property.IS_EXTERNAL(source.flags),
extensionReceiver = source.receiverParameterType?.let { extensionReceiver(it, typeResolver) },
returnType = type(source.returnType, typeResolver),
kind = callableKind(source.flags),
@@ -133,7 +132,6 @@ object CirDeserializers {
return CirPropertyGetter.createInterned(
annotations = annotations,
isDefault = isDefault,
isExternal = Flag.PropertyAccessor.IS_EXTERNAL(getterFlags),
isInline = Flag.PropertyAccessor.IS_INLINE(getterFlags)
)
}
@@ -151,7 +149,6 @@ object CirDeserializers {
}.orEmpty(),
visibility = visibility(setterFlags),
isDefault = !Flag.PropertyAccessor.IS_NOT_DEFAULT(setterFlags),
isExternal = Flag.PropertyAccessor.IS_EXTERNAL(setterFlags),
isInline = Flag.PropertyAccessor.IS_INLINE(setterFlags)
)
}
@@ -186,9 +183,7 @@ object CirDeserializers {
isOperator = Flag.Function.IS_OPERATOR(source.flags),
isInfix = Flag.Function.IS_INFIX(source.flags),
isInline = Flag.Function.IS_INLINE(source.flags),
isTailrec = Flag.Function.IS_TAILREC(source.flags),
isSuspend = Flag.Function.IS_SUSPEND(source.flags),
isExternal = Flag.Function.IS_EXTERNAL(source.flags)
)
private fun valueParameter(source: KmValueParameter, typeResolver: CirTypeResolver): CirValueParameter =
@@ -265,7 +260,6 @@ 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),
hasEnumEntries = Flag.Class.HAS_ENUM_ENTRIES(source.flags)
)
@@ -295,7 +289,6 @@ object CirDeserializers {
isData = false,
isValue = false,
isInner = false,
isExternal = false,
hasEnumEntries = hasEnumEntries
)
@@ -47,7 +47,6 @@ internal fun CirPropertyAccessor.propertyAccessorFlags(
visibilityHolder.visibilityFlag,
modalityHolder.modalityFlag,
Flag.PropertyAccessor.IS_NOT_DEFAULT.takeIf { !isDefault },
Flag.PropertyAccessor.IS_EXTERNAL.takeIf { isExternal },
Flag.PropertyAccessor.IS_INLINE.takeIf { isInline }
)
}
@@ -88,7 +87,6 @@ internal fun CirClass.classFlags(isExpect: Boolean): Flags =
Flag.Class.IS_COMPANION_OBJECT.takeIf { isCompanion },
Flag.Class.IS_INNER.takeIf { isInner },
Flag.Class.IS_DATA.takeIf { isData },
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 }
@@ -163,9 +161,7 @@ private inline val CirFunctionModifiers.modifiersFlags: Flags
Flag.Function.IS_OPERATOR.takeIf { isOperator },
Flag.Function.IS_INFIX.takeIf { isInfix },
Flag.Function.IS_INLINE.takeIf { isInline },
Flag.Function.IS_TAILREC.takeIf { isTailrec },
Flag.Function.IS_SUSPEND.takeIf { isSuspend },
Flag.Function.IS_EXTERNAL.takeIf { isExternal }
)
private inline val CirProperty.modifiersFlags: Flags
@@ -174,7 +170,6 @@ private inline val CirProperty.modifiersFlags: Flags
Flag.Property.IS_CONST.takeIf { isConst },
Flag.Property.HAS_CONSTANT.takeIf { compileTimeInitializer.takeIf { it !is CirConstantValue.NullValue } != null },
Flag.Property.IS_LATEINIT.takeIf { isLateInit },
Flag.Property.IS_EXTERNAL.takeIf { isExternal }
)
private inline val CirType.nullableFlag: Flag?
@@ -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, hasEnumEntries = false
companion = null, isCompanion = false, isData = false, isValue = false, isInner = false, hasEnumEntries = false
)
private fun CirTypeAlias.resolveSupertypes(targetIndex: Int): List<CirType> {
@@ -94,3 +94,5 @@ expect class LL1(value: String) {
expect class LL2(value: String) {
val value: String
}
expect class ExternalClass()
@@ -145,3 +145,5 @@ class KK2(private val wrapped: JJ) : JJ by wrapped
data class LL1(val value: String)
data class LL2(val value: String)
external class ExternalClass
@@ -145,3 +145,5 @@ class KK2(wrapped: JJ) : JJ by wrapped
data class LL1(val value: String)
class LL2(val value: String)
external class ExternalClass
@@ -8,10 +8,10 @@ expect fun Qux.set(index: Int, value: String)
expect infix fun Qux.infixFunction1(another: Qux)
expect fun Qux.infixFunction2(another: Qux)
expect tailrec fun tailrecFunction1()
expect fun tailrecFunction1()
expect fun tailrecFunction2()
expect external fun externalFunction1()
expect fun externalFunction1()
expect fun externalFunction2()
expect inline fun inlineFunction1() {}
@@ -13,5 +13,7 @@ expect var inlineProperty6: Int
expect var inlineProperty7: Int
expect var inlineProperty8: Int
expect external val externalProperty1: Int
expect val externalProperty1: Int
expect val externalProperty2: Int
expect var externalSetGet: Int
@@ -28,3 +28,7 @@ inline var inlineProperty8
external val externalProperty1: Int
external val externalProperty2: Int
var externalSetGet: Int
external get
external set
@@ -28,3 +28,7 @@ var inlineProperty8
external val externalProperty1: Int
val externalProperty2: Int = 1
var externalSetGet: Int
external get
external set
@@ -112,54 +112,6 @@ class FunctionModifiersCommonizerTest : AbstractCommonizerTest<CirFunctionModifi
mockFunctionModifiers()
)
@Test
fun allTailrec() = doTestSuccess(
expected = mockFunctionModifiers(isTailrec = true),
mockFunctionModifiers(isTailrec = true),
mockFunctionModifiers(isTailrec = true),
mockFunctionModifiers(isTailrec = true)
)
@Test
fun notTailrecAndTailrec() = doTestSuccess(
expected = mockFunctionModifiers(),
mockFunctionModifiers(),
mockFunctionModifiers(isTailrec = true),
mockFunctionModifiers(isTailrec = true)
)
@Test
fun tailrecAndNotTailrec() = doTestSuccess(
expected = mockFunctionModifiers(),
mockFunctionModifiers(isTailrec = true),
mockFunctionModifiers(isTailrec = true),
mockFunctionModifiers()
)
@Test
fun allExternal() = doTestSuccess(
expected = mockFunctionModifiers(isExternal = true),
mockFunctionModifiers(isExternal = true),
mockFunctionModifiers(isExternal = true),
mockFunctionModifiers(isExternal = true)
)
@Test
fun notExternalAndExternal() = doTestSuccess(
expected = mockFunctionModifiers(),
mockFunctionModifiers(),
mockFunctionModifiers(isExternal = true),
mockFunctionModifiers(isExternal = true)
)
@Test
fun externalAndNotExternal() = doTestSuccess(
expected = mockFunctionModifiers(),
mockFunctionModifiers(isExternal = true),
mockFunctionModifiers(isExternal = true),
mockFunctionModifiers()
)
override fun createCommonizer() = FunctionModifiersCommonizer()
}
@@ -167,14 +119,10 @@ private fun mockFunctionModifiers(
isOperator: Boolean = false,
isInfix: Boolean = false,
isInline: Boolean = false,
isTailrec: Boolean = false,
isSuspend: Boolean = false,
isExternal: Boolean = false
) = CirFunctionModifiers.createInterned(
isOperator = isOperator,
isInfix = isInfix,
isInline = isInline,
isTailrec = isTailrec,
isSuspend = isSuspend,
isExternal = isExternal
)
@@ -22,7 +22,6 @@ class CirTreeClassDeserializerTest : AbstractCirTreeDeserializerTest() {
assertNull(clazz.companion, "Expected class *not* having a companion")
assertFalse(clazz.isInner, "Expected class *not* being inner")
assertFalse(clazz.isCompanion, "Expected class *not* being companion")
assertFalse(clazz.isExternal, "Expected class *not* being external")
assertFalse(clazz.isValue, "Expected class *not* being value")
assertFalse(clazz.isData, "Expected class *not* being data class")
assertTrue(clazz.supertypes.isEmpty(), "Expected class not having any explicit supertypes")
@@ -75,7 +75,6 @@ internal val MOCK_CLASSIFIERS = CirKnownClassifiers(
isData = false,
isValue = false,
isInner = false,
isExternal = false,
hasEnumEntries = false
)
}