From e59754e86ccfdcb053ad86c6d6304493f3a979b4 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 9 Nov 2016 11:50:33 +0300 Subject: [PATCH] Kotlin Facet: Configure facet automatically on Maven project import --- .../kotlin/config/LanguageVersionSettings.kt | 4 +++ .../kotlin/idea/maven/KotlinMavenImporter.kt | 27 +++++++++++++++++++ .../jetbrains/kotlin/idea/facet/facetUtils.kt | 13 ++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index f9803dfec7c..0784b47832a 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.config import com.intellij.openapi.module.Module +import com.intellij.util.text.VersionComparatorUtil import org.jetbrains.kotlin.config.LanguageVersion.KOTLIN_1_1 import org.jetbrains.kotlin.utils.DescriptionAware @@ -59,6 +60,9 @@ enum class LanguageVersion(val versionString: String) : DescriptionAware { @JvmStatic fun fromVersionString(str: String) = values().find { it.versionString == str } + @JvmStatic + fun fromFullVersionString(str: String) = str.split(".", "-").let { if (it.size >= 2) fromVersionString("${it[0]}.${it[1]}") else null } + @JvmField val LATEST = values().last() } 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 326a15a128a..fca3c51dae2 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 @@ -33,6 +33,12 @@ import org.jetbrains.idea.maven.model.MavenPlugin import org.jetbrains.idea.maven.project.* import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.config.TargetPlatformKind +import org.jetbrains.kotlin.idea.facet.getOrCreateFacet +import org.jetbrains.kotlin.idea.facet.initializeIfNeeded +import org.jetbrains.kotlin.idea.facet.mavenLibraryId +import org.jetbrains.kotlin.idea.maven.configuration.KotlinMavenConfigurator import java.io.File import java.util.* @@ -79,6 +85,27 @@ class KotlinMavenImporter : MavenImporter(KotlinPluginGroupId, KotlinPluginArtif MavenProjectsManager.getInstance(module.project).scheduleArtifactsDownloading(listOf(mavenProject), toBeDownloaded, true, false, AsyncResult()) } } + + configureFacet(mavenProject, modifiableModelsProvider, module) + } + + private fun configureFacet(mavenProject: MavenProject, modifiableModelsProvider: IdeModifiableModelsProvider, module: Module) { + val compilerVersion = mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID)?.version ?: return + val artifacts = mavenProject.dependencyArtifactIndex.data[KotlinPluginGroupId]?.values?.flatMap { it.filter { it.isResolved } } + val expectedLibraryIds = TargetPlatformKind.ALL_PLATFORMS.map { it.mavenLibraryId } + val stdlibArtifact = artifacts?.firstOrNull { it.artifactId in expectedLibraryIds } + + val facet = module.getOrCreateFacet(modifiableModelsProvider) + with(facet.configuration.settings.versionInfo) { + targetPlatformKind = null + apiLevel = null + facet.configuration.settings.initializeIfNeeded(module, modifiableModelsProvider.getModifiableRootModel(module)) + languageLevel = LanguageVersion.fromFullVersionString(compilerVersion) + // Both apiLevel and languageLevel should be initialized in the lines above + if (apiLevel!! > languageLevel!!) { + apiLevel = languageLevel + } + } } // TODO in theory it should work like this but it doesn't as it couldn't unmark source roots that are not roots anymore. diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index 5497ba50916..e329bb3d841 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.facet +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider import com.intellij.openapi.module.Module import com.intellij.openapi.projectRoots.JavaSdk import com.intellij.openapi.projectRoots.JavaSdkVersion @@ -98,7 +99,7 @@ internal fun getLibraryLanguageLevel( return getDefaultLanguageLevel(module, minVersion) } -internal fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) { +fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) { val project = module.project with(versionInfo) { @@ -135,3 +136,13 @@ val TargetPlatformKind<*>.mavenLibraryId: String is TargetPlatformKind.Jvm -> MAVEN_STDLIB_ID is TargetPlatformKind.JavaScript -> MAVEN_JS_STDLIB_ID } + +fun Module.getOrCreateFacet(modelsProvider: IdeModifiableModelsProvider): KotlinFacet { + val facetModel = modelsProvider.getModifiableFacetModel(this) + + facetModel.findFacet(KotlinFacetType.TYPE_ID, KotlinFacetType.INSTANCE.defaultFacetName)?.let { return it } + + val facet = with(KotlinFacetType.INSTANCE) { createFacet(this@getOrCreateFacet, defaultFacetName, createDefaultConfiguration(), null) } + facetModel.addFacet(facet) + return facet +}