From df33455b95c711dea4433f4eb262864c33c8d282 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 16 Dec 2016 14:46:18 +0300 Subject: [PATCH] Kotlin Facet: Detect module platform using Gradle plugin id/stdlib artifact id (Gradle import) --- .../kotlin/idea/maven/KotlinMavenImporter.kt | 2 +- .../KotlinGradleProjectDataService.kt | 25 ++++++++++++++++++- .../jetbrains/kotlin/idea/facet/facetUtils.kt | 12 +++++++-- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt index 6ac653832f8..52c1353fb9e 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt @@ -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) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectDataService.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectDataService.kt index 1f34cb51137..39d1c404398 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectDataService.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectDataService.kt @@ -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() { override fun getTargetDataKey() = GradleSourceSetData.KEY + private fun detectPlatformByPlugin(moduleNode: DataNode): 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): TargetPlatformKind<*>? { + return TargetPlatformKind.ALL_PLATFORMS.firstOrNull { moduleNode.getResolvedKotlinStdlibVersionByModuleData(it.mavenLibraryId) != null } + } + override fun postProcess( toImport: Collection>, projectData: ProjectData?, @@ -59,11 +81,12 @@ class KotlinGradleProjectDataService : AbstractProjectDataService?, // 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) {