[Gradle] Implement IdeaKotlinBinaryCoordinates.displayString and identityString

^KT-60053 In Progress
This commit is contained in:
Sebastian Sellmair
2023-07-10 20:20:13 +02:00
committed by Space Team
parent e3f0fa4257
commit 7af254fbf2
8 changed files with 192 additions and 48 deletions
@@ -327,7 +327,9 @@ public final class org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinBinaryCoordina
public static synthetic fun copy$default (Lorg/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinBinaryCoordinates;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILjava/lang/Object;)Lorg/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinBinaryCoordinates;
public fun equals (Ljava/lang/Object;)Z
public final fun getCapabilities ()Ljava/util/Set;
public final fun getDisplayString ()Ljava/lang/String;
public final fun getGroup ()Ljava/lang/String;
public final fun getIdentityString ()Ljava/lang/String;
public final fun getModule ()Ljava/lang/String;
public final fun getSourceSetName ()Ljava/lang/String;
public final fun getVersion ()Ljava/lang/String;
@@ -47,13 +47,15 @@ class IdeaKotlinBinaryCoordinates(
* This, however, shall not be shown to users, as the String is hard to read
* The identityString is not stable across Kotlin versions, hence not intended to be parsed.
*/
val identityString = buildString {
append("$group:$module")
if (version != null) append(":$version")
if (capabilities.isNotEmpty()) {
append(capabilities.joinToString(", ", "(", ")"))
val identityString: String
get() = buildString {
append("$group:$module")
if (sourceSetName != null) append(":$sourceSetName")
if (version != null) append(":$version")
if (capabilities.isNotEmpty()) {
append(capabilities.joinToString(", ", "(", ")"))
}
}
}
/**
* String intended to be shown to users. E.g. a library within the IDE can use
@@ -82,23 +84,30 @@ class IdeaKotlinBinaryCoordinates(
* "org.jetbrains:sample-test-fixtures:1.0.0"
*
*/
val displayString = run {
val classifyingCapabilities = capabilities.filter { capability -> capability.group == group && capability.name.startsWith(module) }
when {
classifyingCapabilities.size == 1 -> classifyingCapabilities.single().toString()
classifyingCapabilities.size > 1 -> buildString {
append(group)
append(classifyingCapabilities.joinToString(prefix = "(", postfix = ")", separator = ", ") { capability ->
capability.name.removePrefix(group)
})
}
else -> buildString {
append("$group:$module")
if (version != null) append(":$version")
if (sourceSetName != null) append(":$sourceSetName")
val displayString: String
get() {
val classifyingCapabilities =
capabilities.filter { capability -> capability.group == group && capability.name.startsWith(module) }
return when {
classifyingCapabilities.size == 1 -> buildString {
append(classifyingCapabilities.single())
if (sourceSetName != null) append(":$sourceSetName")
}
classifyingCapabilities.size > 1 -> buildString {
append("$group:$module-")
append(classifyingCapabilities.joinToString(prefix = "(", postfix = ")", separator = ", ") { capability ->
capability.name.removePrefix(module).removePrefix("-")
})
if (sourceSetName != null) append(":$sourceSetName")
if (version != null) append(":$version")
}
else -> buildString {
append("$group:$module")
if (sourceSetName != null) append(":$sourceSetName")
if (version != null) append(":$version")
}
}
}
}
override fun toString(): String = displayString
@@ -0,0 +1,133 @@
/*
* 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 org.jetbrains.kotlin.gradle.idea.test.tcs
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCapability
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryCoordinates
import kotlin.test.Test
import kotlin.test.assertEquals
class IdeaKotlinBinaryCoordinatesTest {
@Test
fun `test - displayString & identityString - sample 0`() {
val coordinates = IdeaKotlinBinaryCoordinates("myGroup", "myModule", "1.0.0")
assertEquals("myGroup:myModule:1.0.0", coordinates.displayString)
assertEquals("myGroup:myModule:1.0.0", coordinates.identityString)
}
@Test
fun `test - displayString & identityString - sample 1`() {
val coordinates = IdeaKotlinBinaryCoordinates("myGroup", "myModule", null)
assertEquals("myGroup:myModule", coordinates.displayString)
assertEquals("myGroup:myModule", coordinates.identityString)
}
@Test
fun `test - displayString & identityString - sample 2`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0",
capabilities = setOf(IdeaKotlinBinaryCapability("myGroup", "myModule", "1.0.0"))
)
assertEquals("myGroup:myModule:1.0.0", coordinates.displayString)
assertEquals("myGroup:myModule:1.0.0(myGroup:myModule:1.0.0)", coordinates.identityString)
}
@Test
fun `test - displayString & identityString - sample 3`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0",
capabilities = setOf(IdeaKotlinBinaryCapability("myGroup", "myModule-foo", "1.0.0"))
)
assertEquals("myGroup:myModule-foo:1.0.0", coordinates.displayString)
assertEquals("myGroup:myModule:1.0.0(myGroup:myModule-foo:1.0.0)", coordinates.identityString)
}
@Test
fun `test - displayString & identityString - sample 4`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0",
capabilities = setOf(IdeaKotlinBinaryCapability("notMyGroup", "myModule-foo", "1.0.0"))
)
assertEquals("myGroup:myModule:1.0.0", coordinates.displayString)
assertEquals(
"myGroup:myModule:1.0.0(notMyGroup:myModule-foo:1.0.0)",
coordinates.identityString
)
}
@Test
fun `test - displayString & identityString - sample 5`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0",
capabilities = setOf(
IdeaKotlinBinaryCapability("notMyGroup", "myModule-foo", "1.0.0"),
IdeaKotlinBinaryCapability("myGroup", "myModule-foo", "1.0.0")
)
)
assertEquals("myGroup:myModule-foo:1.0.0", coordinates.displayString)
assertEquals(
"myGroup:myModule:1.0.0(notMyGroup:myModule-foo:1.0.0, myGroup:myModule-foo:1.0.0)",
coordinates.identityString
)
}
@Test
fun `test - displayString & identityString - sample 6`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0",
capabilities = setOf(
IdeaKotlinBinaryCapability("myGroup", "myModule-foo", "1.0.0"),
IdeaKotlinBinaryCapability("notMyGroup", "myModule-foo", "1.0.0"),
IdeaKotlinBinaryCapability("notMyGroupEither", "myModule-foo", null),
)
)
assertEquals("myGroup:myModule-foo:1.0.0", coordinates.displayString)
assertEquals(
"myGroup:myModule:1.0.0(myGroup:myModule-foo:1.0.0, notMyGroup:myModule-foo:1.0.0, notMyGroupEither:myModule-foo)",
coordinates.identityString
)
}
@Test
fun `test - displayString & identityString - sample 7`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0", "commonMain",
capabilities = setOf(
IdeaKotlinBinaryCapability("myGroup", "myModule-foo", "1.0.0"),
IdeaKotlinBinaryCapability("notMyGroup", "myModule-foo", "1.0.0"),
IdeaKotlinBinaryCapability("notMyGroupEither", "myModule-foo", null),
)
)
assertEquals("myGroup:myModule-foo:1.0.0:commonMain", coordinates.displayString)
assertEquals(
"myGroup:myModule:1.0.0:commonMain(myGroup:myModule-foo:1.0.0, notMyGroup:myModule-foo:1.0.0, notMyGroupEither:myModule-foo)",
coordinates.identityString
)
}
@Test
fun `test - displayString & identityString - sample 8`() {
val coordinates = IdeaKotlinBinaryCoordinates(
"myGroup", "myModule", "1.0.0", "commonMain",
capabilities = setOf(
IdeaKotlinBinaryCapability("myGroup", "myModule-foo", "1.0.0"),
IdeaKotlinBinaryCapability("myGroup", "myModule-bar", "1.0.0"),
IdeaKotlinBinaryCapability("notMyGroup", "myModule-foo", null),
)
)
assertEquals("myGroup:myModule-(foo, bar):1.0.0:commonMain", coordinates.displayString)
assertEquals(
"myGroup:myModule:1.0.0:commonMain(myGroup:myModule-foo:1.0.0, myGroup:myModule-bar:1.0.0, notMyGroup:myModule-foo)",
coordinates.identityString
)
}
}
@@ -235,7 +235,7 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() {
resolveIdeDependencies { dependencies ->
dependencies["commonMain"].assertMatches(
kotlinNativeDistributionDependencies,
binaryCoordinates(Regex("com.example:cinterop-.*-dummy:.*:linux_x64")),
binaryCoordinates(Regex("com.example:cinterop-.*-dummy:linux_x64")),
IdeaKotlinDependencyMatcher("Unresolved 'failing' cinterop") { dependency ->
dependency is IdeaKotlinUnresolvedBinaryDependency && dependency.cause.orEmpty().contains(
"cinterop-withFailingCInteropProcess-cinterop-failing.klib"
@@ -270,8 +270,8 @@ class MppIdeDependencyResolutionIT : KGPBaseTest() {
build(":lib:copyCommonizeCInteropForIde")
resolveIdeDependencies { dependencies ->
dependencies["linuxMain"].cinteropDependencies().assertMatches(
binaryCoordinates("org.example:included-lib-cinterop-a:null:(linux_arm64, linux_x64)"),
binaryCoordinates("org.example:lib-cinterop-a:null:(linux_arm64, linux_x64)"),
binaryCoordinates("org.example:included-lib-cinterop-a:(linux_arm64, linux_x64)"),
binaryCoordinates("org.example:lib-cinterop-a:(linux_arm64, linux_x64)"),
)
}
}
@@ -77,7 +77,7 @@ class ResolvableMetadataConfigurationTest {
/* Check IDE resolution for commonMain */
project.kotlinIdeMultiplatformImport.resolveDependencies("commonMain")
.assertMatches(
binaryCoordinates(Regex("com.squareup.okio:okio(-.*)?:3.3.0:.*")),
binaryCoordinates(Regex("com.squareup.okio:okio(-.*)?:.*:3.3.0")),
binaryCoordinates(Regex("org.jetbrains.kotlin.*"))
)
@@ -86,8 +86,8 @@ class ResolvableMetadataConfigurationTest {
.filterIsInstance<IdeaKotlinBinaryDependency>()
.filter { it.coordinates?.group.orEmpty() in setOf("com.squareup.okio", "com.arkivanov.mvikotlin") }
.assertMatches(
binaryCoordinates(Regex("com.squareup.okio:okio(-.*)?:3.3.0:.*")),
binaryCoordinates(Regex("com.arkivanov.mvikotlin:mvikotlin(-*)?:3.0.2:.*")),
binaryCoordinates(Regex("com.squareup.okio:okio(-.*)?:.*:3.3.0")),
binaryCoordinates(Regex("com.arkivanov.mvikotlin:mvikotlin(-*)?:.*:3.0.2")),
)
}
}
@@ -35,8 +35,8 @@ class IdeNativePlatformDependencyResolverTest {
val linuxX64Test = kotlin.sourceSets.getByName("linuxX64Test")
val dependencies = listOf(
binaryCoordinates("org.jetbrains.kotlin.native:posix:${project.konanVersion}:$LINUX_X64"),
binaryCoordinates(Regex("""org\.jetbrains\.kotlin\.native:.*:${project.konanVersion}:$LINUX_X64"""))
binaryCoordinates("org.jetbrains.kotlin.native:posix:$LINUX_X64:${project.konanVersion}"),
binaryCoordinates(Regex("""org\.jetbrains\.kotlin\.native:.*:$LINUX_X64:${project.konanVersion}"""))
)
IdeNativePlatformDependencyResolver.resolve(commonMain).assertMatches(dependencies)
@@ -60,8 +60,8 @@ class IdeNativePlatformDependencyResolverTest {
val macosArm64Test = kotlin.sourceSets.getByName("macosArm64Test")
val dependencies = listOf(
binaryCoordinates("org.jetbrains.kotlin.native:CoreFoundation:${project.konanVersion}:$MACOS_ARM64"),
binaryCoordinates(Regex("""org\.jetbrains\.kotlin\.native:.*:${project.konanVersion}:$MACOS_ARM64"""))
binaryCoordinates("org.jetbrains.kotlin.native:CoreFoundation:$MACOS_ARM64:${project.konanVersion}"),
binaryCoordinates(Regex("""org\.jetbrains\.kotlin\.native:.*:$MACOS_ARM64:${project.konanVersion}"""))
)
IdeNativePlatformDependencyResolver.resolve(commonMain).assertMatches(dependencies)
@@ -64,9 +64,9 @@ class IdeSourcesAndDocumentationResolutionTest {
/* Check commonMain&commonTest */
run {
val expectedDependencies = listOf(
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:commonMain:3.0.2"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:commonMain:0.4.2"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:commonMain:0.4.2"),
)
val resolvedDependencies = resolveDependencySources(commonMain)
@@ -78,10 +78,10 @@ class IdeSourcesAndDocumentationResolutionTest {
/* Check nativeMain&nativeTest */
run {
val expectedDependencies = listOf(
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:commonMain"),
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:jsNativeMain"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:commonMain:3.0.2"),
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:jsNativeMain:3.0.2"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:commonMain:0.4.2"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:commonMain:0.4.2"),
IdeNativeStdlibDependencyResolver.nativeStdlibCoordinates(project),
binaryCoordinates(Regex(".*stdlib-common:.*")) /* KT-56278 */
)
@@ -49,24 +49,24 @@ class IdeTransformedMetadataDependencyResolverTest {
IdeTransformedMetadataDependencyResolver.resolve(commonMain)
.assertMatches(
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2:commonMain")
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:commonMain:3.0.2"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:commonMain:0.4.2"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:commonMain:0.4.2")
)
IdeTransformedMetadataDependencyResolver.resolve(commonTest)
.assertMatches(
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2:commonMain")
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:commonMain:3.0.2"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:commonMain:0.4.2"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:commonMain:0.4.2")
)
IdeTransformedMetadataDependencyResolver.resolve(linuxMain)
.assertMatches(
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:commonMain"),
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:3.0.2:jsNativeMain"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:0.4.2:commonMain"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:0.4.2:commonMain")
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:commonMain:3.0.2"),
binaryCoordinates("com.arkivanov.mvikotlin:mvikotlin:jsNativeMain:3.0.2"),
binaryCoordinates("com.arkivanov.essenty:lifecycle:commonMain:0.4.2"),
binaryCoordinates("com.arkivanov.essenty:instance-keeper:commonMain:0.4.2")
)
}