From 8b821e1feb5578e06b87e8bcc2e70ccecc69dc57 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 1 Aug 2023 14:16:53 +0200 Subject: [PATCH] Deprecate KmProperty.hasGetter(hasSetter) in favor of KmProperty.getter(setter) as a follow-up of flag deprecation. #KT-59440 --- .../native/interop/gen/StubIrMetadataEmitter.kt | 2 -- .../src/kotlinx/metadata/Attributes.kt | 4 ++++ .../src/kotlinx/metadata/Nodes.kt | 17 +++++++++++++---- .../src/kotlinx/metadata/internal/Writers.kt | 4 ++-- .../org/jetbrains/kotlin/kotlinp/printers.kt | 8 +++----- .../commonizer/metadata/CirDeserializers.kt | 6 ------ .../kotlin/commonizer/metadata/flags.kt | 2 -- 7 files changed, 22 insertions(+), 21 deletions(-) diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt index 668d56169ca..d8b10bc0fc8 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt @@ -281,12 +281,10 @@ private class MappingExtensions( modality = ps.modality.kmModality kind = MemberKind.DECLARATION hasAnnotations = ps.annotations.isNotEmpty() - hasGetter = true when (ps.kind) { is PropertyStub.Kind.Val -> {} is PropertyStub.Kind.Var -> { isVar = true - hasGetter = true } is PropertyStub.Kind.Constant -> { isConst = true diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Attributes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Attributes.kt index 4575c42b3ad..b13a19202a6 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/Attributes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Attributes.kt @@ -290,17 +290,21 @@ public var KmProperty.kind: MemberKind by memberKindDelegate(KmProperty::flags) /** * Indicates that the corresponding property is `var`. + * + * Note that setting [KmProperty.isVar] to true does not automatically create [KmProperty.setter] and vice versa. This has to be done explicitly. */ public var KmProperty.isVar: Boolean by propertyBooleanFlag(Flag(ProtoFlags.IS_VAR)) /** * Indicates that the corresponding property has a getter. */ +@Deprecated("Kotlin properties always have getters", ReplaceWith("true"), DeprecationLevel.WARNING) public var KmProperty.hasGetter: Boolean by propertyBooleanFlag(Flag(ProtoFlags.HAS_GETTER)) /** * Indicates that the corresponding property has a setter. */ +@Deprecated("Check .setter for nullability instead", ReplaceWith("this.setter != null"), DeprecationLevel.WARNING) public var KmProperty.hasSetter: Boolean by propertyBooleanFlag(Flag(ProtoFlags.HAS_SETTER)) /** diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt index 9bb6402ddab..9146c23517a 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt @@ -7,8 +7,11 @@ package kotlinx.metadata +import kotlinx.metadata.internal.Flag import kotlinx.metadata.internal.extensions.* import kotlinx.metadata.internal.getDefaultPropertyAccessorFlags +import kotlinx.metadata.internal.propertyBooleanFlag +import org.jetbrains.kotlin.metadata.deserialization.Flags import kotlin.contracts.ExperimentalContracts /** @@ -499,23 +502,29 @@ public class KmProperty @Deprecated(flagsCtorDeprecated) constructor( public constructor(name: String) : this(0, name, 0, 0) + // needed for reading/writing flags back to protobuf as a whole pack + private var _hasSetter: Boolean by propertyBooleanFlag(Flag(Flags.HAS_SETTER)) + private var _hasGetter: Boolean by propertyBooleanFlag(Flag(Flags.HAS_GETTER)) + /** * Attributes of the getter of this property. * Attributes can be retrieved with extension properties, such as [KmPropertyAccessorAttributes.visibility] or [KmPropertyAccessorAttributes.isNotDefault]. * * Getter for property is always present, hence return type of this function is non-nullable. */ - public val getter: KmPropertyAccessorAttributes = KmPropertyAccessorAttributes(getterFlags) + public val getter: KmPropertyAccessorAttributes = KmPropertyAccessorAttributes(getterFlags).also { _hasGetter = true } /** * Attributes of the setter of this property. * Attributes can be retrieved with extension properties, such as [KmPropertyAccessorAttributes.visibility] or [KmPropertyAccessorAttributes.isNotDefault]. * * Returns null if setter is absent, i.e. [KmProperty.isVar] is false. + * + * Note that setting [KmProperty.isVar] to true does not automatically create [KmProperty.setter] and vice versa. This has to be done explicitly. */ - public var setter: KmPropertyAccessorAttributes? = if (this.hasSetter) KmPropertyAccessorAttributes(setterFlags) else null + public var setter: KmPropertyAccessorAttributes? = if (this._hasSetter) KmPropertyAccessorAttributes(setterFlags) else null set(new) { - this.hasSetter = new != null + this._hasSetter = new != null field = new } @@ -547,7 +556,7 @@ public class KmProperty @Deprecated(flagsCtorDeprecated) constructor( * This behavior is for compatibility only and will be removed in future versions. */ @Deprecated("$flagAccessPrefix KmProperty.setter, such as KmProperty.setter.isNotDefault") - public var setterFlags: Int = getDefaultPropertyAccessorFlags(flags) + public var setterFlags: Int = setterFlags // It's either the correct flags from deserializer, or always 0 in the case of hand-created property get() = setter?.flags ?: field set(value) { setter?.flags = value diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt index 8e885c580d7..8ca278b75d5 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt @@ -165,8 +165,8 @@ public fun WriteContext.writeProperty(kmProperty: KmProperty): ProtoBuf.Property t.flags = kmProperty.flags } // TODO: do not write getterFlags/setterFlags if not needed - if (kmProperty.hasGetter) t.getterFlags = kmProperty.getterFlags - if (kmProperty.hasSetter) t.setterFlags = kmProperty.setterFlags + t.getterFlags = kmProperty.getter.flags + if (kmProperty.setter != null) t.setterFlags = kmProperty.setter!!.flags return t } diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index ad0575ea1b8..49f1686cd0b 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -99,11 +99,9 @@ private fun visitProperty( sb.append(" /* = ... */") } sb.appendLine() - if (property.hasGetter) { - sb.append(" ") - sb.appendPropertyAccessorModifiers(property.getter) - sb.appendLine("get") - } + sb.append(" ") + sb.appendPropertyAccessorModifiers(property.getter) + sb.appendLine("get") val setter = property.setter if (setter != null) { sb.append(" ") diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt index 3c8e9e7c200..68f5e0490cc 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/CirDeserializers.kt @@ -123,9 +123,6 @@ object CirDeserializers { } private fun propertyGetter(source: KmProperty, typeResolver: CirTypeResolver): CirPropertyGetter? { - if (!source.hasGetter) - return null - val isDefault = !source.getter.isNotDefault val annotations = annotations(source.getter.hasAnnotations, typeResolver, source::getterAnnotations) @@ -140,9 +137,6 @@ object CirDeserializers { } private fun propertySetter(source: KmProperty, typeResolver: CirTypeResolver): CirPropertySetter? { - if (!source.hasSetter) - return null - val setter = source.setter ?: return null return CirPropertySetter.createInterned( diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/flags.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/flags.kt index 44d652e915a..bafd143e8de 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/flags.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/metadata/flags.kt @@ -32,8 +32,6 @@ internal fun KmProperty.modifiersFrom(cp: CirProperty, isExpect: Boolean) { visibility = cp.kmVisibility modality = cp.kmModality kind = cp.kind.kmMemberKind - hasGetter = cp.getter != null - hasSetter = cp.setter != null isDelegated = cp.isDelegate this.isExpect = isExpect isVar = cp.isVar