[Commonizer] Friendly displaying commonized KLIBs in IDE
Issue #MMPP-195
This commit is contained in:
+4
-3
@@ -21,7 +21,8 @@ import com.intellij.util.PathUtilRt
|
|||||||
import com.intellij.util.concurrency.AppExecutorUtil
|
import com.intellij.util.concurrency.AppExecutorUtil
|
||||||
import org.jetbrains.concurrency.CancellablePromise
|
import org.jetbrains.concurrency.CancellablePromise
|
||||||
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
|
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
|
||||||
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil
|
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.isGradleLibraryName
|
||||||
|
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.parseIDELibraryName
|
||||||
import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider
|
import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider
|
||||||
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
||||||
@@ -205,11 +206,11 @@ class KotlinNativeABICompatibilityChecker(private val project: Project) : Projec
|
|||||||
private fun parseIDELibraryName(libraryInfo: NativeLibraryInfo): Pair<String, LibraryGroup> {
|
private fun parseIDELibraryName(libraryInfo: NativeLibraryInfo): Pair<String, LibraryGroup> {
|
||||||
val ideLibraryName = libraryInfo.library.name?.takeIf(String::isNotEmpty)
|
val ideLibraryName = libraryInfo.library.name?.takeIf(String::isNotEmpty)
|
||||||
if (ideLibraryName != null) {
|
if (ideLibraryName != null) {
|
||||||
KotlinNativeLibraryNameUtil.parseIDELibraryName(ideLibraryName)?.let { (kotlinVersion, libraryName) ->
|
parseIDELibraryName(ideLibraryName)?.let { (kotlinVersion, libraryName) ->
|
||||||
return libraryName to LibraryGroup.FromDistribution(kotlinVersion)
|
return libraryName to LibraryGroup.FromDistribution(kotlinVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (KotlinNativeLibraryNameUtil.isGradleLibraryName(ideLibraryName))
|
if (isGradleLibraryName(ideLibraryName))
|
||||||
return ideLibraryName to LibraryGroup.ThirdParty
|
return ideLibraryName to LibraryGroup.ThirdParty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -21,7 +21,8 @@ import com.intellij.util.PathUtilRt
|
|||||||
import com.intellij.util.concurrency.AppExecutorUtil
|
import com.intellij.util.concurrency.AppExecutorUtil
|
||||||
import org.jetbrains.concurrency.CancellablePromise
|
import org.jetbrains.concurrency.CancellablePromise
|
||||||
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
|
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
|
||||||
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil
|
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.isGradleLibraryName
|
||||||
|
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.parseIDELibraryName
|
||||||
import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider
|
import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider
|
||||||
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
||||||
@@ -206,11 +207,11 @@ class KotlinNativeABICompatibilityChecker(private val project: Project) : Projec
|
|||||||
private fun parseIDELibraryName(libraryInfo: NativeLibraryInfo): Pair<String, LibraryGroup> {
|
private fun parseIDELibraryName(libraryInfo: NativeLibraryInfo): Pair<String, LibraryGroup> {
|
||||||
val ideLibraryName = libraryInfo.library.name?.takeIf(String::isNotEmpty)
|
val ideLibraryName = libraryInfo.library.name?.takeIf(String::isNotEmpty)
|
||||||
if (ideLibraryName != null) {
|
if (ideLibraryName != null) {
|
||||||
KotlinNativeLibraryNameUtil.parseIDELibraryName(ideLibraryName)?.let { (kotlinVersion, libraryName) ->
|
parseIDELibraryName(ideLibraryName)?.let { (kotlinVersion, libraryName) ->
|
||||||
return libraryName to LibraryGroup.FromDistribution(kotlinVersion)
|
return libraryName to LibraryGroup.FromDistribution(kotlinVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (KotlinNativeLibraryNameUtil.isGradleLibraryName(ideLibraryName))
|
if (isGradleLibraryName(ideLibraryName))
|
||||||
return ideLibraryName to LibraryGroup.ThirdParty
|
return ideLibraryName to LibraryGroup.ThirdParty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-2
@@ -11,6 +11,7 @@ import com.intellij.openapi.util.Key
|
|||||||
import org.gradle.tooling.model.idea.IdeaModule
|
import org.gradle.tooling.model.idea.IdeaModule
|
||||||
import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel
|
import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel
|
||||||
import org.jetbrains.kotlin.idea.configuration.buildClasspathData
|
import org.jetbrains.kotlin.idea.configuration.buildClasspathData
|
||||||
|
import org.jetbrains.kotlin.idea.configuration.klib.KotlinNativeLibraryNameUtil.buildIDELibraryName
|
||||||
import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
|
import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
||||||
import org.jetbrains.plugins.gradle.ExternalDependencyId
|
import org.jetbrains.plugins.gradle.ExternalDependencyId
|
||||||
@@ -108,10 +109,22 @@ internal class KotlinNativeLibrariesDependencySubstitutor(
|
|||||||
private fun buildSubstituteIfNecessary(libraryFile: File): DependencySubstitute {
|
private fun buildSubstituteIfNecessary(libraryFile: File): DependencySubstitute {
|
||||||
// need to check whether `library` points to a real KLIB,
|
// need to check whether `library` points to a real KLIB,
|
||||||
// and if answer is yes then build a new dependency that will substitute original one
|
// and if answer is yes then build a new dependency that will substitute original one
|
||||||
val klib = klibInfoProvider?.getKlibInfo(libraryFile) as? NativeDistributionKlibInfo ?: return DependencySubstitute.NoSubstitute
|
val klib = klibInfoProvider?.getKlibInfo(libraryFile) ?: return DependencySubstitute.NoSubstitute
|
||||||
val nonNullKotlinVersion = kotlinVersion ?: return DependencySubstitute.NoSubstitute
|
val nonNullKotlinVersion = kotlinVersion ?: return DependencySubstitute.NoSubstitute
|
||||||
|
|
||||||
val newLibraryName = KotlinNativeLibraryNameUtil.buildIDELibraryName(nonNullKotlinVersion, klib.name, klib.target?.name)
|
val newLibraryName = when (klib) {
|
||||||
|
is NativeDistributionKlibInfo -> buildIDELibraryName(
|
||||||
|
nonNullKotlinVersion,
|
||||||
|
klib.name,
|
||||||
|
listOfNotNull(klib.target?.name)
|
||||||
|
)
|
||||||
|
is NativeDistributionCommonizedKlibInfo -> buildIDELibraryName(
|
||||||
|
nonNullKotlinVersion,
|
||||||
|
klib.name,
|
||||||
|
klib.commonizedTargets.map { it.name },
|
||||||
|
klib.ownTarget?.name
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val substitute = DefaultExternalMultiLibraryDependency().apply {
|
val substitute = DefaultExternalMultiLibraryDependency().apply {
|
||||||
classpathOrder = if (klib.name == KONAN_STDLIB_NAME) -1 else 0 // keep stdlib upper
|
classpathOrder = if (klib.name == KONAN_STDLIB_NAME) -1 else 0 // keep stdlib upper
|
||||||
|
|||||||
+18
-5
@@ -10,12 +10,25 @@ object KotlinNativeLibraryNameUtil {
|
|||||||
internal const val KOTLIN_NATIVE_LIBRARY_PREFIX_PLUS_SPACE = "$KOTLIN_NATIVE_LIBRARY_PREFIX "
|
internal const val KOTLIN_NATIVE_LIBRARY_PREFIX_PLUS_SPACE = "$KOTLIN_NATIVE_LIBRARY_PREFIX "
|
||||||
internal const val GRADLE_LIBRARY_PREFIX = "Gradle: "
|
internal const val GRADLE_LIBRARY_PREFIX = "Gradle: "
|
||||||
|
|
||||||
private val IDE_LIBRARY_NAME_REGEX = Regex("^$KOTLIN_NATIVE_LIBRARY_PREFIX_PLUS_SPACE([^\\s]+) - ([^\\s]+)( \\[([\\w]+)\\])?$")
|
private val IDE_LIBRARY_NAME_REGEX = Regex("^$KOTLIN_NATIVE_LIBRARY_PREFIX_PLUS_SPACE([^\\s]+) - ([^\\s]+)( \\[([\\w ,()*]+)])?$")
|
||||||
|
|
||||||
// Builds the name of Kotlin/Native library that is a part of Kotlin/Native distribution
|
// Builds the name of Kotlin/Native library that is a part of Kotlin/Native distribution
|
||||||
// as it will be displayed in IDE UI.
|
// as it will be displayed in IDE UI.
|
||||||
fun buildIDELibraryName(kotlinVersion: String, libraryName: String, platform: String?): String {
|
fun buildIDELibraryName(
|
||||||
val platformNamePart = platform?.let { " [$it]" }.orEmpty()
|
kotlinVersion: String,
|
||||||
|
libraryName: String,
|
||||||
|
platforms: Collection<String>,
|
||||||
|
starredPlatform: String? = null
|
||||||
|
): String {
|
||||||
|
val platformNamePart = if (platforms.isNotEmpty())
|
||||||
|
buildString {
|
||||||
|
append(" [")
|
||||||
|
platforms.sorted().joinTo(this) { if (it == starredPlatform) "$it(*)" else it }
|
||||||
|
append("]")
|
||||||
|
}
|
||||||
|
else
|
||||||
|
""
|
||||||
|
|
||||||
return "$KOTLIN_NATIVE_LIBRARY_PREFIX_PLUS_SPACE$kotlinVersion - $libraryName$platformNamePart"
|
return "$KOTLIN_NATIVE_LIBRARY_PREFIX_PLUS_SPACE$kotlinVersion - $libraryName$platformNamePart"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,9 +38,9 @@ object KotlinNativeLibraryNameUtil {
|
|||||||
|
|
||||||
val kotlinVersion = match.groups[1]!!.value
|
val kotlinVersion = match.groups[1]!!.value
|
||||||
val libraryName = match.groups[2]!!.value
|
val libraryName = match.groups[2]!!.value
|
||||||
val platform = match.groups[4]?.value
|
val platformPart = match.groups[4]?.value
|
||||||
|
|
||||||
return Triple(kotlinVersion, libraryName, platform)
|
return Triple(kotlinVersion, libraryName, platformPart)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isGradleLibraryName(ideLibraryName: String) = ideLibraryName.startsWith(GRADLE_LIBRARY_PREFIX)
|
fun isGradleLibraryName(ideLibraryName: String) = ideLibraryName.startsWith(GRADLE_LIBRARY_PREFIX)
|
||||||
|
|||||||
+22
-2
@@ -15,12 +15,22 @@ class KotlinNativeLibraryNameUtilTest : TestCase() {
|
|||||||
fun testBuildIDELibraryName() {
|
fun testBuildIDELibraryName() {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Kotlin/Native 1.3.60 - stdlib",
|
"Kotlin/Native 1.3.60 - stdlib",
|
||||||
buildIDELibraryName("1.3.60", "stdlib", null)
|
buildIDELibraryName("1.3.60", "stdlib", emptyList())
|
||||||
)
|
)
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Kotlin/Native 1.3.60-eap-23 - Accelerate [macos_x64]",
|
"Kotlin/Native 1.3.60-eap-23 - Accelerate [macos_x64]",
|
||||||
buildIDELibraryName("1.3.60-eap-23", "Accelerate", "macos_x64")
|
buildIDELibraryName("1.3.60-eap-23", "Accelerate", listOf("macos_x64"))
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
"Kotlin/Native 1.3.60-eap-23 - Accelerate [ios_arm32, ios_arm64, ios_x64]",
|
||||||
|
buildIDELibraryName("1.3.60-eap-23", "Accelerate", listOf("ios_x64", "ios_arm32", "ios_arm64"))
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
"Kotlin/Native 1.3.60-eap-23 - Accelerate [ios_arm32, ios_arm64(*), ios_x64]",
|
||||||
|
buildIDELibraryName("1.3.60-eap-23", "Accelerate", listOf("ios_x64", "ios_arm32", "ios_arm64"), "ios_arm64")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,6 +45,16 @@ class KotlinNativeLibraryNameUtilTest : TestCase() {
|
|||||||
parseIDELibraryName("Kotlin/Native 1.3.60-eap-23 - Accelerate [macos_x64]")
|
parseIDELibraryName("Kotlin/Native 1.3.60-eap-23 - Accelerate [macos_x64]")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
Triple("1.3.60-eap-23", "Accelerate", "ios_arm32, ios_arm64, ios_x64"),
|
||||||
|
parseIDELibraryName("Kotlin/Native 1.3.60-eap-23 - Accelerate [ios_arm32, ios_arm64, ios_x64]")
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
|
Triple("1.3.60-eap-23", "Accelerate", "ios_arm32, ios_arm64(*), ios_x64"),
|
||||||
|
parseIDELibraryName("Kotlin/Native 1.3.60-eap-23 - Accelerate [ios_arm32, ios_arm64(*), ios_x64]")
|
||||||
|
)
|
||||||
|
|
||||||
assertNull(parseIDELibraryName("Kotlin/Native - something unexpected"))
|
assertNull(parseIDELibraryName("Kotlin/Native - something unexpected"))
|
||||||
|
|
||||||
assertNull(parseIDELibraryName("foo.klib"))
|
assertNull(parseIDELibraryName("foo.klib"))
|
||||||
|
|||||||
Reference in New Issue
Block a user