diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt index 44cbb65da4b..f048e990693 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt @@ -51,11 +51,11 @@ public final class org/jetbrains/kotlin/tooling/core/Extras$Entry : java/io/Seri public final class org/jetbrains/kotlin/tooling/core/Extras$Key : java/io/Serializable { public static final field Companion Lorg/jetbrains/kotlin/tooling/core/Extras$Key$Companion; - public fun (Lorg/jetbrains/kotlin/tooling/core/Type;Ljava/lang/String;)V + public fun (Lorg/jetbrains/kotlin/tooling/core/Extras$Type;Ljava/lang/String;)V public fun equals (Ljava/lang/Object;)Z public final fun getName ()Ljava/lang/String; public final fun getStableString ()Ljava/lang/String; - public final fun getType ()Lorg/jetbrains/kotlin/tooling/core/Type; + public final fun getType ()Lorg/jetbrains/kotlin/tooling/core/Extras$Type; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -64,6 +64,13 @@ public final class org/jetbrains/kotlin/tooling/core/Extras$Key$Companion { public final fun fromString (Ljava/lang/String;)Lorg/jetbrains/kotlin/tooling/core/Extras$Key; } +public final class org/jetbrains/kotlin/tooling/core/Extras$Type : java/io/Serializable { + public fun (Ljava/lang/String;)V + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + public final class org/jetbrains/kotlin/tooling/core/ExtrasUtilsKt { public static final fun emptyExtras ()Lorg/jetbrains/kotlin/tooling/core/Extras; public static final fun extrasOf ()Lorg/jetbrains/kotlin/tooling/core/Extras; @@ -133,14 +140,7 @@ public abstract interface class org/jetbrains/kotlin/tooling/core/MutableExtras public abstract fun set (Lorg/jetbrains/kotlin/tooling/core/Extras$Key;Ljava/lang/Object;)Ljava/lang/Object; } -public final class org/jetbrains/kotlin/tooling/core/Type : java/io/Serializable { - public fun (Ljava/lang/String;)V - public fun equals (Ljava/lang/Object;)Z - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class org/jetbrains/kotlin/tooling/core/TypeKt { +public final class org/jetbrains/kotlin/tooling/core/TypeUtils { public static final fun renderReifiedTypeSignatureString (Lkotlin/reflect/KType;)Ljava/lang/String; } diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/TestIdeaKpmExtrasSerializationExtension.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/TestIdeaKpmExtrasSerializationExtension.kt index b5881535e95..8f7c4caa2a6 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/TestIdeaKpmExtrasSerializationExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/testFixtures/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/testFixtures/TestIdeaKpmExtrasSerializationExtension.kt @@ -8,8 +8,8 @@ package org.jetbrains.kotlin.gradle.kpm.idea.testFixtures import org.jetbrains.kotlin.gradle.kpm.idea.serialize.IdeaKpmExtrasSerializationExtension import org.jetbrains.kotlin.gradle.kpm.idea.serialize.IdeaKpmExtrasSerializer import org.jetbrains.kotlin.tooling.core.Extras -import org.jetbrains.kotlin.tooling.core.Type import org.jetbrains.kotlin.tooling.core.extrasKeyOf +import org.jetbrains.kotlin.tooling.core.extrasTypeOf @Suppress("UNCHECKED_CAST") object TestIdeaKpmExtrasSerializationExtension : IdeaKpmExtrasSerializationExtension { @@ -20,8 +20,8 @@ object TestIdeaKpmExtrasSerializationExtension : IdeaKpmExtrasSerializationExten override fun serializer(key: Extras.Key): IdeaKpmExtrasSerializer? = when { key == ignoredStringKey -> null key == anySerializableKey -> IdeaKpmExtrasSerializer.javaIoSerializable() - key.type == Type() -> TestIdeaKpmStringExtrasSerializer - key.type == Type() -> TestIdeaKpmIntExtrasSerializer + key.type == extrasTypeOf() -> TestIdeaKpmStringExtrasSerializer + key.type == extrasTypeOf() -> TestIdeaKpmIntExtrasSerializer else -> null } as? IdeaKpmExtrasSerializer } diff --git a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Extras.kt b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Extras.kt index 8786a7cffb9..c2a65e02245 100644 --- a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Extras.kt +++ b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Extras.kt @@ -63,6 +63,27 @@ import java.io.Serializable * ``` */ interface Extras : Collection> { + class Type @UnsafeApi("Use 'extrasTypeOf()' instead") @PublishedApi internal constructor( + internal val signature: String + ) : Serializable { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Type<*>) return false + if (other.signature != this.signature) return false + return true + } + + override fun hashCode(): Int { + return 31 * signature.hashCode() + } + + override fun toString(): String = signature + + internal companion object { + private const val serialVersionUID = 0L + } + } + /* Not implemented as data class to ensure more controllable binary compatibility */ class Key @PublishedApi internal constructor( val type: Type, diff --git a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/ExtrasUtils.kt b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/ExtrasUtils.kt index ec1a364096d..178d9c98b55 100644 --- a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/ExtrasUtils.kt +++ b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/ExtrasUtils.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.tooling.core +import kotlin.reflect.typeOf + /** * Creates a value based key for accessing any [Extras] container * @@ -25,7 +27,7 @@ package org.jetbrains.kotlin.tooling.core * ``` */ inline fun extrasKeyOf(name: String? = null): Extras.Key = - Extras.Key(Type(), name) + Extras.Key(extrasTypeOf(), name) fun emptyExtras(): Extras = EmptyExtras @@ -37,6 +39,11 @@ fun mutableExtrasOf(): MutableExtras = MutableExtrasImpl() fun mutableExtrasOf(vararg entries: Extras.Entry<*>): MutableExtras = MutableExtrasImpl(entries.toList()) +inline fun extrasTypeOf(): Extras.Type { + @OptIn(UnsafeApi::class, ExperimentalStdlibApi::class) + return Extras.Type(renderReifiedTypeSignatureString(typeOf())) +} + fun Iterable>.toExtras(): Extras = ImmutableExtrasImpl(this) fun Iterable>.toMutableExtras(): MutableExtras = MutableExtrasImpl(this) diff --git a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Type.kt b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/typeUtils.kt similarity index 70% rename from libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Type.kt rename to libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/typeUtils.kt index 9904cdf7d3f..c3e392d845d 100644 --- a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/Type.kt +++ b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/typeUtils.kt @@ -4,41 +4,13 @@ */ @file:Suppress("FunctionName") +@file:JvmName("TypeUtils") package org.jetbrains.kotlin.tooling.core -import java.io.Serializable import kotlin.reflect.KClass import kotlin.reflect.KType import kotlin.reflect.KVariance -import kotlin.reflect.typeOf - -inline fun Type(): Type { - @OptIn(UnsafeApi::class, ExperimentalStdlibApi::class) - return Type(renderReifiedTypeSignatureString(typeOf())) -} - -class Type -@UnsafeApi("Use 'Type' instead") -@PublishedApi internal constructor(internal val signature: String) : Serializable { - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is Type<*>) return false - if (other.signature != this.signature) return false - return true - } - - override fun hashCode(): Int { - return 31 * signature.hashCode() - } - - override fun toString(): String = signature - - internal companion object { - private const val serialVersionUID = 0L - } -} @PublishedApi @UnsafeApi("Use 'ReifiedTypeSignature' instead") diff --git a/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/TypeTest.kt b/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/TypeTest.kt index 18301340080..33a63c8d9b2 100644 --- a/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/TypeTest.kt +++ b/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/TypeTest.kt @@ -24,21 +24,21 @@ class TypeTest { @Test fun `test - sample 0`() { assertEquals( - "kotlin.collections.List", Type>().signature + "kotlin.collections.List", extrasTypeOf>().signature ) } @Test fun `test - sample 1`() { assertEquals( - "kotlin.collections.List<*>", Type>().signature + "kotlin.collections.List<*>", extrasTypeOf>().signature ) } @Test fun `test - sample 2`() { assertEquals( - "kotlin.String", Type().signature + "kotlin.String", extrasTypeOf().signature ) } @@ -46,7 +46,7 @@ class TypeTest { fun `test - sample 3`() { assertEquals( "kotlin.collections.Map>>", - Type>>>().signature + extrasTypeOf>>>().signature ) } @@ -55,7 +55,7 @@ class TypeTest { fun `test - sample 5 - inner class`() { assertEquals( "org.jetbrains.kotlin.tooling.core.TypeTest.Outer.Inner", - Type().signature + extrasTypeOf().signature ) } @@ -63,43 +63,43 @@ class TypeTest { fun `test - sample 6 - recursive types`() { assertEquals( "org.jetbrains.kotlin.tooling.core.TypeTest.Recursive<*>", - Type>().signature + extrasTypeOf>().signature ) assertEquals( "org.jetbrains.kotlin.tooling.core.TypeTest.AnyRecursive", - Type().signature + extrasTypeOf().signature ) assertEquals( "org.jetbrains.kotlin.tooling.core.TypeTest" + ".Recursive", - Type>().signature + extrasTypeOf>().signature ) } @Test fun `test sample 7 - nullable`() { - assertEquals("kotlin.collections.List<*>?", Type?>().signature) - assertEquals("kotlin.collections.List", Type>().signature) + assertEquals("kotlin.collections.List<*>?", extrasTypeOf?>().signature) + assertEquals("kotlin.collections.List", extrasTypeOf>().signature) } @Test fun `test sample 8 - variance`() { assertEquals( "org.jetbrains.kotlin.tooling.core.TypeTest.Box", - Type>().signature + extrasTypeOf>().signature ) assertEquals( "org.jetbrains.kotlin.tooling.core.TypeTest.Box", - Type>().signature + extrasTypeOf>().signature ) } @Suppress("RemoveExplicitTypeArguments", "TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING") @Test fun `test - equals`() { - assertEquals(Type>(), Type>()) - assertNotEquals(Type>(), Type>()) + assertEquals(extrasTypeOf>(), extrasTypeOf>()) + assertNotEquals(extrasTypeOf>(), extrasTypeOf>()) } }