[kpm] kotlin-tooling-core: Expose 'Type' in Extras.Key

This type can later be used for extension points to register
serializers for certain known types.

^KT-52568 In Progress
This commit is contained in:
sebastian.sellmair
2022-06-13 14:03:38 +02:00
committed by Space
parent 9a8832a241
commit 58e2f6d5d7
5 changed files with 115 additions and 117 deletions
@@ -65,7 +65,7 @@ import java.io.Serializable
interface Extras : Collection<Entry<out Any>> {
/* Not implemented as data class to ensure more controllable binary compatibility */
class Key<T : Any> @PublishedApi internal constructor(
internal val type: ReifiedTypeSignature<T>,
val type: Type<T>,
val name: String? = null,
) : Serializable {
@@ -95,8 +95,8 @@ interface Extras : Collection<Entry<out Any>> {
fun fromString(stableString: String): Key<*> {
@OptIn(UnsafeApi::class) return if (stableString.contains(';')) {
val split = stableString.split(';', limit = 2)
Key(ReifiedTypeSignature(split[0]), split[1])
} else Key(ReifiedTypeSignature(stableString))
Key(Type(split[0]), split[1])
} else Key(Type(stableString))
}
private const val serialVersionUID = 0L
@@ -25,7 +25,7 @@ package org.jetbrains.kotlin.tooling.core
* ```
*/
inline fun <reified T : Any> extrasKeyOf(name: String? = null): Extras.Key<T> =
Extras.Key(ReifiedTypeSignature(), name)
Extras.Key(Type(), name)
fun emptyExtras(): Extras = EmptyExtras
@@ -13,20 +13,18 @@ import kotlin.reflect.KType
import kotlin.reflect.KVariance
import kotlin.reflect.typeOf
@PublishedApi
internal inline fun <reified T> ReifiedTypeSignature(): ReifiedTypeSignature<T> {
inline fun <reified T> Type(): Type<T> {
@OptIn(UnsafeApi::class, ExperimentalStdlibApi::class)
return ReifiedTypeSignature(renderReifiedTypeSignatureString(typeOf<T>()))
return Type(renderReifiedTypeSignatureString(typeOf<T>()))
}
@PublishedApi
internal class ReifiedTypeSignature<T>
@UnsafeApi("Use 'reifiedTypeSignatureOf' instead")
@PublishedApi internal constructor(val signature: String) : Serializable {
class Type<T>
@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 ReifiedTypeSignature<*>) return false
if (other !is Type<*>) return false
if (other.signature != this.signature) return false
return true
}
@@ -1,105 +0,0 @@
/*
* Copyright 2010-2022 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 org.jetbrains.kotlin.tooling.core
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotEquals
class ReifiedTypeSignatureTest {
class Box<T>
class Outer {
inner class Inner
}
open class Recursive<T : Recursive<T>>
class AnyRecursive : Recursive<AnyRecursive>()
@Test
fun `test - sample 0`() {
assertEquals(
"kotlin.collections.List<kotlin.Int>", ReifiedTypeSignature<List<Int>>().signature
)
}
@Test
fun `test - sample 1`() {
assertEquals(
"kotlin.collections.List<*>", ReifiedTypeSignature<List<*>>().signature
)
}
@Test
fun `test - sample 2`() {
assertEquals(
"kotlin.String", ReifiedTypeSignature<String>().signature
)
}
@Test
fun `test - sample 3`() {
assertEquals(
"kotlin.collections.Map<kotlin.String, kotlin.collections.List<kotlin.Pair<kotlin.Int, kotlin.String>>>",
ReifiedTypeSignature<Map<String, List<Pair<Int, String>>>>().signature
)
}
@Test
fun `test - sample 5 - inner class`() {
assertEquals(
"org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest.Outer.Inner",
ReifiedTypeSignature<Outer.Inner>().signature
)
}
@Test
fun `test - sample 6 - recursive types`() {
assertEquals(
"org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest.Recursive<*>",
ReifiedTypeSignature<Recursive<*>>().signature
)
assertEquals(
"org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest.AnyRecursive",
ReifiedTypeSignature<AnyRecursive>().signature
)
assertEquals(
"org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest" +
".Recursive<org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest.AnyRecursive>",
ReifiedTypeSignature<Recursive<AnyRecursive>>().signature
)
}
@Test
fun `test sample 7 - nullable`() {
assertEquals("kotlin.collections.List<*>?", ReifiedTypeSignature<List<*>?>().signature)
assertEquals("kotlin.collections.List<kotlin.Int?>", ReifiedTypeSignature<List<Int?>>().signature)
}
@Test
fun `test sample 8 - variance`() {
assertEquals(
"org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest.Box<out kotlin.Int>",
ReifiedTypeSignature<Box<out Int>>().signature
)
assertEquals(
"org.jetbrains.kotlin.tooling.core.ReifiedTypeSignatureTest.Box<in kotlin.Int>",
ReifiedTypeSignature<Box<in Int>>().signature
)
}
@Suppress("RemoveExplicitTypeArguments", "TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING")
@Test
fun `test - equals`() {
assertEquals(ReifiedTypeSignature<List<Int>>(), ReifiedTypeSignature<List<Int>>())
assertNotEquals(ReifiedTypeSignature<List<Int?>>(), ReifiedTypeSignature<List<Int>>())
}
}
@@ -0,0 +1,105 @@
/*
* Copyright 2010-2022 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 org.jetbrains.kotlin.tooling.core
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotEquals
class TypeTest {
class Box<T>
class Outer {
inner class Inner
}
open class Recursive<T : Recursive<T>>
class AnyRecursive : Recursive<AnyRecursive>()
@Test
fun `test - sample 0`() {
assertEquals(
"kotlin.collections.List<kotlin.Int>", Type<List<Int>>().signature
)
}
@Test
fun `test - sample 1`() {
assertEquals(
"kotlin.collections.List<*>", Type<List<*>>().signature
)
}
@Test
fun `test - sample 2`() {
assertEquals(
"kotlin.String", Type<String>().signature
)
}
@Test
fun `test - sample 3`() {
assertEquals(
"kotlin.collections.Map<kotlin.String, kotlin.collections.List<kotlin.Pair<kotlin.Int, kotlin.String>>>",
Type<Map<String, List<Pair<Int, String>>>>().signature
)
}
@Test
fun `test - sample 5 - inner class`() {
assertEquals(
"org.jetbrains.kotlin.tooling.core.TypeTest.Outer.Inner",
Type<Outer.Inner>().signature
)
}
@Test
fun `test - sample 6 - recursive types`() {
assertEquals(
"org.jetbrains.kotlin.tooling.core.TypeTest.Recursive<*>",
Type<Recursive<*>>().signature
)
assertEquals(
"org.jetbrains.kotlin.tooling.core.TypeTest.AnyRecursive",
Type<AnyRecursive>().signature
)
assertEquals(
"org.jetbrains.kotlin.tooling.core.TypeTest" +
".Recursive<org.jetbrains.kotlin.tooling.core.TypeTest.AnyRecursive>",
Type<Recursive<AnyRecursive>>().signature
)
}
@Test
fun `test sample 7 - nullable`() {
assertEquals("kotlin.collections.List<*>?", Type<List<*>?>().signature)
assertEquals("kotlin.collections.List<kotlin.Int?>", Type<List<Int?>>().signature)
}
@Test
fun `test sample 8 - variance`() {
assertEquals(
"org.jetbrains.kotlin.tooling.core.TypeTest.Box<out kotlin.Int>",
Type<Box<out Int>>().signature
)
assertEquals(
"org.jetbrains.kotlin.tooling.core.TypeTest.Box<in kotlin.Int>",
Type<Box<in Int>>().signature
)
}
@Suppress("RemoveExplicitTypeArguments", "TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING")
@Test
fun `test - equals`() {
assertEquals(Type<List<Int>>(), Type<List<Int>>())
assertNotEquals(Type<List<Int?>>(), Type<List<Int>>())
}
}