Kotlin Facet: Configure facet automatically on Maven project import
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.config
|
package org.jetbrains.kotlin.config
|
||||||
|
|
||||||
import com.intellij.openapi.module.Module
|
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.config.LanguageVersion.KOTLIN_1_1
|
||||||
import org.jetbrains.kotlin.utils.DescriptionAware
|
import org.jetbrains.kotlin.utils.DescriptionAware
|
||||||
|
|
||||||
@@ -59,6 +60,9 @@ enum class LanguageVersion(val versionString: String) : DescriptionAware {
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun fromVersionString(str: String) = values().find { it.versionString == str }
|
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
|
@JvmField
|
||||||
val LATEST = values().last()
|
val LATEST = values().last()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,12 @@ import org.jetbrains.idea.maven.model.MavenPlugin
|
|||||||
import org.jetbrains.idea.maven.project.*
|
import org.jetbrains.idea.maven.project.*
|
||||||
import org.jetbrains.jps.model.java.JavaSourceRootType
|
import org.jetbrains.jps.model.java.JavaSourceRootType
|
||||||
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
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.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -79,6 +85,27 @@ class KotlinMavenImporter : MavenImporter(KotlinPluginGroupId, KotlinPluginArtif
|
|||||||
MavenProjectsManager.getInstance(module.project).scheduleArtifactsDownloading(listOf(mavenProject), toBeDownloaded, true, false, AsyncResult())
|
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.
|
// TODO in theory it should work like this but it doesn't as it couldn't unmark source roots that are not roots anymore.
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.facet
|
package org.jetbrains.kotlin.idea.facet
|
||||||
|
|
||||||
|
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
|
||||||
import com.intellij.openapi.module.Module
|
import com.intellij.openapi.module.Module
|
||||||
import com.intellij.openapi.projectRoots.JavaSdk
|
import com.intellij.openapi.projectRoots.JavaSdk
|
||||||
import com.intellij.openapi.projectRoots.JavaSdkVersion
|
import com.intellij.openapi.projectRoots.JavaSdkVersion
|
||||||
@@ -98,7 +99,7 @@ internal fun getLibraryLanguageLevel(
|
|||||||
return getDefaultLanguageLevel(module, minVersion)
|
return getDefaultLanguageLevel(module, minVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) {
|
fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) {
|
||||||
val project = module.project
|
val project = module.project
|
||||||
|
|
||||||
with(versionInfo) {
|
with(versionInfo) {
|
||||||
@@ -135,3 +136,13 @@ val TargetPlatformKind<*>.mavenLibraryId: String
|
|||||||
is TargetPlatformKind.Jvm -> MAVEN_STDLIB_ID
|
is TargetPlatformKind.Jvm -> MAVEN_STDLIB_ID
|
||||||
is TargetPlatformKind.JavaScript -> MAVEN_JS_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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user