Deprecate old kotlinx-metadata flags API:

Flag, Flag constants, Flags typealias, flagsOf() function, and
Flag accessors in nodes (such as KmClass.flags, KmClass.jvmFlags, KmProperty.setterFlags, etc)

#KT-59440
This commit is contained in:
Leonid Startsev
2023-06-01 16:33:05 +02:00
committed by Space Team
parent 1a1cbcb321
commit b15da7c63a
30 changed files with 733 additions and 653 deletions
@@ -119,7 +119,7 @@ internal class ModuleMetadataEmitter(
val kmClass = data.withMappingExtensions { val kmClass = data.withMappingExtensions {
KmClass().also { km -> KmClass().also { km ->
element.annotations.mapTo(km.annotations) { it.map() } element.annotations.mapTo(km.annotations) { it.map() }
km.flags = element.flags km.modifiersFrom(element)
km.name = element.classifier.fqNameSerialized km.name = element.classifier.fqNameSerialized
element.superClassInit?.let { km.supertypes += it.type.map() } element.superClassInit?.let { km.supertypes += it.type.map() }
element.interfaces.mapTo(km.supertypes) { it.map() } element.interfaces.mapTo(km.supertypes) { it.map() }
@@ -141,7 +141,7 @@ internal class ModuleMetadataEmitter(
override fun visitTypealias(element: TypealiasStub, data: VisitingContext): KmTypeAlias = override fun visitTypealias(element: TypealiasStub, data: VisitingContext): KmTypeAlias =
data.withMappingExtensions { data.withMappingExtensions {
KmTypeAlias(element.alias.topLevelName).also { km -> KmTypeAlias(element.alias.topLevelName).also { km ->
km.flags = element.flags km.visibility = Visibility.PUBLIC
km.underlyingType = element.aliasee.map(shouldExpandTypeAliases = false) km.underlyingType = element.aliasee.map(shouldExpandTypeAliases = false)
km.expandedType = element.aliasee.map() km.expandedType = element.aliasee.map()
} }
@@ -158,7 +158,7 @@ internal class ModuleMetadataEmitter(
) )
} }
KmFunction(function.name).also { km -> KmFunction(function.name).also { km ->
km.flags = function.flags km.modifiersFrom(function)
km.receiverParameterType = function.receiver?.type?.map() km.receiverParameterType = function.receiver?.type?.map()
function.typeParameters.mapTo(km.typeParameters) { it.map() } function.typeParameters.mapTo(km.typeParameters) { it.map() }
function.parameters.mapTo(km.valueParameters) { it.map() } function.parameters.mapTo(km.valueParameters) { it.map() }
@@ -179,9 +179,9 @@ internal class ModuleMetadataEmitter(
} }
val name = getPropertyNameInScope(property, data.container) val name = getPropertyNameInScope(property, data.container)
KmProperty(name).also { km -> KmProperty(name).also { km ->
km.flags = property.flags km.modifiersFrom(property)
km.getterFlags = property.getterFlags km.getter.getterModifiersFrom(property)
km.setterFlags = property.setterFlags km.setter = setterFrom(property)
property.annotations.mapTo(km.annotations) { it.map() } property.annotations.mapTo(km.annotations) { it.map() }
km.receiverParameterType = property.receiverType?.map() km.receiverParameterType = property.receiverType?.map()
km.returnType = property.type.map() km.returnType = property.type.map()
@@ -205,7 +205,7 @@ internal class ModuleMetadataEmitter(
override fun visitConstructor(constructorStub: ConstructorStub, data: VisitingContext) = override fun visitConstructor(constructorStub: ConstructorStub, data: VisitingContext) =
data.withMappingExtensions { data.withMappingExtensions {
KmConstructor().apply { KmConstructor().apply {
flags = constructorStub.flags modifiersFrom(constructorStub)
constructorStub.parameters.mapTo(valueParameters, { it.map() }) constructorStub.parameters.mapTo(valueParameters, { it.map() })
constructorStub.annotations.mapTo(annotations, { it.map() }) constructorStub.annotations.mapTo(annotations, { it.map() })
} }
@@ -239,34 +239,31 @@ private class MappingExtensions(
private val bridgeBuilderResult: BridgeBuilderResult private val bridgeBuilderResult: BridgeBuilderResult
) { ) {
private fun flagsOfNotNull(vararg flags: Flag?): Flags =
flagsOf(*listOfNotNull(*flags).toTypedArray())
private fun <K, V> mapOfNotNull(vararg entries: Pair<K, V>?): Map<K, V> = private fun <K, V> mapOfNotNull(vararg entries: Pair<K, V>?): Map<K, V> =
listOfNotNull(*entries).toMap() listOfNotNull(*entries).toMap()
private val VisibilityModifier.flags: Flags private val VisibilityModifier.kmVisibility: Visibility
get() = flagsOfNotNull( get() = when (this) {
Flag.IS_PUBLIC.takeIf { this == VisibilityModifier.PUBLIC }, VisibilityModifier.PUBLIC -> Visibility.PUBLIC
Flag.IS_PROTECTED.takeIf { this == VisibilityModifier.PROTECTED }, VisibilityModifier.PROTECTED -> Visibility.PROTECTED
Flag.IS_INTERNAL.takeIf { this == VisibilityModifier.INTERNAL }, VisibilityModifier.INTERNAL -> Visibility.INTERNAL
Flag.IS_PRIVATE.takeIf { this == VisibilityModifier.PRIVATE } VisibilityModifier.PRIVATE -> Visibility.PRIVATE
) }
private val MemberStubModality.flags: Flags private val MemberStubModality.kmModality: Modality
get() = flagsOfNotNull( get() = when (this) {
Flag.IS_FINAL.takeIf { this == MemberStubModality.FINAL }, MemberStubModality.FINAL -> Modality.FINAL
Flag.IS_OPEN.takeIf { this == MemberStubModality.OPEN }, MemberStubModality.OPEN -> Modality.OPEN
Flag.IS_ABSTRACT.takeIf { this == MemberStubModality.ABSTRACT } MemberStubModality.ABSTRACT -> Modality.ABSTRACT
) }
val FunctionStub.flags: Flags fun KmFunction.modifiersFrom(fs: FunctionStub) {
get() = flagsOfNotNull( visibility = Visibility.PUBLIC
Flag.IS_PUBLIC, modality = fs.modality.kmModality
Flag.Function.IS_EXTERNAL.takeIf { this.external }, isExternal = fs.external
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() }, hasAnnotations = fs.annotations.isNotEmpty()
Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES.takeIf { !this.hasStableParameterNames } hasNonStableParameterNames = !fs.hasStableParameterNames
) or modality.flags }
val Classifier.fqNameSerialized: String val Classifier.fqNameSerialized: String
get() = buildString { get() = buildString {
@@ -278,96 +275,81 @@ private class MappingExtensions(
append(getRelativeFqName(asSimpleName = false)) append(getRelativeFqName(asSimpleName = false))
} }
val PropertyStub.flags: Flags fun KmProperty.modifiersFrom(ps: PropertyStub) {
get() = flagsOfNotNull( visibility = Visibility.PUBLIC
Flag.IS_PUBLIC, modality = ps.modality.kmModality
Flag.Property.IS_DECLARATION, kind = MemberKind.DECLARATION
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() }, hasAnnotations = ps.annotations.isNotEmpty()
Flag.Property.HAS_CONSTANT.takeIf { kind is PropertyStub.Kind.Constant }, hasGetter = true
Flag.Property.HAS_GETTER, when (ps.kind) {
Flag.Property.HAS_SETTER.takeIf { kind is PropertyStub.Kind.Var }, is PropertyStub.Kind.Val -> {}
when (kind) { is PropertyStub.Kind.Var -> {
is PropertyStub.Kind.Val -> null isVar = true
is PropertyStub.Kind.Var -> Flag.Property.IS_VAR hasGetter = true
is PropertyStub.Kind.Constant -> Flag.Property.IS_CONST }
is PropertyStub.Kind.Constant -> {
isConst = true
hasConstant = true
}
}
}
fun KmPropertyAccessorAttributes.getterModifiersFrom(ps: PropertyStub) {
val getter = when (val kind = ps.kind) {
is PropertyStub.Kind.Val -> kind.getter
is PropertyStub.Kind.Var -> kind.getter
is PropertyStub.Kind.Constant -> null
}
if (getter == null) {
// constant
visibility = Visibility.PUBLIC
modality = Modality.FINAL
} else {
visibility = Visibility.PUBLIC
modality = ps.modality.kmModality
hasAnnotations = getter.annotations.isNotEmpty()
isNotDefault = true
isExternal = getter is PropertyAccessor.Getter.ExternalGetter
}
}
fun setterFrom(ps: PropertyStub): KmPropertyAccessorAttributes? {
val setter = if (ps.kind is PropertyStub.Kind.Var) ps.kind.setter else return null
return KmPropertyAccessorAttributes().apply {
hasAnnotations = setter.annotations.isNotEmpty()
visibility = Visibility.PUBLIC
modality = ps.modality.kmModality
isNotDefault = true
isExternal = setter is PropertyAccessor.Setter.ExternalSetter
}
}
fun KmType.modifiersFrom(st: StubType) {
isNullable = st.nullable
}
fun KmClass.modifiersFrom(cs: ClassStub) {
hasAnnotations = cs.annotations.isNotEmpty()
visibility = Visibility.PUBLIC
kind = when (cs) {
is ClassStub.Simple -> {
modality = when (cs.modality) {
ClassStubModality.NONE -> Modality.FINAL
ClassStubModality.OPEN -> Modality.OPEN
ClassStubModality.ABSTRACT, ClassStubModality.INTERFACE -> Modality.ABSTRACT
} }
) or modality.flags if (cs.modality == ClassStubModality.INTERFACE) ClassKind.INTERFACE else ClassKind.CLASS
}
val PropertyStub.getterFlags: Flags is ClassStub.Companion -> ClassKind.COMPANION_OBJECT
get() = when (val kind = kind) { is ClassStub.Enum -> ClassKind.ENUM_CLASS
is PropertyStub.Kind.Val -> kind.getter.flags(modality)
is PropertyStub.Kind.Var -> kind.getter.flags(modality)
is PropertyStub.Kind.Constant -> kind.flags
} }
}
val PropertyStub.Kind.Constant.flags: Flags fun KmConstructor.modifiersFrom(cs: ConstructorStub) {
get() = flagsOfNotNull( visibility = cs.visibility.kmVisibility
Flag.IS_PUBLIC, isSecondary = !cs.isPrimary
Flag.IS_FINAL hasAnnotations = cs.annotations.isNotEmpty()
) }
private fun PropertyAccessor.Getter.flags(propertyModality: MemberStubModality): Flags =
flagsOfNotNull(
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() },
Flag.IS_PUBLIC,
Flag.PropertyAccessor.IS_NOT_DEFAULT,
Flag.PropertyAccessor.IS_EXTERNAL.takeIf { this is PropertyAccessor.Getter.ExternalGetter }
) or propertyModality.flags
val PropertyStub.setterFlags: Flags
get() = when (val kind = kind) {
is PropertyStub.Kind.Var -> kind.setter.flags(modality)
else -> flagsOf()
}
private fun PropertyAccessor.Setter.flags(propertyModality: MemberStubModality): Flags =
flagsOfNotNull(
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() },
Flag.IS_PUBLIC,
Flag.PropertyAccessor.IS_NOT_DEFAULT,
Flag.PropertyAccessor.IS_EXTERNAL.takeIf { this is PropertyAccessor.Setter.ExternalSetter }
) or propertyModality.flags
val StubType.flags: Flags
get() = flagsOfNotNull(
Flag.Type.IS_NULLABLE.takeIf { nullable }
)
val AbbreviatedType.expandedTypeFlags: Flags
get() = flagsOfNotNull(
Flag.Type.IS_NULLABLE.takeIf { isEffectivelyNullable() }
)
val TypealiasStub.flags: Flags
get() = flagsOfNotNull(
Flag.IS_PUBLIC
)
val FunctionParameterStub.flags: Flags
get() = flagsOfNotNull(
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() }
)
val ClassStub.flags: Flags
get() = flagsOfNotNull(
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() },
Flag.IS_PUBLIC,
Flag.IS_OPEN.takeIf { this is ClassStub.Simple && modality == ClassStubModality.OPEN },
Flag.IS_FINAL.takeIf { this is ClassStub.Simple && modality == ClassStubModality.NONE },
Flag.IS_ABSTRACT.takeIf { this is ClassStub.Simple
&& (modality == ClassStubModality.ABSTRACT || modality == ClassStubModality.INTERFACE) },
Flag.Class.IS_INTERFACE.takeIf { this is ClassStub.Simple && modality == ClassStubModality.INTERFACE },
Flag.Class.IS_COMPANION_OBJECT.takeIf { this is ClassStub.Companion },
Flag.Class.IS_CLASS.takeIf { this is ClassStub.Simple && modality != ClassStubModality.INTERFACE },
Flag.Class.IS_ENUM_CLASS.takeIf { this is ClassStub.Enum }
)
val ConstructorStub.flags: Flags
get() = flagsOfNotNull(
Flag.Constructor.IS_SECONDARY.takeIf { !isPrimary },
Flag.HAS_ANNOTATIONS.takeIf { annotations.isNotEmpty() }
) or visibility.flags
private tailrec fun StubType.isEffectivelyNullable(): Boolean = private tailrec fun StubType.isEffectivelyNullable(): Boolean =
when { when {
@@ -490,13 +472,13 @@ private class MappingExtensions(
val typeAliasClassifier = KmClassifier.TypeAlias(abbreviatedClassifier.fqNameSerialized) val typeAliasClassifier = KmClassifier.TypeAlias(abbreviatedClassifier.fqNameSerialized)
val typeArguments = typeArguments.map { it.map(shouldExpandTypeAliases) } val typeArguments = typeArguments.map { it.map(shouldExpandTypeAliases) }
val abbreviatedType = KmType().also { km -> val abbreviatedType = KmType().also { km ->
km.flags = flags km.modifiersFrom(this)
km.classifier = typeAliasClassifier km.classifier = typeAliasClassifier
km.arguments += typeArguments km.arguments += typeArguments
} }
if (shouldExpandTypeAliases) { if (shouldExpandTypeAliases) {
KmType().also { km -> KmType().also { km ->
km.flags = expandedTypeFlags km.isNullable = this.isEffectivelyNullable()
km.abbreviatedType = abbreviatedType km.abbreviatedType = abbreviatedType
val kmUnderlyingType = underlyingType.map(true) val kmUnderlyingType = underlyingType.map(true)
km.arguments += kmUnderlyingType.arguments km.arguments += kmUnderlyingType.arguments
@@ -507,24 +489,24 @@ private class MappingExtensions(
} }
} }
is ClassifierStubType -> KmType().also { km -> is ClassifierStubType -> KmType().also { km ->
km.flags = flags km.modifiersFrom(this)
typeArguments.mapTo(km.arguments) { it.map(shouldExpandTypeAliases) } typeArguments.mapTo(km.arguments) { it.map(shouldExpandTypeAliases) }
km.classifier = KmClassifier.Class(classifier.fqNameSerialized) km.classifier = KmClassifier.Class(classifier.fqNameSerialized)
} }
is FunctionalType -> KmType().also { km -> is FunctionalType -> KmType().also { km ->
km.flags = flags km.modifiersFrom(this)
typeArguments.mapTo(km.arguments) { it.map(shouldExpandTypeAliases) } typeArguments.mapTo(km.arguments) { it.map(shouldExpandTypeAliases) }
km.classifier = KmClassifier.Class(classifier.fqNameSerialized) km.classifier = KmClassifier.Class(classifier.fqNameSerialized)
} }
is TypeParameterType -> KmType().also { km -> is TypeParameterType -> KmType().also { km ->
km.flags = flags km.modifiersFrom(this)
km.classifier = KmClassifier.TypeParameter(id) km.classifier = KmClassifier.TypeParameter(id)
} }
} }
fun FunctionParameterStub.map(): KmValueParameter = fun FunctionParameterStub.map(): KmValueParameter =
KmValueParameter(name).also { km -> KmValueParameter(name).also { km ->
km.flags = flags km.hasAnnotations = annotations.isNotEmpty()
val kmType = type.map() val kmType = type.map()
if (isVararg) { if (isVararg) {
km.varargElementType = kmType km.varargElementType = kmType
@@ -4,6 +4,7 @@ public final class kotlinx/metadata/Attributes {
public static final fun getHasAnnotations (Lkotlinx/metadata/KmConstructor;)Z public static final fun getHasAnnotations (Lkotlinx/metadata/KmConstructor;)Z
public static final fun getHasAnnotations (Lkotlinx/metadata/KmFunction;)Z public static final fun getHasAnnotations (Lkotlinx/metadata/KmFunction;)Z
public static final fun getHasAnnotations (Lkotlinx/metadata/KmProperty;)Z public static final fun getHasAnnotations (Lkotlinx/metadata/KmProperty;)Z
public static final fun getHasAnnotations (Lkotlinx/metadata/KmPropertyAccessorAttributes;)Z
public static final fun getHasAnnotations (Lkotlinx/metadata/KmTypeAlias;)Z public static final fun getHasAnnotations (Lkotlinx/metadata/KmTypeAlias;)Z
public static final fun getHasAnnotations (Lkotlinx/metadata/KmValueParameter;)Z public static final fun getHasAnnotations (Lkotlinx/metadata/KmValueParameter;)Z
public static final fun getHasConstant (Lkotlinx/metadata/KmProperty;)Z public static final fun getHasConstant (Lkotlinx/metadata/KmProperty;)Z
@@ -68,11 +69,13 @@ public final class kotlinx/metadata/Attributes {
public static final fun setExternal (Lkotlinx/metadata/KmClass;Z)V public static final fun setExternal (Lkotlinx/metadata/KmClass;Z)V
public static final fun setExternal (Lkotlinx/metadata/KmFunction;Z)V public static final fun setExternal (Lkotlinx/metadata/KmFunction;Z)V
public static final fun setExternal (Lkotlinx/metadata/KmProperty;Z)V public static final fun setExternal (Lkotlinx/metadata/KmProperty;Z)V
public static final fun setExternal (Lkotlinx/metadata/KmPropertyAccessorAttributes;Z)V
public static final fun setFunInterface (Lkotlinx/metadata/KmClass;Z)V public static final fun setFunInterface (Lkotlinx/metadata/KmClass;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmClass;Z)V public static final fun setHasAnnotations (Lkotlinx/metadata/KmClass;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmConstructor;Z)V public static final fun setHasAnnotations (Lkotlinx/metadata/KmConstructor;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmFunction;Z)V public static final fun setHasAnnotations (Lkotlinx/metadata/KmFunction;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmProperty;Z)V public static final fun setHasAnnotations (Lkotlinx/metadata/KmProperty;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmPropertyAccessorAttributes;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmTypeAlias;Z)V public static final fun setHasAnnotations (Lkotlinx/metadata/KmTypeAlias;Z)V
public static final fun setHasAnnotations (Lkotlinx/metadata/KmValueParameter;Z)V public static final fun setHasAnnotations (Lkotlinx/metadata/KmValueParameter;Z)V
public static final fun setHasConstant (Lkotlinx/metadata/KmProperty;Z)V public static final fun setHasConstant (Lkotlinx/metadata/KmProperty;Z)V
@@ -83,6 +86,7 @@ public final class kotlinx/metadata/Attributes {
public static final fun setHasSetter (Lkotlinx/metadata/KmProperty;Z)V public static final fun setHasSetter (Lkotlinx/metadata/KmProperty;Z)V
public static final fun setInfix (Lkotlinx/metadata/KmFunction;Z)V public static final fun setInfix (Lkotlinx/metadata/KmFunction;Z)V
public static final fun setInline (Lkotlinx/metadata/KmFunction;Z)V public static final fun setInline (Lkotlinx/metadata/KmFunction;Z)V
public static final fun setInline (Lkotlinx/metadata/KmPropertyAccessorAttributes;Z)V
public static final fun setInner (Lkotlinx/metadata/KmClass;Z)V public static final fun setInner (Lkotlinx/metadata/KmClass;Z)V
public static final fun setKind (Lkotlinx/metadata/KmClass;Lkotlinx/metadata/ClassKind;)V public static final fun setKind (Lkotlinx/metadata/KmClass;Lkotlinx/metadata/ClassKind;)V
public static final fun setKind (Lkotlinx/metadata/KmFunction;Lkotlinx/metadata/MemberKind;)V public static final fun setKind (Lkotlinx/metadata/KmFunction;Lkotlinx/metadata/MemberKind;)V
@@ -134,7 +138,7 @@ public final class kotlinx/metadata/ClassNameKt {
public abstract interface annotation class kotlinx/metadata/ExperimentalContextReceivers : java/lang/annotation/Annotation { public abstract interface annotation class kotlinx/metadata/ExperimentalContextReceivers : java/lang/annotation/Annotation {
} }
public final class kotlinx/metadata/Flag { public abstract class kotlinx/metadata/Flag {
public static final field Common Lkotlinx/metadata/Flag$Common; public static final field Common Lkotlinx/metadata/Flag$Common;
public static final field HAS_ANNOTATIONS Lkotlinx/metadata/Flag; public static final field HAS_ANNOTATIONS Lkotlinx/metadata/Flag;
public static final field IS_ABSTRACT Lkotlinx/metadata/Flag; public static final field IS_ABSTRACT Lkotlinx/metadata/Flag;
@@ -147,8 +151,7 @@ public final class kotlinx/metadata/Flag {
public static final field IS_PROTECTED Lkotlinx/metadata/Flag; public static final field IS_PROTECTED Lkotlinx/metadata/Flag;
public static final field IS_PUBLIC Lkotlinx/metadata/Flag; public static final field IS_PUBLIC Lkotlinx/metadata/Flag;
public static final field IS_SEALED Lkotlinx/metadata/Flag; public static final field IS_SEALED Lkotlinx/metadata/Flag;
public fun <init> (III)V public abstract fun invoke (I)Z
public final fun invoke (I)Z
} }
public final class kotlinx/metadata/Flag$Class { public final class kotlinx/metadata/Flag$Class {
@@ -3,6 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:Suppress("DEPRECATION")
@file:JvmName("JvmAttributes") @file:JvmName("JvmAttributes")
package kotlinx.metadata.jvm package kotlinx.metadata.jvm
@@ -10,7 +11,8 @@ package kotlinx.metadata.jvm
import kotlinx.metadata.KmClass import kotlinx.metadata.KmClass
import kotlinx.metadata.KmProperty import kotlinx.metadata.KmProperty
import kotlinx.metadata.internal.BooleanFlagDelegate import kotlinx.metadata.internal.BooleanFlagDelegate
import kotlinx.metadata.jvm.JvmFlag.booleanFlag import kotlinx.metadata.internal.FlagImpl
import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags as JF import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags as JF
/** /**
@@ -38,3 +40,6 @@ var KmClass.hasMethodBodiesInInterface by BooleanFlagDelegate(KmClass::jvmFlags,
* clients compiled without all-compatibility. * clients compiled without all-compatibility.
*/ */
var KmClass.isCompiledInCompatibilityMode by BooleanFlagDelegate(KmClass::jvmFlags, booleanFlag(JF.IS_COMPILED_IN_COMPATIBILITY_MODE)) var KmClass.isCompiledInCompatibilityMode by BooleanFlagDelegate(KmClass::jvmFlags, booleanFlag(JF.IS_COMPILED_IN_COMPATIBILITY_MODE))
private fun booleanFlag(f: Flags.BooleanFlagField): FlagImpl =
FlagImpl(f.offset, f.bitWidth, 1)
@@ -32,7 +32,7 @@ abstract class JvmDeclarationContainerExtensionVisitor @JvmOverloads constructor
* @param setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag * @param setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag
* and [Flag.PropertyAccessor] flags * and [Flag.PropertyAccessor] flags
*/ */
open fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = open fun visitLocalDelegatedProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? =
delegate?.visitLocalDelegatedProperty(flags, name, getterFlags, setterFlags) delegate?.visitLocalDelegatedProperty(flags, name, getterFlags, setterFlags)
/** /**
@@ -67,7 +67,7 @@ open class JvmClassExtensionVisitor @JvmOverloads constructor(
/** /**
* Visits the JVM-specific flags of the class, consisting of [JvmFlag.Class] flags. * Visits the JVM-specific flags of the class, consisting of [JvmFlag.Class] flags.
*/ */
open fun visitJvmFlags(flags: Flags) { open fun visitJvmFlags(flags: Int) {
delegate?.visitJvmFlags(flags) delegate?.visitJvmFlags(flags)
} }
@@ -189,7 +189,7 @@ open class JvmPropertyExtensionVisitor @JvmOverloads constructor(
* Example: `JvmMethodSignature("setX", "(Ljava/lang/Object;)V")` * Example: `JvmMethodSignature("setX", "(Ljava/lang/Object;)V")`
*/ */
open fun visit( open fun visit(
jvmFlags: Flags, jvmFlags: Int,
fieldSignature: JvmFieldSignature?, fieldSignature: JvmFieldSignature?,
getterSignature: JvmMethodSignature?, getterSignature: JvmMethodSignature?,
setterSignature: JvmMethodSignature? setterSignature: JvmMethodSignature?
@@ -45,7 +45,8 @@ var KmClass.anonymousObjectOriginName: String?
/** /**
* JVM-specific flags of the class, consisting of [JvmFlag.Class] flags. * JVM-specific flags of the class, consisting of [JvmFlag.Class] flags.
*/ */
var KmClass.jvmFlags: Flags @Deprecated("Flag API is deprecated. Please use corresponding member extensions on KmClass, such as KmClass.hasMethodBodiesInInterface")
var KmClass.jvmFlags: Int
get() = jvm.jvmFlags get() = jvm.jvmFlags
set(value) { set(value) {
jvm.jvmFlags = value jvm.jvmFlags = value
@@ -96,7 +97,8 @@ var KmFunction.lambdaClassOriginName: String?
/** /**
* JVM-specific flags of the property, consisting of [JvmFlag.Property] flags. * JVM-specific flags of the property, consisting of [JvmFlag.Property] flags.
*/ */
var KmProperty.jvmFlags: Flags @Deprecated("Flag API is deprecated. Please use corresponding member extensions on KmProperty, such as KmProperty.isMovedFromInterfaceCompanion")
var KmProperty.jvmFlags: Int
get() = jvm.jvmFlags get() = jvm.jvmFlags
set(value) { set(value) {
jvm.jvmFlags = value jvm.jvmFlags = value
@@ -3,23 +3,29 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:Suppress("DEPRECATION")
package kotlinx.metadata.jvm package kotlinx.metadata.jvm
import kotlinx.metadata.Flag import kotlinx.metadata.Flag
import kotlinx.metadata.Flags import kotlinx.metadata.internal.FlagImpl
import org.jetbrains.kotlin.metadata.deserialization.Flags as F import org.jetbrains.kotlin.metadata.deserialization.Flags as F
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags as JF import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmFlags as JF
private const val prefix = "Flag API is deprecated. Please use"
/** /**
* JVM-specific flags in addition to common flags declared in [Flag]. * JVM-specific flags in addition to common flags declared in [Flag].
* *
* @see Flag * @see Flag
* @see Flags * @see Flags
*/ */
@Deprecated("$prefix corresponding extensions on Km nodes, such as KmClass.hasMethodBodiesInInterface")
object JvmFlag { object JvmFlag {
/** /**
* JVM-specific property flags in addition to common property flags declared in [Flag.Property]. * JVM-specific property flags in addition to common property flags declared in [Flag.Property].
*/ */
@Deprecated("$prefix corresponding extension on KmProperty: KmProperty.isMovedFromInterfaceCompanion")
object Property { object Property {
/** /**
* Applied to a property declared in an interface's companion object, signifies that its backing field is declared as a static * Applied to a property declared in an interface's companion object, signifies that its backing field is declared as a static
@@ -28,12 +34,14 @@ object JvmFlag {
* Has no effect if the property is not declared in a companion object of some interface. * Has no effect if the property is not declared in a companion object of some interface.
*/ */
@JvmField @JvmField
@Deprecated("$prefix KmProperty.isMovedFromInterfaceCompanion")
val IS_MOVED_FROM_INTERFACE_COMPANION = booleanFlag(JF.IS_MOVED_FROM_INTERFACE_COMPANION) val IS_MOVED_FROM_INTERFACE_COMPANION = booleanFlag(JF.IS_MOVED_FROM_INTERFACE_COMPANION)
} }
/** /**
* JVM-specific class flags in addition to common class flags declared in [Flag.Class]. * JVM-specific class flags in addition to common class flags declared in [Flag.Class].
*/ */
@Deprecated("$prefix corresponding extensions on KmClass")
object Class { object Class {
/** /**
* Applied to an interface compiled with -Xjvm-default=all or all-compatibility. * Applied to an interface compiled with -Xjvm-default=all or all-compatibility.
@@ -43,6 +51,7 @@ object JvmFlag {
* class. * class.
*/ */
@JvmField @JvmField
@Deprecated("$prefix KmClass.hasMethodBodiesInInterface")
val HAS_METHOD_BODIES_IN_INTERFACE = booleanFlag(JF.IS_COMPILED_IN_JVM_DEFAULT_MODE) val HAS_METHOD_BODIES_IN_INTERFACE = booleanFlag(JF.IS_COMPILED_IN_JVM_DEFAULT_MODE)
/** /**
@@ -53,9 +62,10 @@ object JvmFlag {
* clients compiled without all-compatibility. * clients compiled without all-compatibility.
*/ */
@JvmField @JvmField
@Deprecated("$prefix KmProperty.isCompiledInCompatibilityMode")
val IS_COMPILED_IN_COMPATIBILITY_MODE = booleanFlag(JF.IS_COMPILED_IN_COMPATIBILITY_MODE) val IS_COMPILED_IN_COMPATIBILITY_MODE = booleanFlag(JF.IS_COMPILED_IN_COMPATIBILITY_MODE)
} }
internal fun booleanFlag(f: F.BooleanFlagField): Flag = internal fun booleanFlag(f: F.BooleanFlagField): Flag =
Flag(f.offset, f.bitWidth, 1) FlagImpl(f.offset, f.bitWidth, 1)
} }
@@ -36,9 +36,9 @@ internal class JvmClassExtension : JvmClassExtensionVisitor(), KmClassExtension
val localDelegatedProperties: MutableList<KmProperty> = ArrayList(0) val localDelegatedProperties: MutableList<KmProperty> = ArrayList(0)
var moduleName: String? = null var moduleName: String? = null
var anonymousObjectOriginName: String? = null var anonymousObjectOriginName: String? = null
var jvmFlags: Flags = 0 var jvmFlags: Int = 0
override fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor = override fun visitLocalDelegatedProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).also { localDelegatedProperties.add(it) } KmProperty(flags, name, getterFlags, setterFlags).also { localDelegatedProperties.add(it) }
override fun visitModuleName(name: String) { override fun visitModuleName(name: String) {
@@ -49,7 +49,7 @@ internal class JvmClassExtension : JvmClassExtensionVisitor(), KmClassExtension
this.anonymousObjectOriginName = internalName this.anonymousObjectOriginName = internalName
} }
override fun visitJvmFlags(flags: Flags) { override fun visitJvmFlags(flags: Int) {
this.jvmFlags = flags this.jvmFlags = flags
} }
@@ -70,7 +70,7 @@ internal class JvmPackageExtension : JvmPackageExtensionVisitor(), KmPackageExte
val localDelegatedProperties: MutableList<KmProperty> = ArrayList(0) val localDelegatedProperties: MutableList<KmProperty> = ArrayList(0)
var moduleName: String? = null var moduleName: String? = null
override fun visitLocalDelegatedProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor = override fun visitLocalDelegatedProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).also { localDelegatedProperties.add(it) } KmProperty(flags, name, getterFlags, setterFlags).also { localDelegatedProperties.add(it) }
override fun visitModuleName(name: String) { override fun visitModuleName(name: String) {
@@ -109,7 +109,7 @@ internal class JvmFunctionExtension : JvmFunctionExtensionVisitor(), KmFunctionE
} }
internal class JvmPropertyExtension : JvmPropertyExtensionVisitor(), KmPropertyExtension { internal class JvmPropertyExtension : JvmPropertyExtensionVisitor(), KmPropertyExtension {
var jvmFlags: Flags = 0 var jvmFlags: Int = 0
var fieldSignature: JvmFieldSignature? = null var fieldSignature: JvmFieldSignature? = null
var getterSignature: JvmMethodSignature? = null var getterSignature: JvmMethodSignature? = null
var setterSignature: JvmMethodSignature? = null var setterSignature: JvmMethodSignature? = null
@@ -117,7 +117,7 @@ internal class JvmPropertyExtension : JvmPropertyExtensionVisitor(), KmPropertyE
var syntheticMethodForDelegate: JvmMethodSignature? = null var syntheticMethodForDelegate: JvmMethodSignature? = null
override fun visit( override fun visit(
jvmFlags: Flags, jvmFlags: Int,
fieldSignature: JvmFieldSignature?, fieldSignature: JvmFieldSignature?,
getterSignature: JvmMethodSignature?, getterSignature: JvmMethodSignature?,
setterSignature: JvmMethodSignature? setterSignature: JvmMethodSignature?
@@ -127,7 +127,7 @@ internal class JvmMetadataExtensions : MetadataExtensions {
} }
override fun visitLocalDelegatedProperty( override fun visitLocalDelegatedProperty(
flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags flags: Int, name: String, getterFlags: Int, setterFlags: Int
): KmPropertyVisitor = writeProperty(c, flags, name, getterFlags, setterFlags) { ): KmPropertyVisitor = writeProperty(c, flags, name, getterFlags, setterFlags) {
proto.addExtension(JvmProtoBuf.classLocalVariable, it.build()) proto.addExtension(JvmProtoBuf.classLocalVariable, it.build())
} }
@@ -138,7 +138,7 @@ internal class JvmMetadataExtensions : MetadataExtensions {
} }
} }
override fun visitJvmFlags(flags: Flags) { override fun visitJvmFlags(flags: Int) {
if (flags != 0) { if (flags != 0) {
proto.setExtension(JvmProtoBuf.jvmClassFlags, flags) proto.setExtension(JvmProtoBuf.jvmClassFlags, flags)
} }
@@ -152,7 +152,7 @@ internal class JvmMetadataExtensions : MetadataExtensions {
if (type != JvmPackageExtensionVisitor.TYPE) return null if (type != JvmPackageExtensionVisitor.TYPE) return null
return object : JvmPackageExtensionVisitor() { return object : JvmPackageExtensionVisitor() {
override fun visitLocalDelegatedProperty( override fun visitLocalDelegatedProperty(
flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags flags: Int, name: String, getterFlags: Int, setterFlags: Int
): KmPropertyVisitor = writeProperty(c, flags, name, getterFlags, setterFlags) { ): KmPropertyVisitor = writeProperty(c, flags, name, getterFlags, setterFlags) {
proto.addExtension(JvmProtoBuf.packageLocalVariable, it.build()) proto.addExtension(JvmProtoBuf.packageLocalVariable, it.build())
} }
@@ -194,14 +194,14 @@ internal class JvmMetadataExtensions : MetadataExtensions {
): KmPropertyExtensionVisitor? { ): KmPropertyExtensionVisitor? {
if (type != JvmPropertyExtensionVisitor.TYPE) return null if (type != JvmPropertyExtensionVisitor.TYPE) return null
return object : JvmPropertyExtensionVisitor() { return object : JvmPropertyExtensionVisitor() {
private var jvmFlags: Flags = ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags) private var jvmFlags: Int = ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags)
private var signatureOrNull: JvmProtoBuf.JvmPropertySignature.Builder? = null private var signatureOrNull: JvmProtoBuf.JvmPropertySignature.Builder? = null
private val signature: JvmProtoBuf.JvmPropertySignature.Builder private val signature: JvmProtoBuf.JvmPropertySignature.Builder
get() = signatureOrNull ?: JvmProtoBuf.JvmPropertySignature.newBuilder().also { signatureOrNull = it } get() = signatureOrNull ?: JvmProtoBuf.JvmPropertySignature.newBuilder().also { signatureOrNull = it }
override fun visit( override fun visit(
jvmFlags: Flags, jvmFlags: Int,
fieldSignature: JvmFieldSignature?, fieldSignature: JvmFieldSignature?,
getterSignature: JvmMethodSignature?, getterSignature: JvmMethodSignature?,
setterSignature: JvmMethodSignature? setterSignature: JvmMethodSignature?
@@ -10,6 +10,7 @@ import org.junit.Test
import kotlin.reflect.KMutableProperty0 import kotlin.reflect.KMutableProperty0
import kotlin.test.* import kotlin.test.*
@Suppress("DEPRECATION")
class FlagDelegatesTest { class FlagDelegatesTest {
private class Private private class Private
@@ -47,7 +48,7 @@ class FlagDelegatesTest {
@Test @Test
fun testBooleanFlags() { fun testBooleanFlags() {
val klass = Public::class.java.readMetadataAsKmClass() val klass = Public::class.java.readMetadataAsKmClass()
fun doTest(prop: KMutableProperty0<Boolean>, flags: () -> Flags, rawFlag: Flag) { fun doTest(prop: KMutableProperty0<Boolean>, flags: () -> Int, rawFlag: Flag) {
assertFalse(prop.get()) assertFalse(prop.get())
assertFalse(rawFlag(flags())) assertFalse(rawFlag(flags()))
@@ -48,7 +48,7 @@ class MetadataSmokeTest {
val klass = KmClass().apply { val klass = KmClass().apply {
name = "Hello" name = "Hello"
flags = flagsOf(Flag.IS_PUBLIC) visibility = Visibility.PUBLIC
constructors += KmConstructor().apply { constructors += KmConstructor().apply {
visibility = Visibility.PUBLIC visibility = Visibility.PUBLIC
signature = JvmMethodSignature("<init>", "()V") signature = JvmMethodSignature("<init>", "()V")
@@ -56,7 +56,7 @@ class MetadataSmokeTest {
functions += KmFunction("hello").apply { functions += KmFunction("hello").apply {
visibility = Visibility.PUBLIC visibility = Visibility.PUBLIC
kind = MemberKind.DECLARATION kind = MemberKind.DECLARATION
returnType = KmType(flagsOf()).apply { returnType = KmType().apply {
classifier = KmClassifier.Class("kotlin/String") classifier = KmClassifier.Class("kotlin/String")
} }
signature = JvmMethodSignature("hello", "()Ljava/lang/String;") signature = JvmMethodSignature("hello", "()Ljava/lang/String;")
@@ -127,7 +127,7 @@ class MetadataSmokeTest {
class ClassNameReader : KmClassVisitor() { class ClassNameReader : KmClassVisitor() {
lateinit var className: ClassName lateinit var className: ClassName
override fun visit(flags: Flags, name: ClassName) { override fun visit(flags: Int, name: ClassName) {
className = name className = name
} }
} }
@@ -176,10 +176,10 @@ class MetadataSmokeTest {
KmClass().apply { KmClass().apply {
classWithStableParameterNames.accept( classWithStableParameterNames.accept(
object : KmClassVisitor(this) { object : KmClassVisitor(this) {
override fun visitConstructor(flags: Flags) = override fun visitConstructor(flags: Int) =
super.visitConstructor(flags + flagsOf(Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES)) super.visitConstructor(flags + flagsOf(Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES))
override fun visitFunction(flags: Flags, name: String) = override fun visitFunction(flags: Int, name: String) =
super.visitFunction(flags + flagsOf(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES), name) super.visitFunction(flags + flagsOf(Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES), name)
} }
) )
@@ -215,19 +215,19 @@ class MetadataSmokeTest {
// exist are controlled by compiler options, so we have to manually create metadata with the // exist are controlled by compiler options, so we have to manually create metadata with the
// flags set. Since the current flags only apply to interfaces with default functions we modify // flags set. Since the current flags only apply to interfaces with default functions we modify
// the metadata for the kotlin.coroutines.CoroutineContext interface. // the metadata for the kotlin.coroutines.CoroutineContext interface.
val jvmClassFlags: Flags = flagsOf(
JvmFlag.Class.IS_COMPILED_IN_COMPATIBILITY_MODE,
JvmFlag.Class.HAS_METHOD_BODIES_IN_INTERFACE
)
val metadata = CoroutineContext::class.java.getMetadata() val metadata = CoroutineContext::class.java.getMetadata()
val kmClass = metadata.readAsKmClass() val kmClass = metadata.readAsKmClass()
kmClass.jvmFlags = jvmClassFlags assertFalse(kmClass.isCompiledInCompatibilityMode)
assertFalse(kmClass.hasMethodBodiesInInterface)
kmClass.isCompiledInCompatibilityMode = true
kmClass.hasMethodBodiesInInterface = true
val kmClassCopy = KotlinClassMetadata val kmClassCopy = KotlinClassMetadata
.writeClass(kmClass, metadata.metadataVersion, metadata.extraInt) .writeClass(kmClass, metadata.metadataVersion, metadata.extraInt)
.readAsKmClass() .readAsKmClass()
assertEquals(kmClassCopy.jvmFlags, jvmClassFlags) assertTrue(kmClassCopy.isCompiledInCompatibilityMode)
assertTrue(kmClassCopy.hasMethodBodiesInInterface)
} }
@Test @Test
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:OptIn(ExperimentalStdlibApi::class) @file:Suppress("DEPRECATION")
@file:JvmName("Attributes") @file:JvmName("Attributes")
package kotlinx.metadata package kotlinx.metadata
@@ -54,6 +54,15 @@ var KmFunction.hasAnnotations by annotationsOn(KmFunction::flags)
*/ */
var KmProperty.hasAnnotations by annotationsOn(KmProperty::flags) var KmProperty.hasAnnotations by annotationsOn(KmProperty::flags)
/**
* Signifies that the corresponding property accessor has at least one annotation.
*
* This flag is useful for reading Kotlin metadata on JVM efficiently. On JVM, most of the annotations are written not to the Kotlin
* metadata, but directly on the corresponding declarations in the class file. This flag can be used as an optimization to avoid
* reading annotations from the class file (which can be slow) in case when a property accessor has no annotations.
*/
var KmPropertyAccessorAttributes.hasAnnotations by annotationsOn(KmPropertyAccessorAttributes::flags)
/** /**
* Signifies that the corresponding value parameter has at least one annotation. * Signifies that the corresponding value parameter has at least one annotation.
* *
@@ -293,30 +302,30 @@ var KmPropertyAccessorAttributes.isNotDefault: Boolean by propertyAccessorBoolea
/** /**
* Signifies that the corresponding property accessor is `external`. * Signifies that the corresponding property accessor is `external`.
*/ */
val KmPropertyAccessorAttributes.isExternal: Boolean by propertyAccessorBooleanFlag(Flag(ProtoFlags.IS_EXTERNAL_ACCESSOR)) var KmPropertyAccessorAttributes.isExternal: Boolean by propertyAccessorBooleanFlag(Flag(ProtoFlags.IS_EXTERNAL_ACCESSOR))
/** /**
* Signifies that the corresponding property accessor is `inline`. * Signifies that the corresponding property accessor is `inline`.
*/ */
val KmPropertyAccessorAttributes.isInline: Boolean by propertyAccessorBooleanFlag(Flag(ProtoFlags.IS_INLINE_ACCESSOR)) var KmPropertyAccessorAttributes.isInline: Boolean by propertyAccessorBooleanFlag(Flag(ProtoFlags.IS_INLINE_ACCESSOR))
// --- TYPE & TYPE_PARAM // --- TYPE & TYPE_PARAM
/** /**
* Signifies that the corresponding type is marked as nullable, i.e. has a question mark at the end of its notation. * Signifies that the corresponding type is marked as nullable, i.e. has a question mark at the end of its notation.
*/ */
var KmType.isNullable: Boolean by typeBooleanFlag(Flag(0, 1, 1)) var KmType.isNullable: Boolean by typeBooleanFlag(FlagImpl(0, 1, 1))
/** /**
* Signifies that the corresponding type is `suspend`. * Signifies that the corresponding type is `suspend`.
*/ */
var KmType.isSuspend: Boolean by typeBooleanFlag(Flag(ProtoFlags.SUSPEND_TYPE.offset + 1, ProtoFlags.SUSPEND_TYPE.bitWidth, 1)) var KmType.isSuspend: Boolean by typeBooleanFlag(FlagImpl(ProtoFlags.SUSPEND_TYPE.offset + 1, ProtoFlags.SUSPEND_TYPE.bitWidth, 1))
/** /**
* Signifies that the corresponding type is [definitely non-null](https://kotlinlang.org/docs/whatsnew17.html#stable-definitely-non-nullable-types). * Signifies that the corresponding type is [definitely non-null](https://kotlinlang.org/docs/whatsnew17.html#stable-definitely-non-nullable-types).
*/ */
var KmType.isDefinitelyNonNull: Boolean by typeBooleanFlag( var KmType.isDefinitelyNonNull: Boolean by typeBooleanFlag(
Flag( FlagImpl(
ProtoFlags.DEFINITELY_NOT_NULL_TYPE.offset + 1, ProtoFlags.DEFINITELY_NOT_NULL_TYPE.offset + 1,
ProtoFlags.DEFINITELY_NOT_NULL_TYPE.bitWidth, ProtoFlags.DEFINITELY_NOT_NULL_TYPE.bitWidth,
1 1
@@ -327,7 +336,7 @@ var KmType.isDefinitelyNonNull: Boolean by typeBooleanFlag(
/** /**
* Signifies that the corresponding type parameter is `reified`. * Signifies that the corresponding type parameter is `reified`.
*/ */
var KmTypeParameter.isReified: Boolean by BooleanFlagDelegate(KmTypeParameter::flags, Flag(0, 1, 1)) var KmTypeParameter.isReified: Boolean by BooleanFlagDelegate(KmTypeParameter::flags, FlagImpl(0, 1, 1))
// --- TYPE ALIAS --- // --- TYPE ALIAS ---
@@ -5,7 +5,7 @@
package kotlinx.metadata package kotlinx.metadata
import kotlinx.metadata.internal.IgnoreInApiDump import kotlinx.metadata.internal.FlagImpl
import org.jetbrains.kotlin.metadata.ProtoBuf.* import org.jetbrains.kotlin.metadata.ProtoBuf.*
import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ClassKind import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ClassKind
import org.jetbrains.kotlin.metadata.deserialization.Flags as F import org.jetbrains.kotlin.metadata.deserialization.Flags as F
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.metadata.ProtoBuf.Modality as ProtoModality
import org.jetbrains.kotlin.metadata.ProtoBuf.Visibility as ProtoVisibility import org.jetbrains.kotlin.metadata.ProtoBuf.Visibility as ProtoVisibility
import org.jetbrains.kotlin.metadata.ProtoBuf.MemberKind as ProtoMemberKind import org.jetbrains.kotlin.metadata.ProtoBuf.MemberKind as ProtoMemberKind
private const val prefix = "Flag API is deprecated. Please use"
/** /**
* Represents a boolean flag that is either present or not in a Kotlin declaration. A "flag" is a boolean trait that is either present * Represents a boolean flag that is either present or not in a Kotlin declaration. A "flag" is a boolean trait that is either present
* or not in a declaration. To check whether the flag is present in the bitmask, call [Flag.invoke] on the flag, passing the bitmask * or not in a declaration. To check whether the flag is present in the bitmask, call [Flag.invoke] on the flag, passing the bitmask
@@ -41,23 +43,17 @@ import org.jetbrains.kotlin.metadata.ProtoBuf.MemberKind as ProtoMemberKind
* @see Flags * @see Flags
* @see flagsOf * @see flagsOf
*/ */
class Flag(internal val offset: Int, internal val bitWidth: Int, internal val value: Int) { @Deprecated("$prefix corresponding extensions on Km nodes, such as KmClass.visibility")
@IgnoreInApiDump @Suppress("DEPRECATION")
internal constructor(field: F.FlagField<*>, value: Int) : this(field.offset, field.bitWidth, value) abstract class Flag internal constructor() {
@IgnoreInApiDump
internal constructor(field: F.BooleanFlagField) : this(field, 1)
internal operator fun plus(flags: Flags): Flags =
(flags and (((1 shl bitWidth) - 1) shl offset).inv()) + (value shl offset)
/** /**
* Checks whether the flag is present in the given bitmask. * Checks whether the flag is present in the given bitmask.
*/ */
operator fun invoke(flags: Flags): Boolean = abstract operator fun invoke(flags: Int): Boolean
(flags ushr offset) and ((1 shl bitWidth) - 1) == value
/** @suppress deprecated in another PR */ /** @suppress deprecated */
@Deprecated("$prefix corresponding extensions on Km nodes, such as KmClass.visibility")
companion object Common { companion object Common {
/** /**
* Signifies that the corresponding declaration has at least one annotation. * Signifies that the corresponding declaration has at least one annotation.
@@ -67,71 +63,82 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* reading annotations from the class file (which can be slow) in case when a declaration has no annotations. * reading annotations from the class file (which can be slow) in case when a declaration has no annotations.
*/ */
@JvmField @JvmField
val HAS_ANNOTATIONS = Flag(F.HAS_ANNOTATIONS) @Deprecated("$prefix corresponding extension on a node, e.g. KmClass.hasAnnotations")
val HAS_ANNOTATIONS: Flag = FlagImpl(F.HAS_ANNOTATIONS)
/** /**
* A visibility flag, signifying that the corresponding declaration is `internal`. * A visibility flag, signifying that the corresponding declaration is `internal`.
*/ */
@JvmField @JvmField
val IS_INTERNAL = Flag(F.VISIBILITY, ProtoVisibility.INTERNAL_VALUE) @Deprecated("$prefix visibility extension on a node, e.g. KmClass.visibility")
val IS_INTERNAL: Flag = FlagImpl(F.VISIBILITY, ProtoVisibility.INTERNAL_VALUE)
/** /**
* A visibility flag, signifying that the corresponding declaration is `private`. * A visibility flag, signifying that the corresponding declaration is `private`.
*/ */
@JvmField @JvmField
val IS_PRIVATE = Flag(F.VISIBILITY, ProtoVisibility.PRIVATE_VALUE) @Deprecated("$prefix visibility extension on a node, e.g. KmClass.visibility")
val IS_PRIVATE: Flag = FlagImpl(F.VISIBILITY, ProtoVisibility.PRIVATE_VALUE)
/** /**
* A visibility flag, signifying that the corresponding declaration is `protected`. * A visibility flag, signifying that the corresponding declaration is `protected`.
*/ */
@JvmField @JvmField
val IS_PROTECTED = Flag(F.VISIBILITY, ProtoVisibility.PROTECTED_VALUE) @Deprecated("$prefix visibility extension on a node, e.g. KmClass.visibility")
val IS_PROTECTED: Flag = FlagImpl(F.VISIBILITY, ProtoVisibility.PROTECTED_VALUE)
/** /**
* A visibility flag, signifying that the corresponding declaration is `public`. * A visibility flag, signifying that the corresponding declaration is `public`.
*/ */
@JvmField @JvmField
val IS_PUBLIC = Flag(F.VISIBILITY, ProtoVisibility.PUBLIC_VALUE) @Deprecated("$prefix visibility extension on a node, e.g. KmClass.visibility")
val IS_PUBLIC: Flag = FlagImpl(F.VISIBILITY, ProtoVisibility.PUBLIC_VALUE)
/** /**
* A visibility flag, signifying that the corresponding declaration is "private-to-this", which is a non-denotable visibility of * A visibility flag, signifying that the corresponding declaration is "private-to-this", which is a non-denotable visibility of
* private members in Kotlin which are callable only on the same instance of the declaring class. * private members in Kotlin which are callable only on the same instance of the declaring class.
*/ */
@JvmField @JvmField
val IS_PRIVATE_TO_THIS = Flag(F.VISIBILITY, ProtoVisibility.PRIVATE_TO_THIS_VALUE) @Deprecated("$prefix visibility extension on a node, e.g. KmClass.visibility")
val IS_PRIVATE_TO_THIS: Flag = FlagImpl(F.VISIBILITY, ProtoVisibility.PRIVATE_TO_THIS_VALUE)
/** /**
* A visibility flag, signifying that the corresponding declaration is local, i.e. declared inside a code block * A visibility flag, signifying that the corresponding declaration is local, i.e. declared inside a code block
* and not visible from the outside. * and not visible from the outside.
*/ */
@JvmField @JvmField
val IS_LOCAL = Flag(F.VISIBILITY, ProtoVisibility.LOCAL_VALUE) @Deprecated("$prefix visibility extension on a node, e.g. KmClass.visibility")
val IS_LOCAL: Flag = FlagImpl(F.VISIBILITY, ProtoVisibility.LOCAL_VALUE)
/** /**
* A modality flag, signifying that the corresponding declaration is `final`. * A modality flag, signifying that the corresponding declaration is `final`.
*/ */
@JvmField @JvmField
val IS_FINAL = Flag(F.MODALITY, ProtoModality.FINAL_VALUE) @Deprecated("$prefix modality extension on a node, e.g. KmClass.modality or KmFunction.modality")
val IS_FINAL: Flag = FlagImpl(F.MODALITY, ProtoModality.FINAL_VALUE)
/** /**
* A modality flag, signifying that the corresponding declaration is `open`. * A modality flag, signifying that the corresponding declaration is `open`.
*/ */
@JvmField @JvmField
val IS_OPEN = Flag(F.MODALITY, ProtoModality.OPEN_VALUE) @Deprecated("$prefix modality extension on a node, e.g. KmClass.modality or KmFunction.modality")
val IS_OPEN: Flag = FlagImpl(F.MODALITY, ProtoModality.OPEN_VALUE)
/** /**
* A modality flag, signifying that the corresponding declaration is `abstract`. * A modality flag, signifying that the corresponding declaration is `abstract`.
*/ */
@JvmField @JvmField
val IS_ABSTRACT = Flag(F.MODALITY, ProtoModality.ABSTRACT_VALUE) @Deprecated("$prefix modality extension on a node, e.g. KmClass.modality or KmFunction.modality")
val IS_ABSTRACT: Flag = FlagImpl(F.MODALITY, ProtoModality.ABSTRACT_VALUE)
/** /**
* A modality flag, signifying that the corresponding declaration is `sealed`. * A modality flag, signifying that the corresponding declaration is `sealed`.
*/ */
@JvmField @JvmField
val IS_SEALED = Flag(F.MODALITY, ProtoModality.SEALED_VALUE) @Deprecated("$prefix modality extension on a node, e.g. KmClass.modality")
val IS_SEALED: Flag = FlagImpl(F.MODALITY, ProtoModality.SEALED_VALUE)
} }
/** /**
@@ -141,73 +148,85 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* * class kind flags: [IS_CLASS], [IS_INTERFACE], [IS_ENUM_CLASS], [IS_ENUM_ENTRY], [IS_ANNOTATION_CLASS], [IS_OBJECT], * * class kind flags: [IS_CLASS], [IS_INTERFACE], [IS_ENUM_CLASS], [IS_ENUM_ENTRY], [IS_ANNOTATION_CLASS], [IS_OBJECT],
* [IS_COMPANION_OBJECT] * [IS_COMPANION_OBJECT]
*/ */
@Deprecated("$prefix corresponding extension on a KmClass")
object Class { object Class {
/** /**
* A class kind flag, signifying that the corresponding class is a usual `class`. * A class kind flag, signifying that the corresponding class is a usual `class`.
*/ */
@JvmField @JvmField
val IS_CLASS = Flag(F.CLASS_KIND, ClassKind.CLASS_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_CLASS: Flag = FlagImpl(F.CLASS_KIND, ClassKind.CLASS_VALUE)
/** /**
* A class kind flag, signifying that the corresponding class is an `interface`. * A class kind flag, signifying that the corresponding class is an `interface`.
*/ */
@JvmField @JvmField
val IS_INTERFACE = Flag(F.CLASS_KIND, ClassKind.INTERFACE_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_INTERFACE: Flag = FlagImpl(F.CLASS_KIND, ClassKind.INTERFACE_VALUE)
/** /**
* A class kind flag, signifying that the corresponding class is an `enum class`. * A class kind flag, signifying that the corresponding class is an `enum class`.
*/ */
@JvmField @JvmField
val IS_ENUM_CLASS = Flag(F.CLASS_KIND, ClassKind.ENUM_CLASS_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_ENUM_CLASS: Flag = FlagImpl(F.CLASS_KIND, ClassKind.ENUM_CLASS_VALUE)
/** /**
* A class kind flag, signifying that the corresponding class is an enum entry. * A class kind flag, signifying that the corresponding class is an enum entry.
*/ */
@JvmField @JvmField
val IS_ENUM_ENTRY = Flag(F.CLASS_KIND, ClassKind.ENUM_ENTRY_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_ENUM_ENTRY: Flag = FlagImpl(F.CLASS_KIND, ClassKind.ENUM_ENTRY_VALUE)
/** /**
* A class kind flag, signifying that the corresponding class is an `annotation class`. * A class kind flag, signifying that the corresponding class is an `annotation class`.
*/ */
@JvmField @JvmField
val IS_ANNOTATION_CLASS = Flag(F.CLASS_KIND, ClassKind.ANNOTATION_CLASS_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_ANNOTATION_CLASS: Flag = FlagImpl(F.CLASS_KIND, ClassKind.ANNOTATION_CLASS_VALUE)
/** /**
* A class kind flag, signifying that the corresponding class is a non-companion `object`. * A class kind flag, signifying that the corresponding class is a non-companion `object`.
*/ */
@JvmField @JvmField
val IS_OBJECT = Flag(F.CLASS_KIND, ClassKind.OBJECT_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_OBJECT: Flag = FlagImpl(F.CLASS_KIND, ClassKind.OBJECT_VALUE)
/** /**
* A class kind flag, signifying that the corresponding class is a `companion object`. * A class kind flag, signifying that the corresponding class is a `companion object`.
*/ */
@JvmField @JvmField
val IS_COMPANION_OBJECT = Flag(F.CLASS_KIND, ClassKind.COMPANION_OBJECT_VALUE) @Deprecated("$prefix KmClass.kind")
val IS_COMPANION_OBJECT: Flag = FlagImpl(F.CLASS_KIND, ClassKind.COMPANION_OBJECT_VALUE)
/** /**
* Signifies that the corresponding class is `inner`. * Signifies that the corresponding class is `inner`.
*/ */
@JvmField @JvmField
val IS_INNER = Flag(F.IS_INNER) @Deprecated("$prefix KmClass.isInner")
val IS_INNER: Flag = FlagImpl(F.IS_INNER)
/** /**
* Signifies that the corresponding class is `data`. * Signifies that the corresponding class is `data`.
*/ */
@JvmField @JvmField
val IS_DATA = Flag(F.IS_DATA) @Deprecated("$prefix KmClass.isData")
val IS_DATA: Flag = FlagImpl(F.IS_DATA)
/** /**
* Signifies that the corresponding class is `external`. * Signifies that the corresponding class is `external`.
*/ */
@JvmField @JvmField
val IS_EXTERNAL = Flag(F.IS_EXTERNAL_CLASS) @Deprecated("$prefix KmClass.isExternal")
val IS_EXTERNAL: Flag = FlagImpl(F.IS_EXTERNAL_CLASS)
/** /**
* Signifies that the corresponding class is `expect`. * Signifies that the corresponding class is `expect`.
*/ */
@JvmField @JvmField
val IS_EXPECT = Flag(F.IS_EXPECT_CLASS) @Deprecated("$prefix KmClass.isExpect")
val IS_EXPECT: Flag = FlagImpl(F.IS_EXPECT_CLASS)
@JvmField @JvmField
@Deprecated( @Deprecated(
@@ -215,26 +234,29 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
level = DeprecationLevel.ERROR level = DeprecationLevel.ERROR
) )
@Suppress("unused") @Suppress("unused")
val IS_INLINE = Flag(F.IS_VALUE_CLASS) val IS_INLINE: Flag = FlagImpl(F.IS_VALUE_CLASS)
/** /**
* Signifies that the corresponding class is either a pre-Kotlin-1.5 `inline` class, or a 1.5+ `value` class. * Signifies that the corresponding class is either a pre-Kotlin-1.5 `inline` class, or a 1.5+ `value` class.
*/ */
@JvmField @JvmField
val IS_VALUE = Flag(F.IS_VALUE_CLASS) @Deprecated("$prefix KmClass.isValue")
val IS_VALUE: Flag = FlagImpl(F.IS_VALUE_CLASS)
/** /**
* Signifies that the corresponding class is a functional interface, i.e. marked with the keyword `fun`. * Signifies that the corresponding class is a functional interface, i.e. marked with the keyword `fun`.
*/ */
@JvmField @JvmField
val IS_FUN = Flag(F.IS_FUN_INTERFACE) @Deprecated("$prefix KmClass.isFun")
val IS_FUN: Flag = FlagImpl(F.IS_FUN_INTERFACE)
/** /**
* Signifies that the corresponding enum class has ".entries" property in bytecode. * Signifies that the corresponding enum class has ".entries" property in bytecode.
* Always `false` for not enum classes. * Always `false` for not enum classes.
*/ */
@JvmField @JvmField
val HAS_ENUM_ENTRIES = Flag(F.HAS_ENUM_ENTRIES) @Deprecated("$prefix KmClass.hasEnumEntries")
val HAS_ENUM_ENTRIES: Flag = FlagImpl(F.HAS_ENUM_ENTRIES)
} }
/** /**
@@ -244,19 +266,21 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
@JvmField @JvmField
@Deprecated("Use IS_SECONDARY which holds inverted value instead.", level = DeprecationLevel.ERROR) @Deprecated("Use IS_SECONDARY which holds inverted value instead.", level = DeprecationLevel.ERROR)
@Suppress("unused") @Suppress("unused")
val IS_PRIMARY = Flag(F.IS_SECONDARY, 0) val IS_PRIMARY: Flag = FlagImpl(F.IS_SECONDARY, 0)
/** /**
* Signifies that the corresponding constructor is secondary, i.e. declared not in the class header, but in the class body. * Signifies that the corresponding constructor is secondary, i.e. declared not in the class header, but in the class body.
*/ */
@JvmField @JvmField
val IS_SECONDARY = Flag(F.IS_SECONDARY) @Deprecated("$prefix KmConstructor.isSecondary")
val IS_SECONDARY: Flag = FlagImpl(F.IS_SECONDARY)
/** /**
* Signifies that the corresponding constructor has non-stable parameter names, i.e. cannot be called with named arguments. * Signifies that the corresponding constructor has non-stable parameter names, i.e. cannot be called with named arguments.
*/ */
@JvmField @JvmField
val HAS_NON_STABLE_PARAMETER_NAMES = Flag(F.IS_CONSTRUCTOR_WITH_NON_STABLE_PARAMETER_NAMES) @Deprecated("$prefix KmConstructor.hasNonStableParameterNames")
val HAS_NON_STABLE_PARAMETER_NAMES: Flag = FlagImpl(F.IS_CONSTRUCTOR_WITH_NON_STABLE_PARAMETER_NAMES)
} }
/** /**
@@ -270,77 +294,88 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* A member kind flag, signifying that the corresponding function is explicitly declared in the containing class. * A member kind flag, signifying that the corresponding function is explicitly declared in the containing class.
*/ */
@JvmField @JvmField
val IS_DECLARATION = Flag(F.MEMBER_KIND, ProtoMemberKind.DECLARATION_VALUE) @Deprecated("$prefix KmFunction.kind")
val IS_DECLARATION: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.DECLARATION_VALUE)
/** /**
* A member kind flag, signifying that the corresponding function exists in the containing class because a function with a suitable * A member kind flag, signifying that the corresponding function exists in the containing class because a function with a suitable
* signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified. * signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified.
*/ */
@JvmField @JvmField
val IS_FAKE_OVERRIDE = Flag(F.MEMBER_KIND, ProtoMemberKind.FAKE_OVERRIDE_VALUE) @Deprecated("$prefix KmFunction.kind")
val IS_FAKE_OVERRIDE: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.FAKE_OVERRIDE_VALUE)
/** /**
* A member kind flag, signifying that the corresponding function exists in the containing class because it has been produced * A member kind flag, signifying that the corresponding function exists in the containing class because it has been produced
* by interface delegation (delegation "by"). * by interface delegation (delegation "by").
*/ */
@JvmField @JvmField
val IS_DELEGATION = Flag(F.MEMBER_KIND, ProtoMemberKind.DELEGATION_VALUE) @Deprecated("$prefix KmFunction.kind")
val IS_DELEGATION: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.DELEGATION_VALUE)
/** /**
* A member kind flag, signifying that the corresponding function exists in the containing class because it has been synthesized * A member kind flag, signifying that the corresponding function exists in the containing class because it has been synthesized
* by the compiler and has no declaration in the source code. * by the compiler and has no declaration in the source code.
*/ */
@JvmField @JvmField
val IS_SYNTHESIZED = Flag(F.MEMBER_KIND, ProtoMemberKind.SYNTHESIZED_VALUE) @Deprecated("$prefix KmFunction.kind")
val IS_SYNTHESIZED: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.SYNTHESIZED_VALUE)
/** /**
* Signifies that the corresponding function is `operator`. * Signifies that the corresponding function is `operator`.
*/ */
@JvmField @JvmField
val IS_OPERATOR = Flag(F.IS_OPERATOR) @Deprecated("$prefix KmFunction.isOperator")
val IS_OPERATOR: Flag = FlagImpl(F.IS_OPERATOR)
/** /**
* Signifies that the corresponding function is `infix`. * Signifies that the corresponding function is `infix`.
*/ */
@JvmField @JvmField
val IS_INFIX = Flag(F.IS_INFIX) @Deprecated("$prefix KmFunction.isInfix")
val IS_INFIX: Flag = FlagImpl(F.IS_INFIX)
/** /**
* Signifies that the corresponding function is `inline`. * Signifies that the corresponding function is `inline`.
*/ */
@JvmField @JvmField
val IS_INLINE = Flag(F.IS_INLINE) @Deprecated("$prefix KmFunction.isInline")
val IS_INLINE: Flag = FlagImpl(F.IS_INLINE)
/** /**
* Signifies that the corresponding function is `tailrec`. * Signifies that the corresponding function is `tailrec`.
*/ */
@JvmField @JvmField
val IS_TAILREC = Flag(F.IS_TAILREC) @Deprecated("$prefix KmFunction.isTailrec")
val IS_TAILREC: Flag = FlagImpl(F.IS_TAILREC)
/** /**
* Signifies that the corresponding function is `external`. * Signifies that the corresponding function is `external`.
*/ */
@JvmField @JvmField
val IS_EXTERNAL = Flag(F.IS_EXTERNAL_FUNCTION) @Deprecated("$prefix KmFunction.isExternalFunction")
val IS_EXTERNAL: Flag = FlagImpl(F.IS_EXTERNAL_FUNCTION)
/** /**
* Signifies that the corresponding function is `suspend`. * Signifies that the corresponding function is `suspend`.
*/ */
@JvmField @JvmField
val IS_SUSPEND = Flag(F.IS_SUSPEND) @Deprecated("$prefix KmFunction.isSuspend")
val IS_SUSPEND: Flag = FlagImpl(F.IS_SUSPEND)
/** /**
* Signifies that the corresponding function is `expect`. * Signifies that the corresponding function is `expect`.
*/ */
@JvmField @JvmField
val IS_EXPECT = Flag(F.IS_EXPECT_FUNCTION) @Deprecated("$prefix KmFunction.isExpectFunction")
val IS_EXPECT: Flag = FlagImpl(F.IS_EXPECT_FUNCTION)
/** /**
* Signifies that the corresponding function has non-stable parameter names, i.e. cannot be called with named arguments. * Signifies that the corresponding function has non-stable parameter names, i.e. cannot be called with named arguments.
*/ */
@JvmField @JvmField
val HAS_NON_STABLE_PARAMETER_NAMES = Flag(F.IS_FUNCTION_WITH_NON_STABLE_PARAMETER_NAMES) @Deprecated("$prefix KmFunction.isFunctionWithNonStableParameterNames")
val HAS_NON_STABLE_PARAMETER_NAMES: Flag = FlagImpl(F.IS_FUNCTION_WITH_NON_STABLE_PARAMETER_NAMES)
} }
/** /**
@@ -354,59 +389,67 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* A member kind flag, signifying that the corresponding property is explicitly declared in the containing class. * A member kind flag, signifying that the corresponding property is explicitly declared in the containing class.
*/ */
@JvmField @JvmField
val IS_DECLARATION = Flag(F.MEMBER_KIND, ProtoMemberKind.DECLARATION_VALUE) @Deprecated("$prefix KmProperty.kind")
val IS_DECLARATION: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.DECLARATION_VALUE)
/** /**
* A member kind flag, signifying that the corresponding property exists in the containing class because a property with a suitable * A member kind flag, signifying that the corresponding property exists in the containing class because a property with a suitable
* signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified. * signature exists in a supertype. This flag is not written by the Kotlin compiler and its effects are unspecified.
*/ */
@JvmField @JvmField
val IS_FAKE_OVERRIDE = Flag(F.MEMBER_KIND, ProtoMemberKind.FAKE_OVERRIDE_VALUE) @Deprecated("$prefix KmProperty.kind")
val IS_FAKE_OVERRIDE: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.FAKE_OVERRIDE_VALUE)
/** /**
* A member kind flag, signifying that the corresponding property exists in the containing class because it has been produced * A member kind flag, signifying that the corresponding property exists in the containing class because it has been produced
* by interface delegation (delegation "by"). * by interface delegation (delegation "by").
*/ */
@JvmField @JvmField
val IS_DELEGATION = Flag(F.MEMBER_KIND, ProtoMemberKind.DELEGATION_VALUE) @Deprecated("$prefix KmProperty.kind")
val IS_DELEGATION: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.DELEGATION_VALUE)
/** /**
* A member kind flag, signifying that the corresponding property exists in the containing class because it has been synthesized * A member kind flag, signifying that the corresponding property exists in the containing class because it has been synthesized
* by the compiler and has no declaration in the source code. * by the compiler and has no declaration in the source code.
*/ */
@JvmField @JvmField
val IS_SYNTHESIZED = Flag(F.MEMBER_KIND, ProtoMemberKind.SYNTHESIZED_VALUE) @Deprecated("$prefix KmProperty.kind")
val IS_SYNTHESIZED: Flag = FlagImpl(F.MEMBER_KIND, ProtoMemberKind.SYNTHESIZED_VALUE)
/** /**
* Signifies that the corresponding property is `var`. * Signifies that the corresponding property is `var`.
*/ */
@JvmField @JvmField
val IS_VAR = Flag(F.IS_VAR) @Deprecated("$prefix KmProperty.isVar")
val IS_VAR: Flag = FlagImpl(F.IS_VAR)
/** /**
* Signifies that the corresponding property has a getter. * Signifies that the corresponding property has a getter.
*/ */
@JvmField @JvmField
val HAS_GETTER = Flag(F.HAS_GETTER) @Deprecated("$prefix KmProperty.hasGetter")
val HAS_GETTER: Flag = FlagImpl(F.HAS_GETTER)
/** /**
* Signifies that the corresponding property has a setter. * Signifies that the corresponding property has a setter.
*/ */
@JvmField @JvmField
val HAS_SETTER = Flag(F.HAS_SETTER) @Deprecated("$prefix KmProperty.hasSetter")
val HAS_SETTER: Flag = FlagImpl(F.HAS_SETTER)
/** /**
* Signifies that the corresponding property is `const`. * Signifies that the corresponding property is `const`.
*/ */
@JvmField @JvmField
val IS_CONST = Flag(F.IS_CONST) @Deprecated("$prefix KmProperty.isConst")
val IS_CONST: Flag = FlagImpl(F.IS_CONST)
/** /**
* Signifies that the corresponding property is `lateinit`. * Signifies that the corresponding property is `lateinit`.
*/ */
@JvmField @JvmField
val IS_LATEINIT = Flag(F.IS_LATEINIT) @Deprecated("$prefix KmProperty.isLateinit")
val IS_LATEINIT: Flag = FlagImpl(F.IS_LATEINIT)
/** /**
* Signifies that the corresponding property has a constant value. On JVM, this flag allows an optimization similarly to * Signifies that the corresponding property has a constant value. On JVM, this flag allows an optimization similarly to
@@ -414,27 +457,32 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* reading the value from the bytecode in case there isn't one. * reading the value from the bytecode in case there isn't one.
*/ */
@JvmField @JvmField
val HAS_CONSTANT = Flag(F.HAS_CONSTANT) @Deprecated("$prefix KmProperty.hasConstant")
val HAS_CONSTANT: Flag = FlagImpl(F.HAS_CONSTANT)
/** /**
* Signifies that the corresponding property is `external`. * Signifies that the corresponding property is `external`.
*/ */
@JvmField @JvmField
val IS_EXTERNAL = Flag(F.IS_EXTERNAL_PROPERTY) @Deprecated("$prefix KmProperty.isExternal")
val IS_EXTERNAL: Flag = FlagImpl(F.IS_EXTERNAL_PROPERTY)
/** /**
* Signifies that the corresponding property is a delegated property. * Signifies that the corresponding property is a delegated property.
*/ */
@JvmField @JvmField
val IS_DELEGATED = Flag(F.IS_DELEGATED) @Deprecated("$prefix KmProperty.isDelegated")
val IS_DELEGATED: Flag = FlagImpl(F.IS_DELEGATED)
/** /**
* Signifies that the corresponding property is `expect`. * Signifies that the corresponding property is `expect`.
*/ */
@JvmField @JvmField
val IS_EXPECT = Flag(F.IS_EXPECT_PROPERTY) @Deprecated("$prefix KmProperty.isExpect")
val IS_EXPECT: Flag = FlagImpl(F.IS_EXPECT_PROPERTY)
} }
/** /**
* A container of flags applicable to Kotlin property getters and setters. * A container of flags applicable to Kotlin property getters and setters.
*/ */
@@ -443,19 +491,22 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* Signifies that the corresponding property accessor is not default, i.e. it has a body and/or annotations in the source code. * Signifies that the corresponding property accessor is not default, i.e. it has a body and/or annotations in the source code.
*/ */
@JvmField @JvmField
val IS_NOT_DEFAULT = Flag(F.IS_NOT_DEFAULT) @Deprecated("$prefix KmPropertyAccessorAttributes.isNotDefault")
val IS_NOT_DEFAULT: Flag = FlagImpl(F.IS_NOT_DEFAULT)
/** /**
* Signifies that the corresponding property accessor is `external`. * Signifies that the corresponding property accessor is `external`.
*/ */
@JvmField @JvmField
val IS_EXTERNAL = Flag(F.IS_EXTERNAL_ACCESSOR) @Deprecated("$prefix KmPropertyAccessorAttributes.isExternal")
val IS_EXTERNAL: Flag = FlagImpl(F.IS_EXTERNAL_ACCESSOR)
/** /**
* Signifies that the corresponding property accessor is `inline`. * Signifies that the corresponding property accessor is `inline`.
*/ */
@JvmField @JvmField
val IS_INLINE = Flag(F.IS_INLINE_ACCESSOR) @Deprecated("$prefix KmPropertyAccessorAttributes.isInline")
val IS_INLINE: Flag = FlagImpl(F.IS_INLINE_ACCESSOR)
} }
/** /**
@@ -466,20 +517,23 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* Signifies that the corresponding type is marked as nullable, i.e. has a question mark at the end of its notation. * Signifies that the corresponding type is marked as nullable, i.e. has a question mark at the end of its notation.
*/ */
@JvmField @JvmField
val IS_NULLABLE = Flag(0, 1, 1) @Deprecated("$prefix KmType.isNullable")
val IS_NULLABLE: Flag = FlagImpl(0, 1, 1)
/** /**
* Signifies that the corresponding type is `suspend`. * Signifies that the corresponding type is `suspend`.
*/ */
@JvmField @JvmField
val IS_SUSPEND = Flag(F.SUSPEND_TYPE.offset + 1, F.SUSPEND_TYPE.bitWidth, 1) @Deprecated("$prefix KmType.isSuspend")
val IS_SUSPEND: Flag = FlagImpl(F.SUSPEND_TYPE.offset + 1, F.SUSPEND_TYPE.bitWidth, 1)
/** /**
* Signifies that the corresponding type is * Signifies that the corresponding type is
* [definitely non-null](https://kotlinlang.org/docs/whatsnew17.html#stable-definitely-non-nullable-types). * [definitely non-null](https://kotlinlang.org/docs/whatsnew17.html#stable-definitely-non-nullable-types).
*/ */
@JvmField @JvmField
val IS_DEFINITELY_NON_NULL = Flag(F.DEFINITELY_NOT_NULL_TYPE.offset + 1, F.DEFINITELY_NOT_NULL_TYPE.bitWidth, 1) @Deprecated("$prefix KmType.isDefinitelyNonNull")
val IS_DEFINITELY_NON_NULL: Flag = FlagImpl(F.DEFINITELY_NOT_NULL_TYPE.offset + 1, F.DEFINITELY_NOT_NULL_TYPE.bitWidth, 1)
} }
/** /**
@@ -490,7 +544,8 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* Signifies that the corresponding type parameter is `reified`. * Signifies that the corresponding type parameter is `reified`.
*/ */
@JvmField @JvmField
val IS_REIFIED = Flag(0, 1, 1) @Deprecated("$prefix KmTypeParameter.isReified")
val IS_REIFIED: Flag = FlagImpl(0, 1, 1)
} }
/** /**
@@ -504,19 +559,22 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* still optional at the call site because the default value from the base method is used. * still optional at the call site because the default value from the base method is used.
*/ */
@JvmField @JvmField
val DECLARES_DEFAULT_VALUE = Flag(F.DECLARES_DEFAULT_VALUE) @Deprecated("$prefix KmValueParameter.declaresDefaultValue")
val DECLARES_DEFAULT_VALUE: Flag = FlagImpl(F.DECLARES_DEFAULT_VALUE)
/** /**
* Signifies that the corresponding value parameter is `crossinline`. * Signifies that the corresponding value parameter is `crossinline`.
*/ */
@JvmField @JvmField
val IS_CROSSINLINE = Flag(F.IS_CROSSINLINE) @Deprecated("$prefix KmValueParameter.isCrossinline")
val IS_CROSSINLINE: Flag = FlagImpl(F.IS_CROSSINLINE)
/** /**
* Signifies that the corresponding value parameter is `noinline`. * Signifies that the corresponding value parameter is `noinline`.
*/ */
@JvmField @JvmField
val IS_NOINLINE = Flag(F.IS_NOINLINE) @Deprecated("$prefix KmValueParameter.isNoinline")
val IS_NOINLINE: Flag = FlagImpl(F.IS_NOINLINE)
} }
/** /**
@@ -530,12 +588,14 @@ class Flag(internal val offset: Int, internal val bitWidth: Int, internal val va
* Signifies that the corresponding effect expression should be negated to compute the proposition or the conclusion of an effect. * Signifies that the corresponding effect expression should be negated to compute the proposition or the conclusion of an effect.
*/ */
@JvmField @JvmField
val IS_NEGATED = Flag(F.IS_NEGATED) @Deprecated("$prefix KmEffectExpression.isNegated")
val IS_NEGATED: Flag = FlagImpl(F.IS_NEGATED)
/** /**
* Signifies that the corresponding effect expression checks whether a value of some variable is `null`. * Signifies that the corresponding effect expression checks whether a value of some variable is `null`.
*/ */
@JvmField @JvmField
val IS_NULL_CHECK_PREDICATE = Flag(F.IS_NULL_CHECK_PREDICATE) @Deprecated("$prefix KmEffectExpression.isNullCheckPredicate")
val IS_NULL_CHECK_PREDICATE: Flag = FlagImpl(F.IS_NULL_CHECK_PREDICATE)
} }
} }
@@ -7,11 +7,17 @@
package kotlinx.metadata package kotlinx.metadata
import kotlinx.metadata.internal.FlagImpl
/** /**
* Declaration flags are represented as bitmasks of this type. * Declaration flags are represented as bitmasks of this type.
* *
* @see Flag * @see Flag
*/ */
@Deprecated(
"Flags API is deprecated and this typealias will be removed. Use Int directly and then migrate to corresponding Km nodes extensions, e.g. KmClass.visibility",
ReplaceWith("Int")
)
typealias Flags = Int typealias Flags = Int
/** /**
@@ -21,5 +27,9 @@ typealias Flags = Int
* hold the value of the latest flag. For example, `flagsOf(Flag.IS_PRIVATE, Flag.IS_PUBLIC, Flag.IS_INTERNAL)` is the same as * hold the value of the latest flag. For example, `flagsOf(Flag.IS_PRIVATE, Flag.IS_PUBLIC, Flag.IS_INTERNAL)` is the same as
* `flagsOf(Flag.IS_INTERNAL)`. * `flagsOf(Flag.IS_INTERNAL)`.
*/ */
fun flagsOf(vararg flags: Flag): Flags = @Suppress("DEPRECATION")
flags.fold(0) { acc, flag -> flag + acc } @Deprecated(
"Flags API is deprecated and this function will be removed. Create Km nodes directly and then use corresponding Km nodes extensions, e.g. KmClass.visibility",
)
fun flagsOf(vararg flags: Flag): Int =
flags.fold(0) { acc, flag -> (flag as FlagImpl) + acc }
@@ -5,6 +5,7 @@
package kotlinx.metadata package kotlinx.metadata
import kotlinx.metadata.internal.Flag
import org.jetbrains.kotlin.metadata.deserialization.Flags as ProtoFlags import org.jetbrains.kotlin.metadata.deserialization.Flags as ProtoFlags
import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ProtoClassKind import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ProtoClassKind
import org.jetbrains.kotlin.metadata.ProtoBuf.Visibility as ProtoVisibility import org.jetbrains.kotlin.metadata.ProtoBuf.Visibility as ProtoVisibility
@@ -39,7 +39,8 @@ class KmClass : KmClassVisitor(), KmDeclarationContainer {
/** /**
* Class flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Class] flags. * Class flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Class] flags.
*/ */
var flags: Flags = flagsOf() @Deprecated("$flagAccessPrefix KmClass, such as KmClass.visibility")
var flags: Int = 0
/** /**
* Name of the class. * Name of the class.
@@ -121,33 +122,33 @@ class KmClass : KmClassVisitor(), KmDeclarationContainer {
MetadataExtensions.INSTANCES.map(MetadataExtensions::createClassExtension) MetadataExtensions.INSTANCES.map(MetadataExtensions::createClassExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visit(flags: Flags, name: ClassName) { override fun visit(flags: Int, name: ClassName) {
this.flags = flags this.flags = flags
this.name = name this.name = name
} }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters) KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitSupertype(flags: Flags): KmTypeVisitor = override fun visitSupertype(flags: Int): KmTypeVisitor =
KmType(flags).addTo(supertypes) KmType(flags).addTo(supertypes)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor = override fun visitFunction(flags: Int, name: String): KmFunctionVisitor =
KmFunction(flags, name).addTo(functions) KmFunction(flags, name).addTo(functions)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor = override fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).addTo(properties) KmProperty(flags, name, getterFlags, setterFlags).addTo(properties)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor = override fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor =
KmTypeAlias(flags, name).addTo(typeAliases) KmTypeAlias(flags, name).addTo(typeAliases)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitConstructor(flags: Flags): KmConstructorVisitor = override fun visitConstructor(flags: Int): KmConstructorVisitor =
KmConstructor(flags).addTo(constructors) KmConstructor(flags).addTo(constructors)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -176,12 +177,12 @@ class KmClass : KmClassVisitor(), KmDeclarationContainer {
} }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitInlineClassUnderlyingType(flags: Flags): KmTypeVisitor = override fun visitInlineClassUnderlyingType(flags: Int): KmTypeVisitor =
KmType(flags).also { inlineClassUnderlyingType = it } KmType(flags).also { inlineClassUnderlyingType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@ExperimentalContextReceivers @ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor = override fun visitContextReceiverType(flags: Int): KmTypeVisitor =
KmType(flags).addTo(contextReceiverTypes) KmType(flags).addTo(contextReceiverTypes)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -246,15 +247,15 @@ class KmPackage : KmPackageVisitor(), KmDeclarationContainer {
MetadataExtensions.INSTANCES.map(MetadataExtensions::createPackageExtension) MetadataExtensions.INSTANCES.map(MetadataExtensions::createPackageExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor = override fun visitFunction(flags: Int, name: String): KmFunctionVisitor =
KmFunction(flags, name).addTo(functions) KmFunction(flags, name).addTo(functions)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor = override fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor =
KmProperty(flags, name, getterFlags, setterFlags).addTo(properties) KmProperty(flags, name, getterFlags, setterFlags).addTo(properties)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor = override fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor =
KmTypeAlias(flags, name).addTo(typeAliases) KmTypeAlias(flags, name).addTo(typeAliases)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -287,7 +288,7 @@ class KmLambda : KmLambdaVisitor() {
lateinit var function: KmFunction lateinit var function: KmFunction
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor = override fun visitFunction(flags: Int, name: String): KmFunctionVisitor =
KmFunction(flags, name).also { function = it } KmFunction(flags, name).also { function = it }
/** /**
@@ -308,7 +309,9 @@ class KmLambda : KmLambdaVisitor() {
* @property flags constructor flags, consisting of [Flag.HAS_ANNOTATIONS], a visibility flag and [Flag.Constructor] flags * @property flags constructor flags, consisting of [Flag.HAS_ANNOTATIONS], a visibility flag and [Flag.Constructor] flags
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmConstructor @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(var flags: Flags) : class KmConstructor @Deprecated(flagsCtorDeprecated) constructor(
@Deprecated("$flagAccessPrefix KmConstructor, such as KmConstructor.visibility") var flags: Int,
) :
KmConstructorVisitor() { KmConstructorVisitor() {
constructor() : this(0) constructor() : this(0)
@@ -326,7 +329,7 @@ class KmConstructor @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(var flags: Fl
MetadataExtensions.INSTANCES.map(MetadataExtensions::createConstructorExtension) MetadataExtensions.INSTANCES.map(MetadataExtensions::createConstructorExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor = override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor =
KmValueParameter(flags, name).addTo(valueParameters) KmValueParameter(flags, name).addTo(valueParameters)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -358,8 +361,8 @@ class KmConstructor @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(var flags: Fl
* @property name the name of the function * @property name the name of the function
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmFunction @Deprecated(FLAGS_CTOR_DEPRECATED) constructor( class KmFunction @Deprecated(flagsCtorDeprecated) constructor(
var flags: Flags, @Deprecated("$flagAccessPrefix KmFunction, such as KmFunction.visibility") var flags: Int,
var name: String, var name: String,
) : KmFunctionVisitor() { ) : KmFunctionVisitor() {
@@ -406,24 +409,24 @@ class KmFunction @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
MetadataExtensions.INSTANCES.map(MetadataExtensions::createFunctionExtension) MetadataExtensions.INSTANCES.map(MetadataExtensions::createFunctionExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters) KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor = override fun visitReceiverParameterType(flags: Int): KmTypeVisitor =
KmType(flags).also { receiverParameterType = it } KmType(flags).also { receiverParameterType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@ExperimentalContextReceivers @ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor = override fun visitContextReceiverType(flags: Int): KmTypeVisitor =
KmType(flags).addTo(contextReceiverTypes) KmType(flags).addTo(contextReceiverTypes)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor = override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor =
KmValueParameter(flags, name).addTo(valueParameters) KmValueParameter(flags, name).addTo(valueParameters)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitReturnType(flags: Flags): KmTypeVisitor = override fun visitReturnType(flags: Int): KmTypeVisitor =
KmType(flags).also { returnType = it } KmType(flags).also { returnType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -464,7 +467,7 @@ class KmFunction @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* Does not contain meaningful information except attributes, such as visibility and modality. * Does not contain meaningful information except attributes, such as visibility and modality.
* Attributes can be read and written using extension functions, e.g. [KmPropertyAccessorAttributes.visibility] or [KmPropertyAccessorAttributes.isNotDefault]. * Attributes can be read and written using extension functions, e.g. [KmPropertyAccessorAttributes.visibility] or [KmPropertyAccessorAttributes.isNotDefault].
*/ */
public class KmPropertyAccessorAttributes internal constructor(internal var flags: Flags) { public class KmPropertyAccessorAttributes internal constructor(internal var flags: Int) {
public constructor() : this(0) public constructor() : this(0)
} }
@@ -475,11 +478,11 @@ public class KmPropertyAccessorAttributes internal constructor(internal var flag
* @property name the name of the property * @property name the name of the property
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmProperty @Deprecated(FLAGS_CTOR_DEPRECATED) constructor( class KmProperty @Deprecated(flagsCtorDeprecated) constructor(
var flags: Flags, @Deprecated("$flagAccessPrefix KmProperty, such as KmProperty.visibility") var flags: Int,
var name: String, var name: String,
getterFlags: Flags, getterFlags: Int,
setterFlags: Flags, setterFlags: Int,
) : KmPropertyVisitor() { ) : KmPropertyVisitor() {
constructor(name: String) : this(0, name, 0, 0) constructor(name: String) : this(0, name, 0, 0)
@@ -510,7 +513,8 @@ class KmProperty @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* Property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag * Property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag
* and [Flag.PropertyAccessor] flags. * and [Flag.PropertyAccessor] flags.
*/ */
var getterFlags: Flags @Deprecated("$flagAccessPrefix KmProperty.getter, such as KmProperty.getter.isNotDefault")
var getterFlags: Int
get() = getter.flags get() = getter.flags
set(value) { set(value) {
getter.flags = value getter.flags = value
@@ -530,7 +534,8 @@ class KmProperty @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* Setting this property when setter is absent changes the value, but does not create new [setter]. * Setting this property when setter is absent changes the value, but does not create new [setter].
* This behavior is for compatibility only and will be removed in future versions. * This behavior is for compatibility only and will be removed in future versions.
*/ */
var setterFlags: Flags = getDefaultPropertyAccessorFlags(flags) @Deprecated("$flagAccessPrefix KmProperty.setter, such as KmProperty.setter.isNotDefault")
var setterFlags: Int = getDefaultPropertyAccessorFlags(flags)
get() = setter?.flags ?: field get() = setter?.flags ?: field
set(value) { set(value) {
setter?.flags = value setter?.flags = value
@@ -580,24 +585,24 @@ class KmProperty @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
MetadataExtensions.INSTANCES.map(MetadataExtensions::createPropertyExtension) MetadataExtensions.INSTANCES.map(MetadataExtensions::createPropertyExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters) KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor = override fun visitReceiverParameterType(flags: Int): KmTypeVisitor =
KmType(flags).also { receiverParameterType = it } KmType(flags).also { receiverParameterType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@ExperimentalContextReceivers @ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor = override fun visitContextReceiverType(flags: Int): KmTypeVisitor =
KmType(flags).addTo(contextReceiverTypes) KmType(flags).addTo(contextReceiverTypes)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor = override fun visitSetterParameter(flags: Int, name: String): KmValueParameterVisitor =
KmValueParameter(flags, name).also { setterParameter = it } KmValueParameter(flags, name).also { setterParameter = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitReturnType(flags: Flags): KmTypeVisitor = override fun visitReturnType(flags: Int): KmTypeVisitor =
KmType(flags).also { returnType = it } KmType(flags).also { returnType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -634,8 +639,8 @@ class KmProperty @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* @property name the name of the type alias * @property name the name of the type alias
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmTypeAlias @Deprecated(FLAGS_CTOR_DEPRECATED) constructor( class KmTypeAlias @Deprecated(flagsCtorDeprecated) constructor(
var flags: Flags, @Deprecated("$flagAccessPrefix KmTypeAlias, such as KmTypeAlias.visibility") var flags: Int,
var name: String, var name: String,
) : KmTypeAliasVisitor() { ) : KmTypeAliasVisitor() {
@@ -671,15 +676,15 @@ class KmTypeAlias @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createTypeAliasExtension) MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createTypeAliasExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters) KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitUnderlyingType(flags: Flags): KmTypeVisitor = override fun visitUnderlyingType(flags: Int): KmTypeVisitor =
KmType(flags).also { underlyingType = it } KmType(flags).also { underlyingType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitExpandedType(flags: Flags): KmTypeVisitor = override fun visitExpandedType(flags: Int): KmTypeVisitor =
KmType(flags).also { expandedType = it } KmType(flags).also { expandedType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -719,8 +724,8 @@ class KmTypeAlias @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* @property name the name of the value parameter * @property name the name of the value parameter
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmValueParameter @Deprecated(FLAGS_CTOR_DEPRECATED) constructor( class KmValueParameter @Deprecated(flagsCtorDeprecated) constructor(
var flags: Flags, @Deprecated("$flagAccessPrefix KmValueParameter, such as KmValueParameter.declaresDefaultValue") var flags: Int,
var name: String, var name: String,
) : KmValueParameterVisitor() { ) : KmValueParameterVisitor() {
@@ -741,11 +746,11 @@ class KmValueParameter @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createValueParameterExtension) MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createValueParameterExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitType(flags: Flags): KmTypeVisitor = override fun visitType(flags: Int): KmTypeVisitor =
KmType(flags).also { type = it } KmType(flags).also { type = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitVarargElementType(flags: Flags): KmTypeVisitor = override fun visitVarargElementType(flags: Int): KmTypeVisitor =
KmType(flags).also { varargElementType = it } KmType(flags).also { varargElementType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -776,8 +781,8 @@ class KmValueParameter @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* @property variance the declaration-site variance of the type parameter * @property variance the declaration-site variance of the type parameter
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmTypeParameter @Deprecated(FLAGS_CTOR_DEPRECATED) constructor( class KmTypeParameter @Deprecated(flagsCtorDeprecated) constructor(
var flags: Flags, @Deprecated("$flagAccessPrefix KmTypeParameter, such as KmTypeParameter.isReified") var flags: Int,
var name: String, var name: String,
var id: Int, var id: Int,
var variance: KmVariance, var variance: KmVariance,
@@ -794,7 +799,7 @@ class KmTypeParameter @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeParameterExtension) MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeParameterExtension)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitUpperBound(flags: Flags): KmTypeVisitor = override fun visitUpperBound(flags: Int): KmTypeVisitor =
KmType(flags).addTo(upperBounds) KmType(flags).addTo(upperBounds)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -820,7 +825,9 @@ class KmTypeParameter @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(
* @property flags type flags, consisting of [Flag.Type] flags * @property flags type flags, consisting of [Flag.Type] flags
*/ */
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class KmType @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(var flags: Flags) : KmTypeVisitor() { class KmType @Deprecated(flagsCtorDeprecated) constructor(
@Deprecated("$flagAccessPrefix KmType, such as KmType.isNullable") var flags: Int
) : KmTypeVisitor() {
constructor() : this(0) constructor() : this(0)
@@ -883,7 +890,7 @@ class KmType @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(var flags: Flags) :
} }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor = override fun visitArgument(flags: Int, variance: KmVariance): KmTypeVisitor =
KmType(flags).also { arguments.add(KmTypeProjection(variance, it)) } KmType(flags).also { arguments.add(KmTypeProjection(variance, it)) }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -892,15 +899,15 @@ class KmType @Deprecated(FLAGS_CTOR_DEPRECATED) constructor(var flags: Flags) :
} }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitAbbreviatedType(flags: Flags): KmTypeVisitor = override fun visitAbbreviatedType(flags: Int): KmTypeVisitor =
KmType(flags).also { abbreviatedType = it } KmType(flags).also { abbreviatedType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitOuterType(flags: Flags): KmTypeVisitor = override fun visitOuterType(flags: Int): KmTypeVisitor =
KmType(flags).also { outerType = it } KmType(flags).also { outerType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor = override fun visitFlexibleTypeUpperBound(flags: Int, typeFlexibilityId: String?): KmTypeVisitor =
KmType(flags).also { flexibleTypeUpperBound = KmFlexibleTypeUpperBound(it, typeFlexibilityId) } KmType(flags).also { flexibleTypeUpperBound = KmFlexibleTypeUpperBound(it, typeFlexibilityId) }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -1086,7 +1093,8 @@ class KmEffectExpression : KmEffectExpressionVisitor() {
/** /**
* Effect expression flags, consisting of [Flag.EffectExpression] flags. * Effect expression flags, consisting of [Flag.EffectExpression] flags.
*/ */
var flags: Flags = flagsOf() @Deprecated("$flagAccessPrefix KmEffectExpression, such as KmEffectExpression.isNegated")
var flags: Int = flagsOf()
/** /**
* Optional 1-based index of the value parameter of the function, for effects which assert something about * Optional 1-based index of the value parameter of the function, for effects which assert something about
@@ -1117,7 +1125,7 @@ class KmEffectExpression : KmEffectExpressionVisitor() {
val orArguments: MutableList<KmEffectExpression> = ArrayList(0) val orArguments: MutableList<KmEffectExpression> = ArrayList(0)
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visit(flags: Flags, parameterIndex: Int?) { override fun visit(flags: Int, parameterIndex: Int?) {
this.flags = flags this.flags = flags
this.parameterIndex = parameterIndex this.parameterIndex = parameterIndex
} }
@@ -1128,7 +1136,7 @@ class KmEffectExpression : KmEffectExpressionVisitor() {
} }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
override fun visitIsInstanceType(flags: Flags): KmTypeVisitor = override fun visitIsInstanceType(flags: Int): KmTypeVisitor =
KmType(flags).also { isInstanceType = it } KmType(flags).also { isInstanceType = it }
@Deprecated(VISITOR_API_MESSAGE) @Deprecated(VISITOR_API_MESSAGE)
@@ -1244,5 +1252,7 @@ internal fun <T> T.addTo(collection: MutableCollection<T>): T {
return this return this
} }
private const val FLAGS_CTOR_DEPRECATED = private const val flagsCtorDeprecated =
"Constructor with flags is deprecated, use constructor without flags and assign them or corresponding extension properties directly." "Constructor with flags is deprecated, use constructor without flags and assign them or corresponding extension properties directly."
private const val flagAccessPrefix = "Flag API is deprecated. Please use corresponding member extensions on"
@@ -22,7 +22,7 @@ abstract class KmDeclarationContainerVisitor @JvmOverloads constructor(protected
* @param flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags * @param flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags
* @param name the name of the function * @param name the name of the function
*/ */
open fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = open fun visitFunction(flags: Int, name: String): KmFunctionVisitor? =
delegate?.visitFunction(flags, name) delegate?.visitFunction(flags, name)
/** /**
@@ -35,7 +35,7 @@ abstract class KmDeclarationContainerVisitor @JvmOverloads constructor(protected
* @param setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag * @param setterFlags property accessor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag
* and [Flag.PropertyAccessor] flags * and [Flag.PropertyAccessor] flags
*/ */
open fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = open fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? =
delegate?.visitProperty(flags, name, getterFlags, setterFlags) delegate?.visitProperty(flags, name, getterFlags, setterFlags)
/** /**
@@ -44,7 +44,7 @@ abstract class KmDeclarationContainerVisitor @JvmOverloads constructor(protected
* @param flags type alias flags, consisting of [Flag.HAS_ANNOTATIONS] and visibility flag * @param flags type alias flags, consisting of [Flag.HAS_ANNOTATIONS] and visibility flag
* @param name the name of the type alias * @param name the name of the type alias
*/ */
open fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? = open fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor? =
delegate?.visitTypeAlias(flags, name) delegate?.visitTypeAlias(flags, name)
/** /**
@@ -73,7 +73,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
* @param flags class flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Class] flags * @param flags class flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Class] flags
* @param name the name of the class * @param name the name of the class
*/ */
open fun visit(flags: Flags, name: ClassName) { open fun visit(flags: Int, name: ClassName) {
delegate?.visit(flags, name) delegate?.visit(flags, name)
} }
@@ -86,7 +86,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
* the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`) * the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`)
* @param variance the declaration-site variance of the type parameter * @param variance the declaration-site variance of the type parameter
*/ */
open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
delegate?.visitTypeParameter(flags, name, id, variance) delegate?.visitTypeParameter(flags, name, id, variance)
/** /**
@@ -94,7 +94,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitSupertype(flags: Flags): KmTypeVisitor? = open fun visitSupertype(flags: Int): KmTypeVisitor? =
delegate?.visitSupertype(flags) delegate?.visitSupertype(flags)
/** /**
@@ -102,7 +102,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
* *
* @param flags constructor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag and [Flag.Constructor] flags * @param flags constructor flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag and [Flag.Constructor] flags
*/ */
open fun visitConstructor(flags: Flags): KmConstructorVisitor? = open fun visitConstructor(flags: Int): KmConstructorVisitor? =
delegate?.visitConstructor(flags) delegate?.visitConstructor(flags)
/** /**
@@ -155,7 +155,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitInlineClassUnderlyingType(flags: Flags): KmTypeVisitor? = open fun visitInlineClassUnderlyingType(flags: Int): KmTypeVisitor? =
delegate?.visitInlineClassUnderlyingType(flags) delegate?.visitInlineClassUnderlyingType(flags)
/** /**
@@ -164,7 +164,7 @@ abstract class KmClassVisitor @JvmOverloads constructor(delegate: KmClassVisitor
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
@ExperimentalContextReceivers @ExperimentalContextReceivers
open fun visitContextReceiverType(flags: Flags): KmTypeVisitor? = open fun visitContextReceiverType(flags: Int): KmTypeVisitor? =
delegate?.visitContextReceiverType(flags) delegate?.visitContextReceiverType(flags)
/** /**
@@ -230,7 +230,7 @@ abstract class KmLambdaVisitor @JvmOverloads constructor(private val delegate: K
* @param flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags * @param flags function flags, consisting of [Flag.HAS_ANNOTATIONS], visibility flag, modality flag and [Flag.Function] flags
* @param name the name of the function (usually `"<anonymous>"` or `"<no name provided>"` for lambdas emitted by the Kotlin compiler) * @param name the name of the function (usually `"<anonymous>"` or `"<no name provided>"` for lambdas emitted by the Kotlin compiler)
*/ */
open fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = open fun visitFunction(flags: Int, name: String): KmFunctionVisitor? =
delegate?.visitFunction(flags, name) delegate?.visitFunction(flags, name)
/** /**
@@ -255,7 +255,7 @@ abstract class KmConstructorVisitor @JvmOverloads constructor(private val delega
* @param flags value parameter flags, consisting of [Flag.ValueParameter] flags * @param flags value parameter flags, consisting of [Flag.ValueParameter] flags
* @param name the name of the value parameter * @param name the name of the value parameter
*/ */
open fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = open fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? =
delegate?.visitValueParameter(flags, name) delegate?.visitValueParameter(flags, name)
/** /**
@@ -298,7 +298,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
* the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`) * the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`)
* @param variance the declaration-site variance of the type parameter * @param variance the declaration-site variance of the type parameter
*/ */
open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
delegate?.visitTypeParameter(flags, name, id, variance) delegate?.visitTypeParameter(flags, name, id, variance)
/** /**
@@ -306,7 +306,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = open fun visitReceiverParameterType(flags: Int): KmTypeVisitor? =
delegate?.visitReceiverParameterType(flags) delegate?.visitReceiverParameterType(flags)
/** /**
@@ -315,7 +315,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
@ExperimentalContextReceivers @ExperimentalContextReceivers
open fun visitContextReceiverType(flags: Flags): KmTypeVisitor? = open fun visitContextReceiverType(flags: Int): KmTypeVisitor? =
delegate?.visitContextReceiverType(flags) delegate?.visitContextReceiverType(flags)
/** /**
@@ -324,7 +324,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
* @param flags value parameter flags, consisting of [Flag.ValueParameter] flags * @param flags value parameter flags, consisting of [Flag.ValueParameter] flags
* @param name the name of the value parameter * @param name the name of the value parameter
*/ */
open fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = open fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? =
delegate?.visitValueParameter(flags, name) delegate?.visitValueParameter(flags, name)
/** /**
@@ -332,7 +332,7 @@ abstract class KmFunctionVisitor @JvmOverloads constructor(private val delegate:
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitReturnType(flags: Flags): KmTypeVisitor? = open fun visitReturnType(flags: Int): KmTypeVisitor? =
delegate?.visitReturnType(flags) delegate?.visitReturnType(flags)
/** /**
@@ -382,7 +382,7 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate:
* the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`) * the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`)
* @param variance the declaration-site variance of the type parameter * @param variance the declaration-site variance of the type parameter
*/ */
open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
delegate?.visitTypeParameter(flags, name, id, variance) delegate?.visitTypeParameter(flags, name, id, variance)
/** /**
@@ -390,7 +390,7 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate:
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = open fun visitReceiverParameterType(flags: Int): KmTypeVisitor? =
delegate?.visitReceiverParameterType(flags) delegate?.visitReceiverParameterType(flags)
/** /**
@@ -399,7 +399,7 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate:
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
@ExperimentalContextReceivers @ExperimentalContextReceivers
open fun visitContextReceiverType(flags: Flags): KmTypeVisitor? = open fun visitContextReceiverType(flags: Int): KmTypeVisitor? =
delegate?.visitContextReceiverType(flags) delegate?.visitContextReceiverType(flags)
/** /**
@@ -408,7 +408,7 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate:
* @param flags value parameter flags, consisting of [Flag.ValueParameter] flags * @param flags value parameter flags, consisting of [Flag.ValueParameter] flags
* @param name the name of the value parameter (`"<set-?>"` for properties emitted by the Kotlin compiler) * @param name the name of the value parameter (`"<set-?>"` for properties emitted by the Kotlin compiler)
*/ */
open fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor? = open fun visitSetterParameter(flags: Int, name: String): KmValueParameterVisitor? =
delegate?.visitSetterParameter(flags, name) delegate?.visitSetterParameter(flags, name)
/** /**
@@ -416,7 +416,7 @@ abstract class KmPropertyVisitor @JvmOverloads constructor(private val delegate:
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitReturnType(flags: Flags): KmTypeVisitor? = open fun visitReturnType(flags: Int): KmTypeVisitor? =
delegate?.visitReturnType(flags) delegate?.visitReturnType(flags)
/** /**
@@ -459,7 +459,7 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate
* the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`) * the name isn't enough (e.g. `class A<T> { fun <T> foo(t: T) }`)
* @param variance the declaration-site variance of the type parameter * @param variance the declaration-site variance of the type parameter
*/ */
open fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = open fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
delegate?.visitTypeParameter(flags, name, id, variance) delegate?.visitTypeParameter(flags, name, id, variance)
/** /**
@@ -467,7 +467,7 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitUnderlyingType(flags: Flags): KmTypeVisitor? = open fun visitUnderlyingType(flags: Int): KmTypeVisitor? =
delegate?.visitUnderlyingType(flags) delegate?.visitUnderlyingType(flags)
/** /**
@@ -476,7 +476,7 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitExpandedType(flags: Flags): KmTypeVisitor? = open fun visitExpandedType(flags: Int): KmTypeVisitor? =
delegate?.visitExpandedType(flags) delegate?.visitExpandedType(flags)
/** /**
@@ -524,7 +524,7 @@ abstract class KmValueParameterVisitor @JvmOverloads constructor(private val del
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitType(flags: Flags): KmTypeVisitor? = open fun visitType(flags: Int): KmTypeVisitor? =
delegate?.visitType(flags) delegate?.visitType(flags)
/** /**
@@ -532,7 +532,7 @@ abstract class KmValueParameterVisitor @JvmOverloads constructor(private val del
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitVarargElementType(flags: Flags): KmTypeVisitor? = open fun visitVarargElementType(flags: Int): KmTypeVisitor? =
delegate?.visitVarargElementType(flags) delegate?.visitVarargElementType(flags)
/** /**
@@ -564,7 +564,7 @@ abstract class KmTypeParameterVisitor @JvmOverloads constructor(private val dele
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitUpperBound(flags: Flags): KmTypeVisitor? = open fun visitUpperBound(flags: Int): KmTypeVisitor? =
delegate?.visitUpperBound(flags) delegate?.visitUpperBound(flags)
/** /**
@@ -632,7 +632,7 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
* @param variance the variance of the type projection * @param variance the variance of the type projection
*/ */
open fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor? = open fun visitArgument(flags: Int, variance: KmVariance): KmTypeVisitor? =
delegate?.visitArgument(flags, variance) delegate?.visitArgument(flags, variance)
/** /**
@@ -654,7 +654,7 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitAbbreviatedType(flags: Flags): KmTypeVisitor? = open fun visitAbbreviatedType(flags: Int): KmTypeVisitor? =
delegate?.visitAbbreviatedType(flags) delegate?.visitAbbreviatedType(flags)
/** /**
@@ -669,7 +669,7 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitOuterType(flags: Flags): KmTypeVisitor? = open fun visitOuterType(flags: Int): KmTypeVisitor? =
delegate?.visitOuterType(flags) delegate?.visitOuterType(flags)
/** /**
@@ -680,7 +680,7 @@ abstract class KmTypeVisitor @JvmOverloads constructor(private val delegate: KmT
* @param typeFlexibilityId id of the kind of flexibility this type has. For example, "kotlin.jvm.PlatformType" for JVM platform types, * @param typeFlexibilityId id of the kind of flexibility this type has. For example, "kotlin.jvm.PlatformType" for JVM platform types,
* or "kotlin.DynamicType" for JS dynamic type * or "kotlin.DynamicType" for JS dynamic type
*/ */
open fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor? = open fun visitFlexibleTypeUpperBound(flags: Int, typeFlexibilityId: String?): KmTypeVisitor? =
delegate?.visitFlexibleTypeUpperBound(flags, typeFlexibilityId) delegate?.visitFlexibleTypeUpperBound(flags, typeFlexibilityId)
/** /**
@@ -825,7 +825,7 @@ abstract class KmEffectExpressionVisitor @JvmOverloads constructor(private val d
* @param parameterIndex optional 1-based index of the value parameter of the function, for effects which assert something about * @param parameterIndex optional 1-based index of the value parameter of the function, for effects which assert something about
* the function parameters. The index 0 means the extension receiver parameter * the function parameters. The index 0 means the extension receiver parameter
*/ */
open fun visit(flags: Flags, parameterIndex: Int?) { open fun visit(flags: Int, parameterIndex: Int?) {
delegate?.visit(flags, parameterIndex) delegate?.visit(flags, parameterIndex)
} }
@@ -843,7 +843,7 @@ abstract class KmEffectExpressionVisitor @JvmOverloads constructor(private val d
* *
* @param flags type flags, consisting of [Flag.Type] flags * @param flags type flags, consisting of [Flag.Type] flags
*/ */
open fun visitIsInstanceType(flags: Flags): KmTypeVisitor? = open fun visitIsInstanceType(flags: Int): KmTypeVisitor? =
delegate?.visitIsInstanceType(flags) delegate?.visitIsInstanceType(flags)
/** /**
@@ -2,11 +2,12 @@
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:OptIn(ExperimentalStdlibApi::class) @file:Suppress("DEPRECATION")
package kotlinx.metadata.internal package kotlinx.metadata.internal
import kotlinx.metadata.* import kotlinx.metadata.*
import kotlinx.metadata.internal.FlagImpl as Flag
import kotlin.enums.EnumEntries import kotlin.enums.EnumEntries
import kotlin.reflect.KMutableProperty1 import kotlin.reflect.KMutableProperty1
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@@ -15,7 +16,7 @@ import org.jetbrains.kotlin.metadata.deserialization.Flags as ProtoFlags
import org.jetbrains.kotlin.protobuf.Internal.EnumLite as ProtoEnumLite import org.jetbrains.kotlin.protobuf.Internal.EnumLite as ProtoEnumLite
internal class EnumFlagDelegate<Node, E : Enum<E>>( internal class EnumFlagDelegate<Node, E : Enum<E>>(
val flags: KMutableProperty1<Node, Flags>, val flags: KMutableProperty1<Node, Int>,
private val protoSet: ProtoFlagSet<out ProtoEnumLite>, private val protoSet: ProtoFlagSet<out ProtoEnumLite>,
private val entries: EnumEntries<E>, private val entries: EnumEntries<E>,
private val flagValues: List<Flag> private val flagValues: List<Flag>
@@ -30,7 +31,7 @@ internal class EnumFlagDelegate<Node, E : Enum<E>>(
} }
// Public in internal package - for reuse in JvmFlags // Public in internal package - for reuse in JvmFlags
public class BooleanFlagDelegate<Node>(private val flags: KMutableProperty1<Node, Flags>, private val flag: Flag) { public class BooleanFlagDelegate<Node>(private val flags: KMutableProperty1<Node, Int>, private val flag: Flag) {
private val mask: Int private val mask: Int
init { init {
@@ -47,13 +48,13 @@ public class BooleanFlagDelegate<Node>(private val flags: KMutableProperty1<Node
} }
internal fun <Node> visibilityDelegate(flags: KMutableProperty1<Node, Flags>) = internal fun <Node> visibilityDelegate(flags: KMutableProperty1<Node, Int>) =
EnumFlagDelegate(flags, ProtoFlags.VISIBILITY, Visibility.entries, Visibility.entries.map { it.flag }) EnumFlagDelegate(flags, ProtoFlags.VISIBILITY, Visibility.entries, Visibility.entries.map { it.flag })
internal fun <Node> modalityDelegate(flags: KMutableProperty1<Node, Flags>) = internal fun <Node> modalityDelegate(flags: KMutableProperty1<Node, Int>) =
EnumFlagDelegate(flags, ProtoFlags.MODALITY, Modality.entries, Modality.entries.map { it.flag }) EnumFlagDelegate(flags, ProtoFlags.MODALITY, Modality.entries, Modality.entries.map { it.flag })
internal fun <Node> memberKindDelegate(flags: KMutableProperty1<Node, Flags>) = internal fun <Node> memberKindDelegate(flags: KMutableProperty1<Node, Int>) =
EnumFlagDelegate(flags, ProtoFlags.MEMBER_KIND, MemberKind.entries, MemberKind.entries.map { it.flag }) EnumFlagDelegate(flags, ProtoFlags.MEMBER_KIND, MemberKind.entries, MemberKind.entries.map { it.flag })
internal fun classBooleanFlag(flag: Flag) = BooleanFlagDelegate(KmClass::flags, flag) internal fun classBooleanFlag(flag: Flag) = BooleanFlagDelegate(KmClass::flags, flag)
@@ -70,5 +71,5 @@ internal fun typeBooleanFlag(flag: Flag) = BooleanFlagDelegate(KmType::flags, fl
internal fun valueParameterBooleanFlag(flag: Flag) = BooleanFlagDelegate(KmValueParameter::flags, flag) internal fun valueParameterBooleanFlag(flag: Flag) = BooleanFlagDelegate(KmValueParameter::flags, flag)
internal fun <Node> annotationsOn(flags: KMutableProperty1<Node, Flags>) = BooleanFlagDelegate(flags, Flag(ProtoFlags.HAS_ANNOTATIONS)) internal fun <Node> annotationsOn(flags: KMutableProperty1<Node, Int>) = BooleanFlagDelegate(flags, Flag(ProtoFlags.HAS_ANNOTATIONS))
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlinx.metadata.internal
import org.jetbrains.kotlin.metadata.deserialization.Flags as F
class FlagImpl(internal val offset: Int, internal val bitWidth: Int, internal val value: Int) : @Suppress("DEPRECATION") kotlinx.metadata.Flag() {
@IgnoreInApiDump
internal constructor(field: F.FlagField<*>, value: Int) : this(field.offset, field.bitWidth, value)
@IgnoreInApiDump
internal constructor(field: F.BooleanFlagField) : this(field, 1)
internal operator fun plus(flags: Int): Int =
(flags and (((1 shl bitWidth) - 1) shl offset).inv()) + (value shl offset)
override operator fun invoke(flags: Int): Boolean = (flags ushr offset) and ((1 shl bitWidth) - 1) == value
}
internal fun Flag(field: F.FlagField<*>, value: Int): FlagImpl = FlagImpl(field, value)
internal fun Flag(field: F.BooleanFlagField): FlagImpl = FlagImpl(field)
@@ -7,7 +7,6 @@
package kotlinx.metadata.internal package kotlinx.metadata.internal
import kotlinx.metadata.* import kotlinx.metadata.*
import kotlinx.metadata.Flags // Don't remove this import. See KT-45553
import kotlinx.metadata.internal.extensions.MetadataExtensions import kotlinx.metadata.internal.extensions.MetadataExtensions
import kotlinx.metadata.internal.common.KmModuleFragmentVisitor import kotlinx.metadata.internal.common.KmModuleFragmentVisitor
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
@@ -344,7 +343,7 @@ private fun ProtoBuf.ValueParameter.accept(v: KmValueParameterVisitor, c: ReadCo
} }
private inline fun ProtoBuf.TypeParameter.accept( private inline fun ProtoBuf.TypeParameter.accept(
visit: (flags: Flags, name: String, id: Int, variance: KmVariance) -> KmTypeParameterVisitor?, visit: (flags: Int, name: String, id: Int, variance: KmVariance) -> KmTypeParameterVisitor?,
c: ReadContext c: ReadContext
) { ) {
val variance = when (requireNotNull(variance)) { val variance = when (requireNotNull(variance)) {
@@ -514,18 +513,18 @@ private fun ProtoBuf.Expression.accept(v: KmEffectExpressionVisitor, c: ReadCont
v.visitEnd() v.visitEnd()
} }
private val ProtoBuf.Type.typeFlags: Flags private val ProtoBuf.Type.typeFlags: Int
get() = (if (nullable) 1 shl 0 else 0) + get() = (if (nullable) 1 shl 0 else 0) +
(flags shl 1) (flags shl 1)
private val ProtoBuf.TypeParameter.typeParameterFlags: Flags private val ProtoBuf.TypeParameter.typeParameterFlags: Int
get() = if (reified) 1 else 0 get() = if (reified) 1 else 0
fun ProtoBuf.Property.getPropertyGetterFlags(): Flags = fun ProtoBuf.Property.getPropertyGetterFlags(): Int =
if (hasGetterFlags()) getterFlags else getDefaultPropertyAccessorFlags(flags) if (hasGetterFlags()) getterFlags else getDefaultPropertyAccessorFlags(flags)
fun ProtoBuf.Property.getPropertySetterFlags(): Flags = fun ProtoBuf.Property.getPropertySetterFlags(): Int =
if (hasSetterFlags()) setterFlags else getDefaultPropertyAccessorFlags(flags) if (hasSetterFlags()) setterFlags else getDefaultPropertyAccessorFlags(flags)
internal fun getDefaultPropertyAccessorFlags(flags: Flags): Flags = internal fun getDefaultPropertyAccessorFlags(flags: Int): Int =
F.getAccessorFlags(F.HAS_ANNOTATIONS.get(flags), F.VISIBILITY.get(flags), F.MODALITY.get(flags), false, false, false) F.getAccessorFlags(F.HAS_ANNOTATIONS.get(flags), F.VISIBILITY.get(flags), F.MODALITY.get(flags), false, false, false)
@@ -32,13 +32,13 @@ open class WriteContext(val strings: StringTable, val contextExtensions: List<Wr
} }
private fun writeTypeParameter( private fun writeTypeParameter(
c: WriteContext, flags: Flags, name: String, id: Int, variance: KmVariance, c: WriteContext, flags: Int, name: String, id: Int, variance: KmVariance,
output: (ProtoBuf.TypeParameter.Builder) -> Unit output: (ProtoBuf.TypeParameter.Builder) -> Unit
): KmTypeParameterVisitor = ): KmTypeParameterVisitor =
object : KmTypeParameterVisitor() { object : KmTypeParameterVisitor() {
private val t = ProtoBuf.TypeParameter.newBuilder() private val t = ProtoBuf.TypeParameter.newBuilder()
override fun visitUpperBound(flags: Flags): KmTypeVisitor? = override fun visitUpperBound(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.addUpperBound(it) } writeType(c, flags) { t.addUpperBound(it) }
override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? = override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? =
@@ -62,7 +62,7 @@ private fun writeTypeParameter(
} }
} }
private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Builder) -> Unit): KmTypeVisitor = private fun writeType(c: WriteContext, flags: Int, output: (ProtoBuf.Type.Builder) -> Unit): KmTypeVisitor =
object : KmTypeVisitor() { object : KmTypeVisitor() {
private val t = ProtoBuf.Type.newBuilder() private val t = ProtoBuf.Type.newBuilder()
@@ -80,7 +80,7 @@ private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Buil
}) })
} }
override fun visitArgument(flags: Flags, variance: KmVariance): KmTypeVisitor? = override fun visitArgument(flags: Int, variance: KmVariance): KmTypeVisitor? =
writeType(c, flags) { argument -> writeType(c, flags) { argument ->
t.addArgument(ProtoBuf.Type.Argument.newBuilder().apply { t.addArgument(ProtoBuf.Type.Argument.newBuilder().apply {
if (variance == KmVariance.IN) { if (variance == KmVariance.IN) {
@@ -96,13 +96,13 @@ private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Buil
t.typeParameter = id t.typeParameter = id
} }
override fun visitAbbreviatedType(flags: Flags): KmTypeVisitor? = override fun visitAbbreviatedType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.abbreviatedType = it.build() } writeType(c, flags) { t.abbreviatedType = it.build() }
override fun visitOuterType(flags: Flags): KmTypeVisitor? = override fun visitOuterType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.outerType = it.build() } writeType(c, flags) { t.outerType = it.build() }
override fun visitFlexibleTypeUpperBound(flags: Flags, typeFlexibilityId: String?): KmTypeVisitor? = override fun visitFlexibleTypeUpperBound(flags: Int, typeFlexibilityId: String?): KmTypeVisitor? =
writeType(c, flags) { writeType(c, flags) {
if (typeFlexibilityId != null) { if (typeFlexibilityId != null) {
t.flexibleTypeCapabilitiesId = c[typeFlexibilityId] t.flexibleTypeCapabilitiesId = c[typeFlexibilityId]
@@ -127,11 +127,11 @@ private fun writeType(c: WriteContext, flags: Flags, output: (ProtoBuf.Type.Buil
} }
} }
private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Constructor.Builder) -> Unit): KmConstructorVisitor = private fun writeConstructor(c: WriteContext, flags: Int, output: (ProtoBuf.Constructor.Builder) -> Unit): KmConstructorVisitor =
object : KmConstructorVisitor() { object : KmConstructorVisitor() {
val t = ProtoBuf.Constructor.newBuilder() val t = ProtoBuf.Constructor.newBuilder()
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? =
writeValueParameter(c, flags, name) { t.addValueParameter(it.build()) } writeValueParameter(c, flags, name) { t.addValueParameter(it.build()) }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? = override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
@@ -150,24 +150,24 @@ private fun writeConstructor(c: WriteContext, flags: Flags, output: (ProtoBuf.Co
} }
} }
private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (ProtoBuf.Function.Builder) -> Unit): KmFunctionVisitor = private fun writeFunction(c: WriteContext, flags: Int, name: String, output: (ProtoBuf.Function.Builder) -> Unit): KmFunctionVisitor =
object : KmFunctionVisitor() { object : KmFunctionVisitor() {
val t = ProtoBuf.Function.newBuilder() val t = ProtoBuf.Function.newBuilder()
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) }
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = override fun visitReceiverParameterType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.receiverType = it.build() } writeType(c, flags) { t.receiverType = it.build() }
@ExperimentalContextReceivers @ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor = override fun visitContextReceiverType(flags: Int): KmTypeVisitor =
writeType(c, flags) { t.addContextReceiverType(it) } writeType(c, flags) { t.addContextReceiverType(it) }
override fun visitValueParameter(flags: Flags, name: String): KmValueParameterVisitor? = override fun visitValueParameter(flags: Int, name: String): KmValueParameterVisitor? =
writeValueParameter(c, flags, name) { t.addValueParameter(it) } writeValueParameter(c, flags, name) { t.addValueParameter(it) }
override fun visitReturnType(flags: Flags): KmTypeVisitor? = override fun visitReturnType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.returnType = it.build() } writeType(c, flags) { t.returnType = it.build() }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? = override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
@@ -192,24 +192,24 @@ private fun writeFunction(c: WriteContext, flags: Flags, name: String, output: (
} }
fun writeProperty( fun writeProperty(
c: WriteContext, flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags, output: (ProtoBuf.Property.Builder) -> Unit c: WriteContext, flags: Int, name: String, getterFlags: Int, setterFlags: Int, output: (ProtoBuf.Property.Builder) -> Unit
): KmPropertyVisitor = object : KmPropertyVisitor() { ): KmPropertyVisitor = object : KmPropertyVisitor() {
val t = ProtoBuf.Property.newBuilder() val t = ProtoBuf.Property.newBuilder()
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) }
override fun visitReceiverParameterType(flags: Flags): KmTypeVisitor? = override fun visitReceiverParameterType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.receiverType = it.build() } writeType(c, flags) { t.receiverType = it.build() }
@ExperimentalContextReceivers @ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor = override fun visitContextReceiverType(flags: Int): KmTypeVisitor =
writeType(c, flags) { t.addContextReceiverType(it) } writeType(c, flags) { t.addContextReceiverType(it) }
override fun visitSetterParameter(flags: Flags, name: String): KmValueParameterVisitor? = override fun visitSetterParameter(flags: Int, name: String): KmValueParameterVisitor? =
writeValueParameter(c, flags, name) { t.setterValueParameter = it.build() } writeValueParameter(c, flags, name) { t.setterValueParameter = it.build() }
override fun visitReturnType(flags: Flags): KmTypeVisitor? = override fun visitReturnType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.returnType = it.build() } writeType(c, flags) { t.returnType = it.build() }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? = override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
@@ -233,15 +233,15 @@ fun writeProperty(
} }
private fun writeValueParameter( private fun writeValueParameter(
c: WriteContext, flags: Flags, name: String, c: WriteContext, flags: Int, name: String,
output: (ProtoBuf.ValueParameter.Builder) -> Unit output: (ProtoBuf.ValueParameter.Builder) -> Unit
): KmValueParameterVisitor = object : KmValueParameterVisitor() { ): KmValueParameterVisitor = object : KmValueParameterVisitor() {
val t = ProtoBuf.ValueParameter.newBuilder() val t = ProtoBuf.ValueParameter.newBuilder()
override fun visitType(flags: Flags): KmTypeVisitor? = override fun visitType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.type = it.build() } writeType(c, flags) { t.type = it.build() }
override fun visitVarargElementType(flags: Flags): KmTypeVisitor? = override fun visitVarargElementType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.varargElementType = it.build() } writeType(c, flags) { t.varargElementType = it.build() }
override fun visitExtensions(type: KmExtensionType): KmValueParameterExtensionVisitor? = override fun visitExtensions(type: KmExtensionType): KmValueParameterExtensionVisitor? =
@@ -259,18 +259,18 @@ private fun writeValueParameter(
} }
private fun writeTypeAlias( private fun writeTypeAlias(
c: WriteContext, flags: Flags, name: String, c: WriteContext, flags: Int, name: String,
output: (ProtoBuf.TypeAlias.Builder) -> Unit output: (ProtoBuf.TypeAlias.Builder) -> Unit
): KmTypeAliasVisitor = object : KmTypeAliasVisitor() { ): KmTypeAliasVisitor = object : KmTypeAliasVisitor() {
val t = ProtoBuf.TypeAlias.newBuilder() val t = ProtoBuf.TypeAlias.newBuilder()
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) }
override fun visitUnderlyingType(flags: Flags): KmTypeVisitor? = override fun visitUnderlyingType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.underlyingType = it.build() } writeType(c, flags) { t.underlyingType = it.build() }
override fun visitExpandedType(flags: Flags): KmTypeVisitor? = override fun visitExpandedType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.expandedType = it.build() } writeType(c, flags) { t.expandedType = it.build() }
override fun visitAnnotation(annotation: KmAnnotation) { override fun visitAnnotation(annotation: KmAnnotation) {
@@ -392,7 +392,7 @@ private fun writeEffectExpression(c: WriteContext, output: (ProtoBuf.Expression.
object : KmEffectExpressionVisitor() { object : KmEffectExpressionVisitor() {
val t = ProtoBuf.Expression.newBuilder() val t = ProtoBuf.Expression.newBuilder()
override fun visit(flags: Flags, parameterIndex: Int?) { override fun visit(flags: Int, parameterIndex: Int?) {
if (flags != ProtoBuf.Expression.getDefaultInstance().flags) { if (flags != ProtoBuf.Expression.getDefaultInstance().flags) {
t.flags = flags t.flags = flags
} }
@@ -410,7 +410,7 @@ private fun writeEffectExpression(c: WriteContext, output: (ProtoBuf.Expression.
} }
} }
override fun visitIsInstanceType(flags: Flags): KmTypeVisitor? = override fun visitIsInstanceType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.isInstanceType = it.build() } writeType(c, flags) { t.isInstanceType = it.build() }
override fun visitAndArgument(): KmEffectExpressionVisitor? = override fun visitAndArgument(): KmEffectExpressionVisitor? =
@@ -428,29 +428,29 @@ open class ClassWriter(stringTable: StringTable, contextExtensions: List<WriteCo
protected val t = ProtoBuf.Class.newBuilder()!! protected val t = ProtoBuf.Class.newBuilder()!!
protected val c: WriteContext = WriteContext(stringTable, contextExtensions) protected val c: WriteContext = WriteContext(stringTable, contextExtensions)
override fun visit(flags: Flags, name: ClassName) { override fun visit(flags: Int, name: ClassName) {
if (flags != ProtoBuf.Class.getDefaultInstance().flags) { if (flags != ProtoBuf.Class.getDefaultInstance().flags) {
t.flags = flags t.flags = flags
} }
t.fqName = c.getClassName(name) t.fqName = c.getClassName(name)
} }
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? = override fun visitTypeParameter(flags: Int, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor? =
writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) } writeTypeParameter(c, flags, name, id, variance) { t.addTypeParameter(it) }
override fun visitSupertype(flags: Flags): KmTypeVisitor? = override fun visitSupertype(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.addSupertype(it) } writeType(c, flags) { t.addSupertype(it) }
override fun visitConstructor(flags: Flags): KmConstructorVisitor? = override fun visitConstructor(flags: Int): KmConstructorVisitor? =
writeConstructor(c, flags) { t.addConstructor(it) } writeConstructor(c, flags) { t.addConstructor(it) }
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? =
writeFunction(c, flags, name) { t.addFunction(it) } writeFunction(c, flags, name) { t.addFunction(it) }
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = override fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? =
writeProperty(c, flags, name, getterFlags, setterFlags) { t.addProperty(it) } writeProperty(c, flags, name, getterFlags, setterFlags) { t.addProperty(it) }
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? = override fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor? =
writeTypeAlias(c, flags, name) { t.addTypeAlias(it) } writeTypeAlias(c, flags, name) { t.addTypeAlias(it) }
override fun visitCompanionObject(name: String) { override fun visitCompanionObject(name: String) {
@@ -475,11 +475,11 @@ open class ClassWriter(stringTable: StringTable, contextExtensions: List<WriteCo
t.inlineClassUnderlyingPropertyName = c[name] t.inlineClassUnderlyingPropertyName = c[name]
} }
override fun visitInlineClassUnderlyingType(flags: Flags): KmTypeVisitor? = override fun visitInlineClassUnderlyingType(flags: Int): KmTypeVisitor? =
writeType(c, flags) { t.inlineClassUnderlyingType = it.build() } writeType(c, flags) { t.inlineClassUnderlyingType = it.build() }
@ExperimentalContextReceivers @ExperimentalContextReceivers
override fun visitContextReceiverType(flags: Flags): KmTypeVisitor = override fun visitContextReceiverType(flags: Int): KmTypeVisitor =
writeType(c, flags) { t.addContextReceiverType(it) } writeType(c, flags) { t.addContextReceiverType(it) }
override fun visitVersionRequirement(): KmVersionRequirementVisitor? = override fun visitVersionRequirement(): KmVersionRequirementVisitor? =
@@ -501,13 +501,13 @@ open class PackageWriter(stringTable: StringTable, contextExtensions: List<Write
protected val t = ProtoBuf.Package.newBuilder()!! protected val t = ProtoBuf.Package.newBuilder()!!
protected val c: WriteContext = WriteContext(stringTable, contextExtensions) protected val c: WriteContext = WriteContext(stringTable, contextExtensions)
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? =
writeFunction(c, flags, name) { t.addFunction(it) } writeFunction(c, flags, name) { t.addFunction(it) }
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? = override fun visitProperty(flags: Int, name: String, getterFlags: Int, setterFlags: Int): KmPropertyVisitor? =
writeProperty(c, flags, name, getterFlags, setterFlags) { t.addProperty(it) } writeProperty(c, flags, name, getterFlags, setterFlags) { t.addProperty(it) }
override fun visitTypeAlias(flags: Flags, name: String): KmTypeAliasVisitor? = override fun visitTypeAlias(flags: Int, name: String): KmTypeAliasVisitor? =
writeTypeAlias(c, flags, name) { t.addTypeAlias(it) } writeTypeAlias(c, flags, name) { t.addTypeAlias(it) }
override fun visitExtensions(type: KmExtensionType): KmPackageExtensionVisitor? = override fun visitExtensions(type: KmExtensionType): KmPackageExtensionVisitor? =
@@ -551,6 +551,6 @@ open class LambdaWriter(stringTable: StringTable) : KmLambdaVisitor() {
protected var t: ProtoBuf.Function.Builder? = null protected var t: ProtoBuf.Function.Builder? = null
protected val c = WriteContext(stringTable) protected val c = WriteContext(stringTable)
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? = override fun visitFunction(flags: Int, name: String): KmFunctionVisitor? =
writeFunction(c, flags, name) { t = it } writeFunction(c, flags, name) { t = it }
} }
@@ -20,8 +20,12 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
object CirDeserializers { object CirDeserializers {
private fun annotations(flags: Flags, typeResolver: CirTypeResolver, annotations: () -> List<KmAnnotation>): List<CirAnnotation> { private fun annotations(
return if (!Flag.Common.HAS_ANNOTATIONS(flags)) hasAnnotations: Boolean,
typeResolver: CirTypeResolver,
annotations: () -> List<KmAnnotation>,
): List<CirAnnotation> {
return if (!hasAnnotations)
emptyList() emptyList()
else else
annotations().compactMap { annotation(it, typeResolver) } annotations().compactMap { annotation(it, typeResolver) }
@@ -72,12 +76,10 @@ object CirDeserializers {
) )
} }
private val ALWAYS_HAS_ANNOTATIONS: Flags = flagsOf(Flag.Common.HAS_ANNOTATIONS)
private fun typeParameter(source: KmTypeParameter, typeResolver: CirTypeResolver): CirTypeParameter = CirTypeParameter( private fun typeParameter(source: KmTypeParameter, typeResolver: CirTypeResolver): CirTypeParameter = CirTypeParameter(
annotations = annotations(ALWAYS_HAS_ANNOTATIONS, typeResolver, source::annotations), annotations = annotations(true, typeResolver, source::annotations),
name = CirName.create(source.name), name = CirName.create(source.name),
isReified = Flag.TypeParameter.IS_REIFIED(source.flags), isReified = source.isReified,
variance = variance(source.variance), variance = variance(source.variance),
upperBounds = source.filteredUpperBounds.compactMap { type(it, typeResolver) } upperBounds = source.filteredUpperBounds.compactMap { type(it, typeResolver) }
) )
@@ -91,7 +93,7 @@ object CirDeserializers {
) )
fun property(name: CirName, source: KmProperty, containingClass: CirContainingClass?, typeResolver: CirTypeResolver): CirProperty { fun property(name: CirName, source: KmProperty, containingClass: CirContainingClass?, typeResolver: CirTypeResolver): CirProperty {
val compileTimeInitializer = if (Flag.Property.HAS_CONSTANT(source.flags)) { val compileTimeInitializer = if (source.hasConstant) {
constantValue( constantValue(
constantValue = source.compileTimeValue, constantValue = source.compileTimeValue,
owner = source, owner = source,
@@ -99,19 +101,19 @@ object CirDeserializers {
} else CirConstantValue.NullValue } else CirConstantValue.NullValue
return CirProperty( return CirProperty(
annotations = annotations(source.flags, typeResolver, source::annotations), annotations = annotations(source.hasAnnotations, typeResolver, source::annotations),
name = name, name = name,
typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) }, typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) },
visibility = visibility(source.flags), visibility = visibility(source.visibility),
modality = modality(source.flags), modality = modality(source.modality),
containingClass = containingClass, containingClass = containingClass,
extensionReceiver = source.receiverParameterType?.let { extensionReceiver(it, typeResolver) }, extensionReceiver = source.receiverParameterType?.let { extensionReceiver(it, typeResolver) },
returnType = type(source.returnType, typeResolver), returnType = type(source.returnType, typeResolver),
kind = callableKind(source.flags), kind = callableKind(source.kind),
isVar = Flag.Property.IS_VAR(source.flags), isVar = source.isVar,
isLateInit = Flag.Property.IS_LATEINIT(source.flags), isLateInit = source.isLateinit,
isConst = Flag.Property.IS_CONST(source.flags), isConst = source.isConst,
isDelegate = Flag.Property.IS_DELEGATED(source.flags), isDelegate = source.isDelegated,
getter = propertyGetter(source, typeResolver), getter = propertyGetter(source, typeResolver),
setter = propertySetter(source, typeResolver), setter = propertySetter(source, typeResolver),
backingFieldAnnotations = emptyList(), // TODO unclear where to read backing/delegate field annotations from, see KT-44625 backingFieldAnnotations = emptyList(), // TODO unclear where to read backing/delegate field annotations from, see KT-44625
@@ -121,13 +123,11 @@ object CirDeserializers {
} }
private fun propertyGetter(source: KmProperty, typeResolver: CirTypeResolver): CirPropertyGetter? { private fun propertyGetter(source: KmProperty, typeResolver: CirTypeResolver): CirPropertyGetter? {
if (!Flag.Property.HAS_GETTER(source.flags)) if (!source.hasGetter)
return null return null
val getterFlags = source.getterFlags val isDefault = !source.getter.isNotDefault
val annotations = annotations(source.getter.hasAnnotations, typeResolver, source::getterAnnotations)
val isDefault = !Flag.PropertyAccessor.IS_NOT_DEFAULT(getterFlags)
val annotations = annotations(getterFlags, typeResolver, source::getterAnnotations)
if (isDefault && annotations.isEmpty()) if (isDefault && annotations.isEmpty())
return CirPropertyGetter.DEFAULT_NO_ANNOTATIONS return CirPropertyGetter.DEFAULT_NO_ANNOTATIONS
@@ -135,69 +135,68 @@ object CirDeserializers {
return CirPropertyGetter.createInterned( return CirPropertyGetter.createInterned(
annotations = annotations, annotations = annotations,
isDefault = isDefault, isDefault = isDefault,
isInline = Flag.PropertyAccessor.IS_INLINE(getterFlags) isInline = source.getter.isInline
) )
} }
private fun propertySetter(source: KmProperty, typeResolver: CirTypeResolver): CirPropertySetter? { private fun propertySetter(source: KmProperty, typeResolver: CirTypeResolver): CirPropertySetter? {
if (!Flag.Property.HAS_SETTER(source.flags)) if (!source.hasSetter)
return null return null
val setterFlags = source.setterFlags val setter = source.setter ?: return null
return CirPropertySetter.createInterned( return CirPropertySetter.createInterned(
annotations = annotations(setterFlags, typeResolver, source::setterAnnotations), annotations = annotations(source.setter?.hasAnnotations == true, typeResolver, source::setterAnnotations),
parameterAnnotations = source.setterParameter?.let { setterParameter -> parameterAnnotations = source.setterParameter?.let { setterParameter ->
annotations(setterParameter.flags, typeResolver, setterParameter::annotations) annotations(setterParameter.hasAnnotations, typeResolver, setterParameter::annotations)
}.orEmpty(), }.orEmpty(),
visibility = visibility(setterFlags), visibility = visibility(setter.visibility),
isDefault = !Flag.PropertyAccessor.IS_NOT_DEFAULT(setterFlags), isDefault = !setter.isNotDefault,
isInline = Flag.PropertyAccessor.IS_INLINE(setterFlags) isInline = setter.isInline
) )
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
private inline fun callableKind(flags: Flags): CallableMemberDescriptor.Kind = private inline fun callableKind(memberKind: MemberKind): CallableMemberDescriptor.Kind =
when { when (memberKind) {
Flag.Property.IS_DECLARATION(flags) /*|| Flag.Function.IS_DECLARATION(flags)*/ -> CallableMemberDescriptor.Kind.DECLARATION MemberKind.DECLARATION -> CallableMemberDescriptor.Kind.DECLARATION
Flag.Property.IS_FAKE_OVERRIDE(flags) /*|| Flag.Function.IS_FAKE_OVERRIDE(flags)*/ -> CallableMemberDescriptor.Kind.FAKE_OVERRIDE MemberKind.FAKE_OVERRIDE -> CallableMemberDescriptor.Kind.FAKE_OVERRIDE
Flag.Property.IS_DELEGATION(flags) /*|| Flag.Function.IS_DELEGATION(flags)*/ -> CallableMemberDescriptor.Kind.DELEGATION MemberKind.DELEGATION -> CallableMemberDescriptor.Kind.DELEGATION
Flag.Property.IS_SYNTHESIZED(flags) /*|| Flag.Function.IS_SYNTHESIZED(flags)*/ -> CallableMemberDescriptor.Kind.SYNTHESIZED MemberKind.SYNTHESIZED -> CallableMemberDescriptor.Kind.SYNTHESIZED
else -> error("Can't decode callable kind from flags: $flags")
} }
fun function(name: CirName, source: KmFunction, containingClass: CirContainingClass?, typeResolver: CirTypeResolver): CirFunction = fun function(name: CirName, source: KmFunction, containingClass: CirContainingClass?, typeResolver: CirTypeResolver): CirFunction =
CirFunction( CirFunction(
annotations = annotations(source.flags, typeResolver, source::annotations), annotations = annotations(source.hasAnnotations, typeResolver, source::annotations),
name = name, name = name,
typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) }, typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) },
visibility = visibility(source.flags), visibility = visibility(source.visibility),
modality = modality(source.flags), modality = modality(source.modality),
containingClass = containingClass, containingClass = containingClass,
valueParameters = source.valueParameters.compactMap { valueParameter(it, typeResolver) }, valueParameters = source.valueParameters.compactMap { valueParameter(it, typeResolver) },
hasStableParameterNames = !Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES(source.flags), hasStableParameterNames = !source.hasNonStableParameterNames,
extensionReceiver = source.receiverParameterType?.let { extensionReceiver(it, typeResolver) }, extensionReceiver = source.receiverParameterType?.let { extensionReceiver(it, typeResolver) },
returnType = type(source.returnType, typeResolver), returnType = type(source.returnType, typeResolver),
kind = callableKind(source.flags), kind = callableKind(source.kind),
modifiers = functionModifiers(source), modifiers = functionModifiers(source),
) )
private fun functionModifiers(source: KmFunction): CirFunctionModifiers = CirFunctionModifiers.createInterned( private fun functionModifiers(source: KmFunction): CirFunctionModifiers = CirFunctionModifiers.createInterned(
isOperator = Flag.Function.IS_OPERATOR(source.flags), isOperator = source.isOperator,
isInfix = Flag.Function.IS_INFIX(source.flags), isInfix = source.isInfix,
isInline = Flag.Function.IS_INLINE(source.flags), isInline = source.isInline,
isSuspend = Flag.Function.IS_SUSPEND(source.flags), isSuspend = source.isSuspend,
) )
private fun valueParameter(source: KmValueParameter, typeResolver: CirTypeResolver): CirValueParameter = private fun valueParameter(source: KmValueParameter, typeResolver: CirTypeResolver): CirValueParameter =
CirValueParameter.createInterned( CirValueParameter.createInterned(
annotations = annotations(source.flags, typeResolver, source::annotations), annotations = annotations(source.hasAnnotations, typeResolver, source::annotations),
name = CirName.create(source.name), name = CirName.create(source.name),
returnType = type(source.type, typeResolver), returnType = type(source.type, typeResolver),
varargElementType = source.varargElementType?.let { type(it, typeResolver) }, varargElementType = source.varargElementType?.let { type(it, typeResolver) },
declaresDefaultValue = Flag.ValueParameter.DECLARES_DEFAULT_VALUE(source.flags), declaresDefaultValue = source.declaresDefaultValue,
isCrossinline = Flag.ValueParameter.IS_CROSSINLINE(source.flags), isCrossinline = source.isCrossinline,
isNoinline = Flag.ValueParameter.IS_NOINLINE(source.flags) isNoinline = source.isNoinline
) )
private fun constantValue( private fun constantValue(
@@ -251,19 +250,19 @@ object CirDeserializers {
} }
fun clazz(name: CirName, source: KmClass, typeResolver: CirTypeResolver): CirClass = CirClass.create( fun clazz(name: CirName, source: KmClass, typeResolver: CirTypeResolver): CirClass = CirClass.create(
annotations = annotations(source.flags, typeResolver, source::annotations), annotations = annotations(source.hasAnnotations, typeResolver, source::annotations),
name = name, name = name,
typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) }, typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) },
supertypes = source.filteredSupertypes.compactMap { type(it, typeResolver) }, supertypes = source.filteredSupertypes.compactMap { type(it, typeResolver) },
visibility = visibility(source.flags), visibility = visibility(source.visibility),
modality = modality(source.flags), modality = modality(source.modality),
kind = classKind(source.flags), kind = classKind(source.kind),
companion = source.companionObject?.let(CirName::create), companion = source.companionObject?.let(CirName::create),
isCompanion = Flag.Class.IS_COMPANION_OBJECT(source.flags), isCompanion = source.kind == KmClassKind.COMPANION_OBJECT,
isData = Flag.Class.IS_DATA(source.flags), isData = source.isData,
isValue = Flag.Class.IS_VALUE(source.flags), isValue = source.isValue,
isInner = Flag.Class.IS_INNER(source.flags), isInner = source.isInner,
hasEnumEntries = Flag.Class.HAS_ENUM_ENTRIES(source.flags) hasEnumEntries = source.hasEnumEntries
) )
fun defaultEnumEntry( fun defaultEnumEntry(
@@ -296,26 +295,25 @@ object CirDeserializers {
) )
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
private inline fun classKind(flags: Flags): ClassKind = private inline fun classKind(kmClassKind: KmClassKind): ClassKind =
when { when (kmClassKind) {
Flag.Class.IS_CLASS(flags) -> ClassKind.CLASS KmClassKind.CLASS -> ClassKind.CLASS
Flag.Class.IS_INTERFACE(flags) -> ClassKind.INTERFACE KmClassKind.INTERFACE -> ClassKind.INTERFACE
Flag.Class.IS_ENUM_CLASS(flags) -> ClassKind.ENUM_CLASS KmClassKind.ENUM_CLASS -> ClassKind.ENUM_CLASS
Flag.Class.IS_ENUM_ENTRY(flags) -> ClassKind.ENUM_ENTRY KmClassKind.ENUM_ENTRY -> ClassKind.ENUM_ENTRY
Flag.Class.IS_ANNOTATION_CLASS(flags) -> ClassKind.ANNOTATION_CLASS KmClassKind.ANNOTATION_CLASS -> ClassKind.ANNOTATION_CLASS
Flag.Class.IS_OBJECT(flags) || Flag.Class.IS_COMPANION_OBJECT(flags) -> ClassKind.OBJECT KmClassKind.OBJECT, KmClassKind.COMPANION_OBJECT -> ClassKind.OBJECT
else -> error("Can't decode class kind from flags: $flags")
} }
fun constructor(source: KmConstructor, containingClass: CirContainingClass, typeResolver: CirTypeResolver): CirClassConstructor = fun constructor(source: KmConstructor, containingClass: CirContainingClass, typeResolver: CirTypeResolver): CirClassConstructor =
CirClassConstructor.create( CirClassConstructor.create(
annotations = annotations(source.flags, typeResolver, source::annotations), annotations = annotations(source.hasAnnotations, typeResolver, source::annotations),
typeParameters = emptyList(), // TODO: nowhere to read constructor type parameters from typeParameters = emptyList(), // TODO: nowhere to read constructor type parameters from
visibility = visibility(source.flags), visibility = visibility(source.visibility),
containingClass = containingClass, containingClass = containingClass,
valueParameters = source.valueParameters.compactMap { valueParameter(it, typeResolver) }, valueParameters = source.valueParameters.compactMap { valueParameter(it, typeResolver) },
hasStableParameterNames = !Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES(source.flags), hasStableParameterNames = !source.hasNonStableParameterNames,
isPrimary = !Flag.Constructor.IS_SECONDARY(source.flags) isPrimary = !source.isSecondary
) )
fun typeAlias(name: CirName, source: KmTypeAlias, typeResolver: CirTypeResolver): CirTypeAlias { fun typeAlias(name: CirName, source: KmTypeAlias, typeResolver: CirTypeResolver): CirTypeAlias {
@@ -323,10 +321,10 @@ object CirDeserializers {
val expandedType = underlyingType.unabbreviate() val expandedType = underlyingType.unabbreviate()
return CirTypeAlias.create( return CirTypeAlias.create(
annotations = annotations(source.flags, typeResolver, source::annotations), annotations = annotations(source.hasAnnotations, typeResolver, source::annotations),
name = name, name = name,
typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) }, typeParameters = source.typeParameters.compactMap { typeParameter(it, typeResolver) },
visibility = visibility(source.flags), visibility = visibility(source.visibility),
underlyingType = underlyingType, underlyingType = underlyingType,
expandedType = expandedType expandedType = expandedType
) )
@@ -335,7 +333,7 @@ object CirDeserializers {
private fun type(source: KmType, typeResolver: CirTypeResolver): CirType { private fun type(source: KmType, typeResolver: CirTypeResolver): CirType {
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
val source = source.abbreviatedType ?: source val source = source.abbreviatedType ?: source
val isMarkedNullable = Flag.Type.IS_NULLABLE(source.flags) val isMarkedNullable = source.isNullable
return when (val classifier = source.classifier) { return when (val classifier = source.classifier) {
is KmClassifier.Class -> { is KmClassifier.Class -> {
@@ -403,23 +401,22 @@ object CirDeserializers {
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
private inline fun modality(flags: Flags): Modality = private inline fun modality(kmModality: KmModality): Modality =
when { when (kmModality) {
Flag.Common.IS_FINAL(flags) -> Modality.FINAL KmModality.FINAL -> Modality.FINAL
Flag.Common.IS_ABSTRACT(flags) -> Modality.ABSTRACT KmModality.ABSTRACT -> Modality.ABSTRACT
Flag.Common.IS_OPEN(flags) -> Modality.OPEN KmModality.OPEN -> Modality.OPEN
Flag.Common.IS_SEALED(flags) -> Modality.SEALED KmModality.SEALED -> Modality.SEALED
else -> error("Can't decode modality from flags: $flags")
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
private inline fun visibility(flags: Flags): Visibility = private inline fun visibility(kmVisibility: KmVisibility): Visibility =
when { when (kmVisibility) {
Flag.Common.IS_PUBLIC(flags) -> Visibilities.Public KmVisibility.PUBLIC -> Visibilities.Public
Flag.Common.IS_PROTECTED(flags) -> Visibilities.Protected KmVisibility.PROTECTED -> Visibilities.Protected
Flag.Common.IS_INTERNAL(flags) -> Visibilities.Internal KmVisibility.INTERNAL -> Visibilities.Internal
Flag.Common.IS_PRIVATE(flags) -> Visibilities.Private KmVisibility.PRIVATE -> Visibilities.Private
else -> error("Can't decode visibility from flags: $flags") else -> error("Can't decode visibility $kmVisibility")
} }
} }
@@ -77,7 +77,7 @@ internal fun CirClass.serializeClass(
nestedFunctions: Collection<KmFunction>, nestedFunctions: Collection<KmFunction>,
nestedProperties: Collection<KmProperty> nestedProperties: Collection<KmProperty>
): KmClass = KmClass().also { clazz -> ): KmClass = KmClass().also { clazz ->
clazz.flags = classFlags(isExpect = context.isCommon) clazz.modifiersFrom(this, context.isCommon)
annotations.mapTo(clazz.annotations) { it.serializeAnnotation() } annotations.mapTo(clazz.annotations) { it.serializeAnnotation() }
typeParameters.serializeTypeParameters(context, output = clazz.typeParameters) typeParameters.serializeTypeParameters(context, output = clazz.typeParameters)
clazz.name = className clazz.name = className
@@ -89,7 +89,7 @@ internal fun CirClass.serializeClass(
directNestedClasses.forEach { directNestedClass -> directNestedClasses.forEach { directNestedClass ->
val shortClassName = directNestedClass.name.substringAfterLast('.') val shortClassName = directNestedClass.name.substringAfterLast('.')
if (Flag.Class.IS_ENUM_ENTRY(directNestedClass.flags)) { if (directNestedClass.kind == ClassKind.ENUM_ENTRY) {
clazz.enumEntries += shortClassName clazz.enumEntries += shortClassName
clazz.klibEnumEntries += KlibEnumEntry(name = shortClassName, annotations = directNestedClass.annotations) clazz.klibEnumEntries += KlibEnumEntry(name = shortClassName, annotations = directNestedClass.annotations)
} else { } else {
@@ -127,7 +127,7 @@ internal fun linkSealedClassesWithSubclasses(packageName: CirPackageName, classC
internal fun CirClassConstructor.serializeConstructor( internal fun CirClassConstructor.serializeConstructor(
context: CirTreeSerializationContext context: CirTreeSerializationContext
): KmConstructor = KmConstructor().also { constructor -> ): KmConstructor = KmConstructor().also { constructor ->
constructor.flags = classConstructorFlags() constructor.modifiersFrom(this)
annotations.mapTo(constructor.annotations) { it.serializeAnnotation() } annotations.mapTo(constructor.annotations) { it.serializeAnnotation() }
// TODO: nowhere to write constructor type parameters // TODO: nowhere to write constructor type parameters
valueParameters.mapTo(constructor.valueParameters) { it.serializeValueParameter(context) } valueParameters.mapTo(constructor.valueParameters) { it.serializeValueParameter(context) }
@@ -138,7 +138,7 @@ internal fun CirTypeAlias.serializeTypeAlias(
): KmTypeAlias = KmTypeAlias( ): KmTypeAlias = KmTypeAlias(
name = name.name name = name.name
).also { typeAlias -> ).also { typeAlias ->
typeAlias.flags = typeAliasFlags() typeAlias.modifiersFrom(this)
annotations.mapTo(typeAlias.annotations) { it.serializeAnnotation() } annotations.mapTo(typeAlias.annotations) { it.serializeAnnotation() }
typeParameters.serializeTypeParameters(context, output = typeAlias.typeParameters) typeParameters.serializeTypeParameters(context, output = typeAlias.typeParameters)
typeAlias.underlyingType = underlyingType.serializeType(context, expansion = ONLY_ABBREVIATIONS) typeAlias.underlyingType = underlyingType.serializeType(context, expansion = ONLY_ABBREVIATIONS)
@@ -148,9 +148,9 @@ internal fun CirTypeAlias.serializeTypeAlias(
internal fun CirProperty.serializeProperty( internal fun CirProperty.serializeProperty(
context: CirTreeSerializationContext, context: CirTreeSerializationContext,
): KmProperty = KmProperty(name = name.name).also { property -> ): KmProperty = KmProperty(name = name.name).also { property ->
property.flags = propertyFlags(isExpect = context.isCommon && !isLiftedUp) property.modifiersFrom(this, isExpect = context.isCommon && !isLiftedUp)
property.getterFlags = getter?.propertyAccessorFlags(this, this) ?: NO_FLAGS this.getter?.let { property.getter.modifiersFrom(it, this, this) }
property.setterFlags = setter?.let { setter -> setter.propertyAccessorFlags(setter, this) } ?: NO_FLAGS property.setter = this.setter?.let { KmPropertyAccessorAttributes().apply { modifiersFrom(it, it, this@serializeProperty) } }
annotations.mapTo(property.annotations) { it.serializeAnnotation() } annotations.mapTo(property.annotations) { it.serializeAnnotation() }
getter?.annotations?.mapTo(property.getterAnnotations) { it.serializeAnnotation() } getter?.annotations?.mapTo(property.getterAnnotations) { it.serializeAnnotation() }
setter?.annotations?.mapTo(property.setterAnnotations) { it.serializeAnnotation() } setter?.annotations?.mapTo(property.setterAnnotations) { it.serializeAnnotation() }
@@ -180,7 +180,7 @@ internal fun CirFunction.serializeFunction(
): KmFunction = KmFunction( ): KmFunction = KmFunction(
name = name.name name = name.name
).also { function -> ).also { function ->
function.flags = functionFlags(isExpect = context.isCommon && kind != CallableMemberDescriptor.Kind.SYNTHESIZED) function.modifiersFrom(this, isExpect = context.isCommon && kind != CallableMemberDescriptor.Kind.SYNTHESIZED)
annotations.mapTo(function.annotations) { it.serializeAnnotation() } annotations.mapTo(function.annotations) { it.serializeAnnotation() }
typeParameters.serializeTypeParameters(context, output = function.typeParameters) typeParameters.serializeTypeParameters(context, output = function.typeParameters)
valueParameters.mapTo(function.valueParameters) { it.serializeValueParameter(context) } valueParameters.mapTo(function.valueParameters) { it.serializeValueParameter(context) }
@@ -241,7 +241,7 @@ private fun CirValueParameter.serializeValueParameter(
): KmValueParameter = KmValueParameter( ): KmValueParameter = KmValueParameter(
name = name.name name = name.name
).also { parameter -> ).also { parameter ->
parameter.flags = valueParameterFlags() parameter.modifiersFrom(this)
annotations.mapTo(parameter.annotations) { it.serializeAnnotation() } annotations.mapTo(parameter.annotations) { it.serializeAnnotation() }
parameter.type = returnType.serializeType(context) parameter.type = returnType.serializeType(context)
varargElementType?.let { varargElementType -> varargElementType?.let { varargElementType ->
@@ -259,7 +259,7 @@ private fun List<CirTypeParameter>.serializeTypeParameters(
id = context.typeParameterIndexOffset + index, id = context.typeParameterIndexOffset + index,
variance = cirTypeParameter.variance.serializeVariance() variance = cirTypeParameter.variance.serializeVariance()
).also { parameter -> ).also { parameter ->
parameter.flags = cirTypeParameter.typeParameterFlags() parameter.isReified = cirTypeParameter.isReified
cirTypeParameter.upperBounds.mapTo(parameter.upperBounds) { it.serializeType(context) } cirTypeParameter.upperBounds.mapTo(parameter.upperBounds) { it.serializeType(context) }
cirTypeParameter.annotations.mapTo(parameter.annotations) { it.serializeAnnotation() } cirTypeParameter.annotations.mapTo(parameter.annotations) { it.serializeAnnotation() }
} }
@@ -220,15 +220,15 @@ private class CirTreeSerializationVisitor(
clazz: KmClass, clazz: KmClass,
classContext: CirTreeSerializationContext classContext: CirTreeSerializationContext
) = logDeclaration(classContext.targetIndex) { ) = logDeclaration(classContext.targetIndex) {
val declarationType = when { val declarationType = when (clazz.kind) {
Flag.Class.IS_ENUM_CLASS(clazz.flags) -> DeclarationType.ENUM_CLASS ClassKind.ENUM_CLASS -> DeclarationType.ENUM_CLASS
Flag.Class.IS_ENUM_ENTRY(clazz.flags) -> DeclarationType.ENUM_ENTRY ClassKind.ENUM_ENTRY -> DeclarationType.ENUM_ENTRY
Flag.Class.IS_INTERFACE(clazz.flags) -> when { ClassKind.INTERFACE -> when {
(classContext.currentPath as Path.Classifier).classifierId.isNestedEntity -> DeclarationType.NESTED_INTERFACE (classContext.currentPath as Path.Classifier).classifierId.isNestedEntity -> DeclarationType.NESTED_INTERFACE
else -> DeclarationType.TOP_LEVEL_INTERFACE else -> DeclarationType.TOP_LEVEL_INTERFACE
} }
else -> when { else -> when {
Flag.Class.IS_COMPANION_OBJECT(clazz.flags) -> DeclarationType.COMPANION_OBJECT clazz.kind == ClassKind.COMPANION_OBJECT -> DeclarationType.COMPANION_OBJECT
(classContext.currentPath as Path.Classifier).classifierId.isNestedEntity -> DeclarationType.NESTED_CLASS (classContext.currentPath as Path.Classifier).classifierId.isNestedEntity -> DeclarationType.NESTED_CLASS
else -> DeclarationType.TOP_LEVEL_CLASS else -> DeclarationType.TOP_LEVEL_CLASS
} }
@@ -435,7 +435,7 @@ internal class ClassConsumer {
fun consume(clazz: KmClass) { fun consume(clazz: KmClass) {
_allClasses += clazz _allClasses += clazz
if (Flag.Common.IS_SEALED(clazz.flags)) _sealedClasses += clazz if (clazz.modality == Modality.SEALED) _sealedClasses += clazz
} }
fun reset() { fun reset() {
@@ -6,56 +6,59 @@
package org.jetbrains.kotlin.commonizer.metadata package org.jetbrains.kotlin.commonizer.metadata
import kotlinx.metadata.* import kotlinx.metadata.*
import kotlinx.metadata.Modality as KmModality
import kotlinx.metadata.ClassKind as KmClassKind
import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.cir.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
internal const val NO_FLAGS: Flags = 0 internal fun KmFunction.modifiersFrom(cf: CirFunction, isExpect: Boolean) {
hasAnnotations = cf.hasAnnotations
internal fun CirFunction.functionFlags(isExpect: Boolean): Flags = visibility = cf.kmVisibility
flagsOfNotNull( modality = cf.kmModality
hasAnnotationsFlag, kind = cf.kind.kmMemberKind
visibilityFlag, hasNonStableParameterNames = !cf.hasStableParameterNames
modalityFlag, this.isExpect = isExpect
memberKindFlag, isOperator = cf.modifiers.isOperator
Flag.Function.HAS_NON_STABLE_PARAMETER_NAMES.takeIf { !hasStableParameterNames }, isInfix = cf.modifiers.isInfix
Flag.Function.IS_EXPECT.takeIf { isExpect } isInline = cf.modifiers.isInline
) or modifiers.modifiersFlags isSuspend = cf.modifiers.isSuspend
internal fun CirProperty.propertyFlags(isExpect: Boolean): Flags =
flagsOfNotNull(
hasAnnotationsFlag,
visibilityFlag,
modalityFlag,
memberKindFlag,
Flag.Property.HAS_GETTER.takeIf { getter != null },
Flag.Property.HAS_SETTER.takeIf { setter != null },
Flag.Property.IS_DELEGATED.takeIf { isDelegate },
Flag.Property.IS_EXPECT.takeIf { isExpect }
) or modifiersFlags
internal fun CirPropertyAccessor.propertyAccessorFlags(
visibilityHolder: CirHasVisibility,
modalityHolder: CirHasModality
): Flags {
return flagsOfNotNull(
hasAnnotationsFlag,
visibilityHolder.visibilityFlag,
modalityHolder.modalityFlag,
Flag.PropertyAccessor.IS_NOT_DEFAULT.takeIf { !isDefault },
Flag.PropertyAccessor.IS_INLINE.takeIf { isInline }
)
} }
internal fun CirClassConstructor.classConstructorFlags(): Flags = internal fun KmProperty.modifiersFrom(cp: CirProperty, isExpect: Boolean) {
flagsOfNotNull( hasAnnotations = cp.hasAnnotations
hasAnnotationsFlag, visibility = cp.kmVisibility
visibilityFlag, modality = cp.kmModality
Flag.Constructor.IS_SECONDARY.takeIf { !isPrimary }, kind = cp.kind.kmMemberKind
Flag.Constructor.HAS_NON_STABLE_PARAMETER_NAMES.takeIf { !hasStableParameterNames } hasGetter = cp.getter != null
) hasSetter = cp.setter != null
isDelegated = cp.isDelegate
this.isExpect = isExpect
isVar = cp.isVar
isConst = cp.isConst
hasConstant = cp.compileTimeInitializer.takeIf { it !is CirConstantValue.NullValue } != null
isLateinit = cp.isLateInit
}
internal fun KmPropertyAccessorAttributes.modifiersFrom(
cp: CirPropertyAccessor, visibilityHolder: CirHasVisibility,
modalityHolder: CirHasModality,
) {
hasAnnotations = cp.hasAnnotations
visibility = visibilityHolder.kmVisibility
modality = modalityHolder.kmModality
isNotDefault = !cp.isDefault
isInline = cp.isInline
}
internal fun KmConstructor.modifiersFrom(cc: CirClassConstructor) {
hasAnnotations = cc.hasAnnotations
visibility = cc.kmVisibility
isSecondary = !cc.isPrimary
hasNonStableParameterNames = !cc.hasStableParameterNames
}
internal fun CirType.applyTypeFlagsTo(type: KmType) { internal fun CirType.applyTypeFlagsTo(type: KmType) {
type.isNullable = when (this) { type.isNullable = when (this) {
@@ -65,111 +68,79 @@ internal fun CirType.applyTypeFlagsTo(type: KmType) {
//Flag.Type.IS_SUSPEND.takeIf { false } //Flag.Type.IS_SUSPEND.takeIf { false }
} }
internal fun CirTypeParameter.typeParameterFlags(): Flags = internal fun KmValueParameter.modifiersFrom(cv: CirValueParameter) {
flagsOfNotNull( hasAnnotations = cv.hasAnnotations
Flag.TypeParameter.IS_REIFIED.takeIf { isReified } declaresDefaultValue = cv.declaresDefaultValue
) isCrossinline = cv.isCrossinline
isNoinline = cv.isNoinline
}
internal fun CirValueParameter.valueParameterFlags(): Flags = internal fun KmClass.modifiersFrom(cc: CirClass, isExpect: Boolean) {
flagsOfNotNull( hasAnnotations = cc.hasAnnotations
hasAnnotationsFlag, visibility = cc.kmVisibility
Flag.ValueParameter.DECLARES_DEFAULT_VALUE.takeIf { declaresDefaultValue }, modality = cc.kmModality
Flag.ValueParameter.IS_CROSSINLINE.takeIf { isCrossinline }, kind = cc.kmClassKind
Flag.ValueParameter.IS_NOINLINE.takeIf { isNoinline } isInner = cc.isInner
) isData = cc.isData
this.isExpect = isExpect
isValue = cc.isValue
hasEnumEntries = cc.hasEnumEntries
//Flag.Class.IS_FUN.takeIf { false }
}
internal fun CirClass.classFlags(isExpect: Boolean): Flags = internal fun KmTypeAlias.modifiersFrom(ct: CirTypeAlias) {
flagsOfNotNull( hasAnnotations = ct.hasAnnotations
hasAnnotationsFlag, visibility = ct.kmVisibility
visibilityFlag, }
modalityFlag,
classKindFlag,
Flag.Class.IS_COMPANION_OBJECT.takeIf { isCompanion },
Flag.Class.IS_INNER.takeIf { isInner },
Flag.Class.IS_DATA.takeIf { isData },
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 }
)
internal fun CirTypeAlias.typeAliasFlags(): Flags = private inline val CirHasAnnotations.hasAnnotations: Boolean
flagsOfNotNull( get() = annotations.isNotEmpty()
hasAnnotationsFlag,
visibilityFlag
)
private inline val CirHasAnnotations.hasAnnotationsFlag: Flag?
get() = if (annotations.isNotEmpty()) Flag.Common.HAS_ANNOTATIONS else null
// Since 1.4.30 a special @JvmInline annotation is generated to distinguish JVM-inline from value classes. // Since 1.4.30 a special @JvmInline annotation is generated to distinguish JVM-inline from value classes.
// This has an effect on class serialization: Every class with isValue == true automatically gets HAS_ANNOTATIONS flag. // This has an effect on class serialization: Every class with isValue == true automatically gets HAS_ANNOTATIONS flag.
private inline val CirClass.hasAnnotationsFlag: Flag? private inline val CirClass.hasAnnotations: Boolean
get() = if (annotations.isNotEmpty() || isValue) Flag.Common.HAS_ANNOTATIONS else null get() = annotations.isNotEmpty() || isValue
private inline val CirProperty.hasAnnotationsFlag: Flag? private inline val CirProperty.hasAnnotations: Boolean
get() = if (annotations.isNotEmpty() || !backingFieldAnnotations.isNullOrEmpty() || !delegateFieldAnnotations.isNullOrEmpty()) get() = annotations.isNotEmpty() || backingFieldAnnotations.isNotEmpty() || delegateFieldAnnotations.isNotEmpty()
Flag.Common.HAS_ANNOTATIONS
else
null
private inline val CirHasVisibility.visibilityFlag: Flag private inline val CirHasVisibility.kmVisibility: Visibility
get() = when (visibility) { get() = when (visibility) {
Visibilities.Public -> Flag.Common.IS_PUBLIC Visibilities.Public -> Visibility.PUBLIC
Visibilities.Protected -> Flag.Common.IS_PROTECTED Visibilities.Protected -> Visibility.PROTECTED
Visibilities.Internal -> Flag.Common.IS_INTERNAL Visibilities.Internal -> Visibility.INTERNAL
Visibilities.Private -> Flag.Common.IS_PRIVATE Visibilities.Private -> Visibility.PRIVATE
else -> error("Unexpected visibility: $this") else -> error("Unexpected visibility: $this")
} }
private inline val CirHasModality.modalityFlag: Flag private inline val CirHasModality.kmModality: KmModality
get() = when (modality) { get() = when (modality) {
Modality.FINAL -> Flag.Common.IS_FINAL Modality.FINAL -> KmModality.FINAL
Modality.ABSTRACT -> Flag.Common.IS_ABSTRACT Modality.ABSTRACT -> KmModality.ABSTRACT
Modality.OPEN -> Flag.Common.IS_OPEN Modality.OPEN -> KmModality.OPEN
Modality.SEALED -> Flag.Common.IS_SEALED Modality.SEALED -> KmModality.SEALED
} }
private inline val CirFunction.memberKindFlag: Flag private inline val CallableMemberDescriptor.Kind.kmMemberKind: MemberKind
get() = when (kind) { get() = when (this) {
CallableMemberDescriptor.Kind.DECLARATION -> Flag.Function.IS_DECLARATION CallableMemberDescriptor.Kind.DECLARATION -> MemberKind.DECLARATION
CallableMemberDescriptor.Kind.FAKE_OVERRIDE -> Flag.Function.IS_FAKE_OVERRIDE CallableMemberDescriptor.Kind.FAKE_OVERRIDE -> MemberKind.FAKE_OVERRIDE
CallableMemberDescriptor.Kind.DELEGATION -> Flag.Function.IS_DELEGATION CallableMemberDescriptor.Kind.DELEGATION -> MemberKind.DELEGATION
CallableMemberDescriptor.Kind.SYNTHESIZED -> Flag.Function.IS_SYNTHESIZED CallableMemberDescriptor.Kind.SYNTHESIZED -> MemberKind.SYNTHESIZED
} }
private inline val CirProperty.memberKindFlag: Flag private inline val CirClass.kmClassKind: KmClassKind
get() = when (kind) { get() {
CallableMemberDescriptor.Kind.DECLARATION -> Flag.Property.IS_DECLARATION if (isCompanion) return KmClassKind.COMPANION_OBJECT
CallableMemberDescriptor.Kind.FAKE_OVERRIDE -> Flag.Property.IS_FAKE_OVERRIDE return when (kind) {
CallableMemberDescriptor.Kind.DELEGATION -> Flag.Property.IS_DELEGATION ClassKind.CLASS -> KmClassKind.CLASS
CallableMemberDescriptor.Kind.SYNTHESIZED -> Flag.Property.IS_SYNTHESIZED ClassKind.INTERFACE -> KmClassKind.INTERFACE
ClassKind.ENUM_CLASS -> KmClassKind.ENUM_CLASS
ClassKind.ENUM_ENTRY -> KmClassKind.ENUM_ENTRY
ClassKind.ANNOTATION_CLASS -> KmClassKind.ANNOTATION_CLASS
ClassKind.OBJECT -> KmClassKind.OBJECT
}
} }
private inline val CirClass.classKindFlag: Flag
get() = when (kind) {
ClassKind.CLASS -> Flag.Class.IS_CLASS
ClassKind.INTERFACE -> Flag.Class.IS_INTERFACE
ClassKind.ENUM_CLASS -> Flag.Class.IS_ENUM_CLASS
ClassKind.ENUM_ENTRY -> Flag.Class.IS_ENUM_ENTRY
ClassKind.ANNOTATION_CLASS -> Flag.Class.IS_ANNOTATION_CLASS
ClassKind.OBJECT -> Flag.Class.IS_OBJECT
}
private inline val CirFunctionModifiers.modifiersFlags: Flags
get() = flagsOfNotNull(
Flag.Function.IS_OPERATOR.takeIf { isOperator },
Flag.Function.IS_INFIX.takeIf { isInfix },
Flag.Function.IS_INLINE.takeIf { isInline },
Flag.Function.IS_SUSPEND.takeIf { isSuspend },
)
private inline val CirProperty.modifiersFlags: Flags
get() = flagsOfNotNull(
Flag.Property.IS_VAR.takeIf { isVar },
Flag.Property.IS_CONST.takeIf { isConst },
Flag.Property.HAS_CONSTANT.takeIf { compileTimeInitializer.takeIf { it !is CirConstantValue.NullValue } != null },
Flag.Property.IS_LATEINIT.takeIf { isLateInit },
)
private fun flagsOfNotNull(vararg flags: Flag?): Flags = flagsOf(*listOfNotNull(*flags).toTypedArray())
@@ -3,6 +3,8 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:Suppress("DEPRECATION") // TODO: kotlinx.metadata Flags API. Usage here is too big.
package org.jetbrains.kotlin.commonizer.metadata.utils package org.jetbrains.kotlin.commonizer.metadata.utils
import com.intellij.util.containers.FactoryMap import com.intellij.util.containers.FactoryMap
@@ -972,8 +974,8 @@ class MetadataDeclarationsComparator private constructor(private val config: Con
private fun compareFlags( private fun compareFlags(
containerContext: Context, containerContext: Context,
flagsA: Flags, flagsA: Int,
flagsB: Flags, flagsB: Int,
flagsToCompare: Array<KProperty0<Flag>>, flagsToCompare: Array<KProperty0<Flag>>,
flagKind: FlagKind = FlagKind.REGULAR flagKind: FlagKind = FlagKind.REGULAR
) { ) {
@@ -5,8 +5,7 @@
package org.jetbrains.kotlin.commonizer.tree.deserializer package org.jetbrains.kotlin.commonizer.tree.deserializer
import kotlinx.metadata.Flag import kotlinx.metadata.*
import kotlinx.metadata.KmClass
import org.jetbrains.kotlin.commonizer.metadata.CirDeserializers import org.jetbrains.kotlin.commonizer.metadata.CirDeserializers
import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver
import org.jetbrains.kotlin.commonizer.tree.CirTreeClass import org.jetbrains.kotlin.commonizer.tree.CirTreeClass
@@ -29,7 +28,7 @@ internal class CirTreeClassDeserializer(
val cirClass = when (classEntry) { val cirClass = when (classEntry) {
is ClassesToProcess.ClassEntry.RegularClassEntry -> { is ClassesToProcess.ClassEntry.RegularClassEntry -> {
clazz = classEntry.clazz clazz = classEntry.clazz
isEnumEntry = Flag.Class.IS_ENUM_ENTRY(clazz.flags) isEnumEntry = clazz.kind == ClassKind.ENUM_ENTRY
CirDeserializers.clazz(className, clazz, classTypeResolver) CirDeserializers.clazz(className, clazz, classTypeResolver)
} }
is ClassesToProcess.ClassEntry.EnumEntry -> { is ClassesToProcess.ClassEntry.EnumEntry -> {
@@ -40,7 +39,7 @@ internal class CirTreeClassDeserializer(
name = className, name = className,
annotations = classEntry.annotations, annotations = classEntry.annotations,
enumClassId = classEntry.enumClassId, enumClassId = classEntry.enumClassId,
hasEnumEntries = Flag.Class.HAS_ENUM_ENTRIES(classEntry.enumClass.flags), hasEnumEntries = classEntry.enumClass.hasEnumEntries,
typeResolver = classTypeResolver typeResolver = classTypeResolver
) )
} }
@@ -6,9 +6,7 @@
package org.jetbrains.kotlin.commonizer.tree.deserializer package org.jetbrains.kotlin.commonizer.tree.deserializer
import com.intellij.util.containers.FactoryMap import com.intellij.util.containers.FactoryMap
import kotlinx.metadata.Flag import kotlinx.metadata.*
import kotlinx.metadata.KmAnnotation
import kotlinx.metadata.KmClass
import kotlinx.metadata.internal.common.KmModuleFragment import kotlinx.metadata.internal.common.KmModuleFragment
import kotlinx.metadata.klib.klibEnumEntries import kotlinx.metadata.klib.klibEnumEntries
import org.jetbrains.kotlin.commonizer.cir.CirEntityId import org.jetbrains.kotlin.commonizer.cir.CirEntityId
@@ -44,7 +42,7 @@ internal class ClassesToProcess {
val classId: CirEntityId = CirEntityId.create(clazz.name) val classId: CirEntityId = CirEntityId.create(clazz.name)
val parentClassId: CirEntityId = classId.getParentEntityId() ?: NON_EXISTING_CLASSIFIER_ID val parentClassId: CirEntityId = classId.getParentEntityId() ?: NON_EXISTING_CLASSIFIER_ID
if (Flag.Class.IS_ENUM_CLASS(clazz.flags)) { if (clazz.kind == ClassKind.ENUM_CLASS) {
clazz.klibEnumEntries.forEach { entry -> clazz.klibEnumEntries.forEach { entry ->
val enumEntryId = classId.createNestedEntityId(CirName.create(entry.name)) val enumEntryId = classId.createNestedEntityId(CirName.create(entry.name))
klibEnumEntries[enumEntryId] = ClassEntry.EnumEntry(enumEntryId, entry.annotations, classId, clazz) klibEnumEntries[enumEntryId] = ClassEntry.EnumEntry(enumEntryId, entry.annotations, classId, clazz)
@@ -5,9 +5,7 @@
package org.jetbrains.kotlin.commonizer.utils package org.jetbrains.kotlin.commonizer.utils
import kotlinx.metadata.Flag import kotlinx.metadata.*
import kotlinx.metadata.KmFunction
import kotlinx.metadata.KmProperty
import kotlinx.metadata.klib.annotations import kotlinx.metadata.klib.annotations
internal const val KNI_BRIDGE_FUNCTION_PREFIX = "kniBridge" internal const val KNI_BRIDGE_FUNCTION_PREFIX = "kniBridge"
@@ -21,9 +19,7 @@ internal inline fun KmFunction.isTopLevelDeprecatedFunction(isTopLevel: Boolean)
isTopLevel && annotations.any { it.className == DEPRECATED_ANNOTATION_FULL_NAME } isTopLevel && annotations.any { it.className == DEPRECATED_ANNOTATION_FULL_NAME }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
internal inline fun KmProperty.isFakeOverride() = internal inline fun KmProperty.isFakeOverride() = this.kind == MemberKind.FAKE_OVERRIDE
Flag.Property.IS_FAKE_OVERRIDE(flags)
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
internal inline fun KmFunction.isFakeOverride() = internal inline fun KmFunction.isFakeOverride() = this.kind == MemberKind.FAKE_OVERRIDE
Flag.Function.IS_FAKE_OVERRIDE(flags)
@@ -14,10 +14,10 @@ internal inline val KmClass.filteredSupertypes: List<KmType>
get() = supertypes.takeUnless { it.singleOrNull()?.isAny == true } ?: emptyList() get() = supertypes.takeUnless { it.singleOrNull()?.isAny == true } ?: emptyList()
private inline val KmType.isNullableAny: Boolean private inline val KmType.isNullableAny: Boolean
get() = (classifier as? KmClassifier.Class)?.name == ANY_CLASS_FULL_NAME && Flag.Type.IS_NULLABLE(flags) get() = (classifier as? KmClassifier.Class)?.name == ANY_CLASS_FULL_NAME && this.isNullable
private inline val KmType.isAny: Boolean private inline val KmType.isAny: Boolean
get() = (classifier as? KmClassifier.Class)?.name == ANY_CLASS_FULL_NAME && !Flag.Type.IS_NULLABLE(flags) get() = (classifier as? KmClassifier.Class)?.name == ANY_CLASS_FULL_NAME && !this.isNullable
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.jvm.abi package org.jetbrains.kotlin.jvm.abi
import kotlinx.metadata.Flag
import kotlinx.metadata.Flags
import kotlinx.metadata.KmClass import kotlinx.metadata.KmClass
import kotlinx.metadata.KmPackage import kotlinx.metadata.KmPackage
import kotlinx.metadata.Visibility
import kotlinx.metadata.jvm.KotlinClassMetadata import kotlinx.metadata.jvm.KotlinClassMetadata
import kotlinx.metadata.jvm.Metadata import kotlinx.metadata.jvm.Metadata
import kotlinx.metadata.jvm.localDelegatedProperties import kotlinx.metadata.jvm.localDelegatedProperties
import kotlinx.metadata.visibility
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.* import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import org.jetbrains.org.objectweb.asm.AnnotationVisitor import org.jetbrains.org.objectweb.asm.AnnotationVisitor
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
@@ -154,19 +154,19 @@ private fun AnnotationVisitor.visitKotlinMetadata(header: Metadata) {
} }
private fun KmClass.removePrivateDeclarations() { private fun KmClass.removePrivateDeclarations() {
constructors.removeIf { isPrivateDeclaration(it.flags) } constructors.removeIf { it.visibility.isPrivate }
functions.removeIf { isPrivateDeclaration(it.flags) } functions.removeIf { it.visibility.isPrivate }
properties.removeIf { isPrivateDeclaration(it.flags) } properties.removeIf { it.visibility.isPrivate }
localDelegatedProperties.clear() localDelegatedProperties.clear()
// TODO: do not serialize private type aliases once KT-17229 is fixed. // TODO: do not serialize private type aliases once KT-17229 is fixed.
} }
private fun KmPackage.removePrivateDeclarations() { private fun KmPackage.removePrivateDeclarations() {
functions.removeIf { isPrivateDeclaration(it.flags) } functions.removeIf { it.visibility.isPrivate }
properties.removeIf { isPrivateDeclaration(it.flags) } properties.removeIf { it.visibility.isPrivate }
localDelegatedProperties.clear() localDelegatedProperties.clear()
// TODO: do not serialize private type aliases once KT-17229 is fixed. // TODO: do not serialize private type aliases once KT-17229 is fixed.
} }
private fun isPrivateDeclaration(flags: Flags): Boolean = private val Visibility.isPrivate: Boolean
Flag.IS_PRIVATE(flags) || Flag.IS_PRIVATE_TO_THIS(flags) || Flag.IS_LOCAL(flags) get() = this == Visibility.PRIVATE || this == Visibility.PRIVATE_TO_THIS || this == Visibility.LOCAL