From 3564f4ae407b71797a7090d495108d16ef5a1013 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 7 May 2019 15:26:15 +0200 Subject: [PATCH] Make KmExtensionType.klass private, add KmExtensionVisitor.type Since the only use case of KmExtensionType in user code is checking if it equals some other KmExtensionType instance, we'd like to hide as much of its implementation details as possible, in case we want to change it in the future --- libraries/kotlinx-metadata/jvm/ChangeLog.md | 2 ++ .../src/kotlinx/metadata/jvm/jvmExtensions.kt | 21 +++++++++++++++++++ .../src/kotlinx/metadata/extensions.kt | 18 ++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/libraries/kotlinx-metadata/jvm/ChangeLog.md b/libraries/kotlinx-metadata/jvm/ChangeLog.md index 2219052984f..757fe5a6079 100644 --- a/libraries/kotlinx-metadata/jvm/ChangeLog.md +++ b/libraries/kotlinx-metadata/jvm/ChangeLog.md @@ -7,6 +7,8 @@ - Breaking change: JvmPropertyExtensionVisitor.visit has a new parameter `jvmFlags: Flags` - Correctly write "null" constant value in effect expression of a contract - Rename `desc` parameters to `signature` in JvmFunctionExtensionVisitor, JvmPropertyExtensionVisitor, JvmConstructorExtensionVisitor +- Do not expose KmExtensionType internals +- Add KmExtensionVisitor.type to get dynamic type of an extension visitor ## 0.0.5 diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt index 272b539f1b2..719988ef1d7 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensions.kt @@ -50,6 +50,9 @@ open class JvmClassExtensionVisitor @JvmOverloads constructor( override val delegate: JvmClassExtensionVisitor? get() = super.delegate as JvmClassExtensionVisitor? + final override val type: KmExtensionType + get() = TYPE + /** * Visits the JVM internal name of the original class this anonymous object is copied from. This method is called for * anonymous objects copied from bodies of inline functions to the use site by the Kotlin compiler. @@ -85,6 +88,9 @@ open class JvmPackageExtensionVisitor @JvmOverloads constructor( override val delegate: JvmPackageExtensionVisitor? get() = super.delegate as JvmPackageExtensionVisitor? + final override val type: KmExtensionType + get() = TYPE + /** * Visits the end of JVM extensions for the package fragment. */ @@ -109,6 +115,9 @@ open class JvmPackageExtensionVisitor @JvmOverloads constructor( open class JvmFunctionExtensionVisitor @JvmOverloads constructor( private val delegate: JvmFunctionExtensionVisitor? = null ) : KmFunctionExtensionVisitor { + final override val type: KmExtensionType + get() = TYPE + /** * Visits the JVM signature of the function in the JVM-based format, * or null if the JVM signature of this function is unknown. @@ -153,6 +162,9 @@ open class JvmFunctionExtensionVisitor @JvmOverloads constructor( open class JvmPropertyExtensionVisitor @JvmOverloads constructor( private val delegate: JvmPropertyExtensionVisitor? = null ) : KmPropertyExtensionVisitor { + final override val type: KmExtensionType + get() = TYPE + /** * Visits JVM signatures of field and accessors generated for the property. * @@ -225,6 +237,9 @@ open class JvmPropertyExtensionVisitor @JvmOverloads constructor( open class JvmConstructorExtensionVisitor @JvmOverloads constructor( private val delegate: JvmConstructorExtensionVisitor? = null ) : KmConstructorExtensionVisitor { + final override val type: KmExtensionType + get() = TYPE + /** * Visits the JVM signature of the constructor, or null if the JVM signature of this constructor is unknown. * @@ -253,6 +268,9 @@ open class JvmConstructorExtensionVisitor @JvmOverloads constructor( open class JvmTypeParameterExtensionVisitor @JvmOverloads constructor( private val delegate: JvmTypeParameterExtensionVisitor? = null ) : KmTypeParameterExtensionVisitor { + final override val type: KmExtensionType + get() = TYPE + /** * Visits an annotation on the type parameter. * @@ -286,6 +304,9 @@ open class JvmTypeParameterExtensionVisitor @JvmOverloads constructor( open class JvmTypeExtensionVisitor @JvmOverloads constructor( private val delegate: JvmTypeExtensionVisitor? = null ) : KmTypeExtensionVisitor { + final override val type: KmExtensionType + get() = TYPE + /** * Visits the JVM-specific flags of a type. * diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt index 8ae6708fa63..bc17cae5d6e 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt @@ -28,12 +28,26 @@ import kotlin.reflect.KClass * * In case an extension visitor of an unrelated type is returned, the code using the visitor API must ignore that visitor. */ -data class KmExtensionType(val klass: KClass) +class KmExtensionType(private val klass: KClass) { + override fun equals(other: Any?): Boolean = + other is KmExtensionType && klass == other.klass + + override fun hashCode(): Int = + klass.hashCode() + + override fun toString(): String = + klass.java.name +} /** * A base interface for all extension visitors. */ -interface KmExtensionVisitor +interface KmExtensionVisitor { + /** + * Type of this extension visitor. + */ + val type: KmExtensionType +} /** * A visitor to visit platform-specific extensions for a declaration container, such as a class or a package fragment.