Kotlin Facet: Configure facet automatically on Maven project import

This commit is contained in:
Alexey Sedunov
2016-11-09 11:50:33 +03:00
parent dc33436c64
commit e59754e86c
3 changed files with 43 additions and 1 deletions

View File

@@ -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()
}

View File

@@ -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.

View File

@@ -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
}