MPP: Fix compatibility issue with Android Studio 3.3 Canary 7

'TargetPlatformKind' is still used in AS 3.3 so we can't remove it entirely yet.
This commit is contained in:
Yan Zhulanow
2018-09-04 15:35:48 +03:00
parent f90303315d
commit f55a52b86e
7 changed files with 61 additions and 12 deletions
@@ -28,7 +28,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library
import org.jetbrains.kotlin.idea.configuration.detectPlatformByPlugin
import org.jetbrains.kotlin.idea.configuration.detectPlatformKindByPlugin
import org.jetbrains.kotlin.idea.framework.detectLibraryKind
import org.jetbrains.kotlin.idea.platform.tooling
import java.io.File
@@ -44,7 +44,7 @@ class KotlinAndroidGradleLibraryDataService : AbstractProjectDataService<JavaMod
) {
for (dataNode in toImport) {
@Suppress("UNCHECKED_CAST")
val targetLibraryKind = detectPlatformByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
val targetLibraryKind = detectPlatformKindByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
if (targetLibraryKind != null) {
for (dep in dataNode.data.jarLibraryDependencies) {
val library = modelsProvider.findLibraryByBinaryPath(dep.binaryPath) as LibraryEx? ?: continue
@@ -28,7 +28,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library
import org.jetbrains.kotlin.idea.configuration.detectPlatformByPlugin
import org.jetbrains.kotlin.idea.configuration.detectPlatformKindByPlugin
import org.jetbrains.kotlin.idea.framework.detectLibraryKind
import org.jetbrains.kotlin.idea.platform.tooling
import java.io.File
@@ -44,7 +44,7 @@ class KotlinAndroidGradleLibraryDataService : AbstractProjectDataService<JavaMod
) {
for (dataNode in toImport) {
@Suppress("UNCHECKED_CAST")
val targetLibraryKind = detectPlatformByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
val targetLibraryKind = detectPlatformKindByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
if (targetLibraryKind != null) {
for (dep in dataNode.data.jarLibraryDependencies) {
val library = modelsProvider.findLibraryByBinaryPath(dep.binaryPath) as LibraryEx? ?: continue
@@ -28,7 +28,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library
import org.jetbrains.kotlin.idea.configuration.detectPlatformByPlugin
import org.jetbrains.kotlin.idea.configuration.detectPlatformKindByPlugin
import org.jetbrains.kotlin.idea.framework.detectLibraryKind
import org.jetbrains.kotlin.idea.platform.tooling
import java.io.File
@@ -44,7 +44,7 @@ class KotlinAndroidGradleLibraryDataService : AbstractProjectDataService<JavaMod
) {
for (dataNode in toImport) {
@Suppress("UNCHECKED_CAST")
val targetLibraryKind = detectPlatformByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
val targetLibraryKind = detectPlatformKindByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
if (targetLibraryKind != null) {
for (dep in dataNode.data.jarLibraryDependencies) {
val library = modelsProvider.findLibraryByBinaryPath(dep.binaryPath) as LibraryEx? ?: continue
@@ -28,7 +28,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.libraries.Library
import org.jetbrains.kotlin.idea.configuration.detectPlatformByPlugin
import org.jetbrains.kotlin.idea.configuration.detectPlatformKindByPlugin
import org.jetbrains.kotlin.idea.framework.detectLibraryKind
import org.jetbrains.kotlin.idea.platform.tooling
import java.io.File
@@ -44,7 +44,7 @@ class KotlinAndroidGradleLibraryDataService : AbstractProjectDataService<JavaMod
) {
for (dataNode in toImport) {
@Suppress("UNCHECKED_CAST")
val targetLibraryKind = detectPlatformByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
val targetLibraryKind = detectPlatformKindByPlugin(dataNode.parent as DataNode<ModuleData>)?.tooling?.libraryKind
if (targetLibraryKind != null) {
for (dep in dataNode.data.jarLibraryDependencies) {
val library = modelsProvider.findLibraryByBinaryPath(dep.binaryPath) as LibraryEx? ?: continue
@@ -162,7 +162,7 @@ class KotlinGradleLibraryDataService : AbstractProjectDataService<LibraryData, V
@Suppress("UNCHECKED_CAST")
val moduleDataNodes = projectDataNode.children.filter { it.data is ModuleData } as List<DataNode<ModuleData>>
val anyNonJvmModules = moduleDataNodes
.any { node -> detectPlatformByPlugin(node)?.takeIf { !it.isJvm } != null }
.any { node -> detectPlatformKindByPlugin(node)?.takeIf { !it.isJvm } != null }
for (libraryDataNode in toImport) {
val ideLibrary = modelsProvider.findIdeLibrary(libraryDataNode.data) ?: continue
@@ -202,11 +202,26 @@ class KotlinGradleLibraryDataService : AbstractProjectDataService<LibraryData, V
}
}
fun detectPlatformByPlugin(moduleNode: DataNode<ModuleData>): IdePlatformKind<*>? {
fun detectPlatformKindByPlugin(moduleNode: DataNode<ModuleData>): IdePlatformKind<*>? {
val pluginId = moduleNode.platformPluginId
return IdePlatformKind.ALL_KINDS.firstOrNull { it.tooling.gradlePluginId == pluginId }
}
@Suppress("DEPRECATION_ERROR")
@Deprecated(
"Use detectPlatformKindByPlugin() instead",
replaceWith = ReplaceWith("detectPlatformKindByPlugin(moduleNode)"),
level = DeprecationLevel.ERROR
)
fun detectPlatformByPlugin(moduleNode: DataNode<ModuleData>): TargetPlatformKind<*>? {
return when (moduleNode.platformPluginId) {
"kotlin-platform-jvm" -> TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]
"kotlin-platform-js" -> TargetPlatformKind.JavaScript
"kotlin-platform-common" -> TargetPlatformKind.Common
else -> null
}
}
private fun detectPlatformByLibrary(moduleNode: DataNode<ModuleData>): IdePlatformKind<*>? {
val detectedPlatforms =
mavenLibraryIdToPlatform.entries
@@ -246,7 +261,7 @@ fun configureFacetByGradleModule(
val compilerVersion = moduleNode.findAll(BuildScriptClasspathData.KEY).firstOrNull()?.data?.let(::findKotlinPluginVersion)
?: return null
val platformKind = detectPlatformByPlugin(moduleNode) ?: detectPlatformByLibrary(moduleNode)
val platformKind = detectPlatformKindByPlugin(moduleNode) ?: detectPlatformByLibrary(moduleNode)
// TODO there should be a way to figure out the correct platform version
val platform = platformKind?.defaultPlatform
@@ -26,6 +26,31 @@ import org.jetbrains.kotlin.platform.impl.JsIdePlatformKind
import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind
import org.jetbrains.kotlin.utils.DescriptionAware
@Deprecated("Use IdePlatformKind instead.", level = DeprecationLevel.ERROR)
sealed class TargetPlatformKind<out Version : TargetPlatformVersion>(
val version: Version,
val name: String
) : DescriptionAware {
override val description = "$name ${version.description}"
class Jvm(version: JvmTarget) : @Suppress("DEPRECATION_ERROR") TargetPlatformKind<JvmTarget>(version, "JVM") {
companion object {
private val JVM_PLATFORMS by lazy { JvmTarget.values().map(::Jvm) }
operator fun get(version: JvmTarget) = JVM_PLATFORMS[version.ordinal]
}
}
object JavaScript : @Suppress("DEPRECATION_ERROR") TargetPlatformKind<TargetPlatformVersion.NoVersion>(
TargetPlatformVersion.NoVersion,
"JavaScript"
)
object Common : @Suppress("DEPRECATION_ERROR") TargetPlatformKind<TargetPlatformVersion.NoVersion>(
TargetPlatformVersion.NoVersion,
"Common (experimental)"
)
}
object CoroutineSupport {
@JvmStatic
fun byCompilerArguments(arguments: CommonCompilerArguments?): LanguageFeature.State =
@@ -82,4 +82,13 @@ class JSLibraryType : LibraryType<DummyLibraryProperties>(JSLibraryKind) {
}
}
private fun isAcceptedForJsLibrary(extension: String?) = extension == "js" || extension == "kjsm"
private fun isAcceptedForJsLibrary(extension: String?) = extension == "js" || extension == "kjsm"
@Suppress("DEPRECATION_ERROR")
// Can't import a member annotated with DEPRECATION_ERROR
val org.jetbrains.kotlin.config.TargetPlatformKind<*>.libraryKind: PersistentLibraryKind<*>?
get() = when (this) {
org.jetbrains.kotlin.config.TargetPlatformKind.JavaScript -> JSLibraryKind
org.jetbrains.kotlin.config.TargetPlatformKind.Common -> CommonLibraryKind
else -> null
}