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
|
||||
?: return
|
||||
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) }
|
||||
}
|
||||
|
||||
|
||||
@@ -18,20 +18,25 @@ package org.jetbrains.kotlin.idea.configuration
|
||||
|
||||
import com.intellij.openapi.externalSystem.model.DataNode
|
||||
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.service.project.IdeModifiableModelsProvider
|
||||
import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService
|
||||
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.config.CoroutineSupport
|
||||
import org.jetbrains.kotlin.config.TargetPlatformKind
|
||||
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
||||
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
||||
import org.jetbrains.kotlin.idea.facet.configureFacet
|
||||
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.findKotlinPluginVersion
|
||||
import org.jetbrains.kotlin.idea.inspections.gradle.getResolvedKotlinStdlibVersionByModuleData
|
||||
import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData
|
||||
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
||||
import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataService
|
||||
import java.util.*
|
||||
|
||||
interface GradleProjectImportHandler {
|
||||
@@ -46,6 +51,23 @@ interface GradleProjectImportHandler {
|
||||
class KotlinGradleProjectDataService : AbstractProjectDataService<GradleSourceSetData, Void>() {
|
||||
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(
|
||||
toImport: Collection<DataNode<GradleSourceSetData>>,
|
||||
projectData: ProjectData?,
|
||||
@@ -59,11 +81,12 @@ class KotlinGradleProjectDataService : AbstractProjectDataService<GradleSourceSe
|
||||
val moduleNode = ExternalSystemApiUtil.findParent(sourceSetNode, ProjectKeys.MODULE)
|
||||
val compilerVersion = moduleNode?.findAll(BuildScriptClasspathData.KEY)?.firstOrNull()?.data?.let(::findKotlinPluginVersion)
|
||||
?: continue
|
||||
val platformKind = detectPlatformByPlugin(moduleNode) ?: detectPlatformByLibrary(moduleNode)
|
||||
|
||||
val coroutinesProperty = findKotlinCoroutinesProperty(project)
|
||||
|
||||
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider)
|
||||
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, modelsProvider)
|
||||
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platformKind, modelsProvider)
|
||||
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()) {
|
||||
return TargetPlatformKind.JavaScript
|
||||
}
|
||||
if (getRuntimeLibraryVersions(module, rootModel, TargetPlatformKind.Default).isNotEmpty()) {
|
||||
return TargetPlatformKind.Default
|
||||
}
|
||||
return TargetPlatformKind.Jvm.JVM_1_6
|
||||
}
|
||||
|
||||
@@ -153,10 +156,15 @@ fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider): Kotlin
|
||||
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
|
||||
with(configuration.settings) {
|
||||
versionInfo.targetPlatformKind = null
|
||||
versionInfo.targetPlatformKind = platformKind
|
||||
versionInfo.apiLevel = null
|
||||
initializeIfNeeded(module, modelsProvider.getModifiableRootModel(module))
|
||||
with(versionInfo) {
|
||||
|
||||
Reference in New Issue
Block a user