Kotlin Facet: Detect module platform using Gradle plugin id/stdlib
artifact id (Gradle import)
This commit is contained in:
@@ -105,7 +105,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
|
|||||||
val compilerVersion = mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID)?.version
|
val compilerVersion = mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID)?.version
|
||||||
?: return
|
?: return
|
||||||
val kotlinFacet = module.getOrCreateFacet(modifiableModelsProvider)
|
val kotlinFacet = module.getOrCreateFacet(modifiableModelsProvider)
|
||||||
kotlinFacet.configureFacet(compilerVersion, CoroutineSupport.DEFAULT, modifiableModelsProvider)
|
kotlinFacet.configureFacet(compilerVersion, CoroutineSupport.DEFAULT, null, modifiableModelsProvider)
|
||||||
MavenProjectImportHandler.getInstances(module.project).forEach { it(kotlinFacet, mavenProject) }
|
MavenProjectImportHandler.getInstances(module.project).forEach { it(kotlinFacet, mavenProject) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,20 +18,25 @@ package org.jetbrains.kotlin.idea.configuration
|
|||||||
|
|
||||||
import com.intellij.openapi.externalSystem.model.DataNode
|
import com.intellij.openapi.externalSystem.model.DataNode
|
||||||
import com.intellij.openapi.externalSystem.model.ProjectKeys
|
import com.intellij.openapi.externalSystem.model.ProjectKeys
|
||||||
|
import com.intellij.openapi.externalSystem.model.project.ModuleData
|
||||||
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
||||||
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
|
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
|
||||||
import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService
|
import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService
|
||||||
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.config.CoroutineSupport
|
import org.jetbrains.kotlin.config.CoroutineSupport
|
||||||
|
import org.jetbrains.kotlin.config.TargetPlatformKind
|
||||||
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
||||||
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
||||||
import org.jetbrains.kotlin.idea.facet.configureFacet
|
import org.jetbrains.kotlin.idea.facet.configureFacet
|
||||||
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
|
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
|
||||||
|
import org.jetbrains.kotlin.idea.facet.mavenLibraryId
|
||||||
import org.jetbrains.kotlin.idea.inspections.gradle.findAll
|
import org.jetbrains.kotlin.idea.inspections.gradle.findAll
|
||||||
import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
|
import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion
|
||||||
|
import org.jetbrains.kotlin.idea.inspections.gradle.getResolvedKotlinStdlibVersionByModuleData
|
||||||
import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData
|
import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData
|
||||||
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
||||||
|
import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataService
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
interface GradleProjectImportHandler {
|
interface GradleProjectImportHandler {
|
||||||
@@ -46,6 +51,23 @@ interface GradleProjectImportHandler {
|
|||||||
class KotlinGradleProjectDataService : AbstractProjectDataService<GradleSourceSetData, Void>() {
|
class KotlinGradleProjectDataService : AbstractProjectDataService<GradleSourceSetData, Void>() {
|
||||||
override fun getTargetDataKey() = GradleSourceSetData.KEY
|
override fun getTargetDataKey() = GradleSourceSetData.KEY
|
||||||
|
|
||||||
|
private fun detectPlatformByPlugin(moduleNode: DataNode<ModuleData>): TargetPlatformKind<*>? {
|
||||||
|
val projectNode = ExternalSystemApiUtil.findParent(moduleNode, ProjectKeys.PROJECT)
|
||||||
|
val externalProjectNode = ExternalSystemApiUtil.find(projectNode as DataNode<*>, ExternalProjectDataService.KEY)
|
||||||
|
return externalProjectNode?.let {
|
||||||
|
when (it.data.plugins.values.map { it.id }.firstOrNull { it.startsWith("kotlin-platform-") }) {
|
||||||
|
"kotlin-platform-jvm" -> TargetPlatformKind.Jvm.JVM_1_6
|
||||||
|
"kotlin-platform-js" -> TargetPlatformKind.JavaScript
|
||||||
|
"kotlin-platform-common" -> TargetPlatformKind.Default
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun detectPlatformByLibrary(moduleNode: DataNode<ModuleData>): TargetPlatformKind<*>? {
|
||||||
|
return TargetPlatformKind.ALL_PLATFORMS.firstOrNull { moduleNode.getResolvedKotlinStdlibVersionByModuleData(it.mavenLibraryId) != null }
|
||||||
|
}
|
||||||
|
|
||||||
override fun postProcess(
|
override fun postProcess(
|
||||||
toImport: Collection<DataNode<GradleSourceSetData>>,
|
toImport: Collection<DataNode<GradleSourceSetData>>,
|
||||||
projectData: ProjectData?,
|
projectData: ProjectData?,
|
||||||
@@ -59,11 +81,12 @@ class KotlinGradleProjectDataService : AbstractProjectDataService<GradleSourceSe
|
|||||||
val moduleNode = ExternalSystemApiUtil.findParent(sourceSetNode, ProjectKeys.MODULE)
|
val moduleNode = ExternalSystemApiUtil.findParent(sourceSetNode, ProjectKeys.MODULE)
|
||||||
val compilerVersion = moduleNode?.findAll(BuildScriptClasspathData.KEY)?.firstOrNull()?.data?.let(::findKotlinPluginVersion)
|
val compilerVersion = moduleNode?.findAll(BuildScriptClasspathData.KEY)?.firstOrNull()?.data?.let(::findKotlinPluginVersion)
|
||||||
?: continue
|
?: continue
|
||||||
|
val platformKind = detectPlatformByPlugin(moduleNode) ?: detectPlatformByLibrary(moduleNode)
|
||||||
|
|
||||||
val coroutinesProperty = findKotlinCoroutinesProperty(project)
|
val coroutinesProperty = findKotlinCoroutinesProperty(project)
|
||||||
|
|
||||||
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider)
|
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider)
|
||||||
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, modelsProvider)
|
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platformKind, modelsProvider)
|
||||||
GradleProjectImportHandler.getInstances(project).forEach { it(kotlinFacet, sourceSetNode) }
|
GradleProjectImportHandler.getInstances(project).forEach { it(kotlinFacet, sourceSetNode) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel?
|
|||||||
if (getRuntimeLibraryVersions(module, rootModel, TargetPlatformKind.JavaScript).isNotEmpty()) {
|
if (getRuntimeLibraryVersions(module, rootModel, TargetPlatformKind.JavaScript).isNotEmpty()) {
|
||||||
return TargetPlatformKind.JavaScript
|
return TargetPlatformKind.JavaScript
|
||||||
}
|
}
|
||||||
|
if (getRuntimeLibraryVersions(module, rootModel, TargetPlatformKind.Default).isNotEmpty()) {
|
||||||
|
return TargetPlatformKind.Default
|
||||||
|
}
|
||||||
return TargetPlatformKind.Jvm.JVM_1_6
|
return TargetPlatformKind.Jvm.JVM_1_6
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,10 +156,15 @@ fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider): Kotlin
|
|||||||
return facet
|
return facet
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KotlinFacet.configureFacet(compilerVersion: String, coroutineSupport: CoroutineSupport, modelsProvider: IdeModifiableModelsProvider) {
|
fun KotlinFacet.configureFacet(
|
||||||
|
compilerVersion: String,
|
||||||
|
coroutineSupport: CoroutineSupport,
|
||||||
|
platformKind: TargetPlatformKind<*>?, // if null, detect by module dependencies
|
||||||
|
modelsProvider: IdeModifiableModelsProvider
|
||||||
|
) {
|
||||||
val module = module
|
val module = module
|
||||||
with(configuration.settings) {
|
with(configuration.settings) {
|
||||||
versionInfo.targetPlatformKind = null
|
versionInfo.targetPlatformKind = platformKind
|
||||||
versionInfo.apiLevel = null
|
versionInfo.apiLevel = null
|
||||||
initializeIfNeeded(module, modelsProvider.getModifiableRootModel(module))
|
initializeIfNeeded(module, modelsProvider.getModifiableRootModel(module))
|
||||||
with(versionInfo) {
|
with(versionInfo) {
|
||||||
|
|||||||
Reference in New Issue
Block a user