Kotlin Facet: Extract VersionInfo class and getVersionInfo() utility function
This commit is contained in:
@@ -21,10 +21,8 @@ import com.intellij.facet.ui.FacetEditorContext
|
|||||||
import com.intellij.facet.ui.FacetEditorTab
|
import com.intellij.facet.ui.FacetEditorTab
|
||||||
import com.intellij.facet.ui.FacetValidatorsManager
|
import com.intellij.facet.ui.FacetValidatorsManager
|
||||||
import com.intellij.openapi.components.PersistentStateComponent
|
import com.intellij.openapi.components.PersistentStateComponent
|
||||||
import com.intellij.openapi.util.Key
|
|
||||||
import org.jdom.Element
|
import org.jdom.Element
|
||||||
import org.jetbrains.kotlin.idea.util.DescriptionAware
|
import org.jetbrains.kotlin.idea.util.DescriptionAware
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class KotlinFacetConfiguration : FacetConfiguration, PersistentStateComponent<KotlinFacetConfiguration.Settings> {
|
class KotlinFacetConfiguration : FacetConfiguration, PersistentStateComponent<KotlinFacetConfiguration.Settings> {
|
||||||
enum class LanguageLevel(override val description: String) : DescriptionAware {
|
enum class LanguageLevel(override val description: String) : DescriptionAware {
|
||||||
@@ -38,10 +36,14 @@ class KotlinFacetConfiguration : FacetConfiguration, PersistentStateComponent<Ko
|
|||||||
JS("JavaScript")
|
JS("JavaScript")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class VersionInfo(
|
||||||
|
var languageLevel: LanguageLevel? = null,
|
||||||
|
var apiLevel: LanguageLevel? = null,
|
||||||
|
var targetPlatformKind: TargetPlatform? = null
|
||||||
|
)
|
||||||
|
|
||||||
class Settings {
|
class Settings {
|
||||||
var languageLevel: LanguageLevel? = null
|
val versionInfo = VersionInfo()
|
||||||
var apiLevel: LanguageLevel? = null
|
|
||||||
var targetPlatformKind: TargetPlatform? = null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private var settings = Settings()
|
private var settings = Settings()
|
||||||
|
|||||||
@@ -19,17 +19,11 @@ package org.jetbrains.kotlin.idea.facet
|
|||||||
import com.intellij.facet.impl.ui.libraries.DelegatingLibrariesValidatorContext
|
import com.intellij.facet.impl.ui.libraries.DelegatingLibrariesValidatorContext
|
||||||
import com.intellij.facet.ui.*
|
import com.intellij.facet.ui.*
|
||||||
import com.intellij.facet.ui.libraries.FrameworkLibraryValidator
|
import com.intellij.facet.ui.libraries.FrameworkLibraryValidator
|
||||||
import com.intellij.framework.library.LibraryVersionProperties
|
|
||||||
import com.intellij.openapi.projectRoots.JavaSdk
|
|
||||||
import com.intellij.openapi.projectRoots.JavaSdkVersion
|
|
||||||
import com.intellij.openapi.roots.LibraryOrderEntry
|
|
||||||
import com.intellij.openapi.roots.libraries.LibraryPresentationProvider
|
|
||||||
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription
|
import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription
|
||||||
import com.intellij.util.text.VersionComparatorUtil
|
|
||||||
import com.intellij.util.ui.FormBuilder
|
import com.intellij.util.ui.FormBuilder
|
||||||
import org.jetbrains.kotlin.idea.framework.*
|
import org.jetbrains.kotlin.idea.framework.JSLibraryStdDescription
|
||||||
|
import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription
|
||||||
import org.jetbrains.kotlin.idea.util.DescriptionAware
|
import org.jetbrains.kotlin.idea.util.DescriptionAware
|
||||||
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
|
||||||
import java.awt.BorderLayout
|
import java.awt.BorderLayout
|
||||||
import java.awt.Component
|
import java.awt.Component
|
||||||
import javax.swing.*
|
import javax.swing.*
|
||||||
@@ -51,7 +45,8 @@ class KotlinFacetEditorTab(
|
|||||||
override fun check(): ValidationResult {
|
override fun check(): ValidationResult {
|
||||||
val apiLevel = apiVersionComboBox.selectedItem as? KotlinFacetConfiguration.LanguageLevel? ?: return ValidationResult.OK
|
val apiLevel = apiVersionComboBox.selectedItem as? KotlinFacetConfiguration.LanguageLevel? ?: return ValidationResult.OK
|
||||||
val languageLevel = languageVersionComboBox.selectedItem as? KotlinFacetConfiguration.LanguageLevel? ?: return ValidationResult.OK
|
val languageLevel = languageVersionComboBox.selectedItem as? KotlinFacetConfiguration.LanguageLevel? ?: return ValidationResult.OK
|
||||||
val libraryLevel = getLibraryLanguageLevel()
|
val targetPlatform = targetPlatformComboBox.selectedItem as KotlinFacetConfiguration.TargetPlatform?
|
||||||
|
val libraryLevel = getLibraryLanguageLevel(editorContext.module, editorContext.rootModel, targetPlatform)
|
||||||
if (languageLevel < apiLevel || libraryLevel < apiLevel) {
|
if (languageLevel < apiLevel || libraryLevel < apiLevel) {
|
||||||
return ValidationResult("Language version/Runtime version may not be less than API version", null)
|
return ValidationResult("Language version/Runtime version may not be less than API version", null)
|
||||||
}
|
}
|
||||||
@@ -87,50 +82,6 @@ class KotlinFacetEditorTab(
|
|||||||
private val libraryValidator: FrameworkLibraryValidator
|
private val libraryValidator: FrameworkLibraryValidator
|
||||||
private val versionValidator = VersionValidator()
|
private val versionValidator = VersionValidator()
|
||||||
|
|
||||||
private fun getRuntimeLibraryVersions(presentationProvider: LibraryPresentationProvider<LibraryVersionProperties>): List<String> {
|
|
||||||
return editorContext
|
|
||||||
.rootModel
|
|
||||||
.orderEntries
|
|
||||||
.asSequence()
|
|
||||||
.filterIsInstance<LibraryOrderEntry>()
|
|
||||||
.mapNotNull { it.library?.let { getLibraryProperties(presentationProvider, it) } ?.versionString }
|
|
||||||
.toList()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getDefaultTargetPlatform(): KotlinFacetConfiguration.TargetPlatform {
|
|
||||||
getRuntimeLibraryVersions(JSLibraryStdPresentationProvider.getInstance()).firstOrNull()?.let {
|
|
||||||
return KotlinFacetConfiguration.TargetPlatform.JS
|
|
||||||
}
|
|
||||||
|
|
||||||
val sdk = editorContext.rootModel.sdk
|
|
||||||
val sdkVersion = (sdk?.sdkType as? JavaSdk)?.getVersion(sdk!!)
|
|
||||||
return when {
|
|
||||||
sdkVersion != null && sdkVersion <= JavaSdkVersion.JDK_1_6 -> KotlinFacetConfiguration.TargetPlatform.JVM_1_6
|
|
||||||
else -> KotlinFacetConfiguration.TargetPlatform.JVM_1_8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getDefaultLanguageLevel(libraryVersion: String? = null): KotlinFacetConfiguration.LanguageLevel {
|
|
||||||
val libVersion = libraryVersion ?: bundledRuntimeVersion()
|
|
||||||
return when {
|
|
||||||
libVersion.startsWith("1.0") -> KotlinFacetConfiguration.LanguageLevel.KOTLIN_1_0
|
|
||||||
else -> KotlinFacetConfiguration.LanguageLevel.KOTLIN_1_1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getLibraryLanguageLevel(): KotlinFacetConfiguration.LanguageLevel {
|
|
||||||
val presentationProvider = when (targetPlatformComboBox.selectedItem as KotlinFacetConfiguration.TargetPlatform?) {
|
|
||||||
KotlinFacetConfiguration.TargetPlatform.JS ->
|
|
||||||
JSLibraryStdPresentationProvider.getInstance()
|
|
||||||
KotlinFacetConfiguration.TargetPlatform.JVM_1_6,
|
|
||||||
KotlinFacetConfiguration.TargetPlatform.JVM_1_8,
|
|
||||||
null ->
|
|
||||||
JavaRuntimePresentationProvider.getInstance()
|
|
||||||
}
|
|
||||||
val minVersion = getRuntimeLibraryVersions(presentationProvider).minWith(VersionComparatorUtil.COMPARATOR)
|
|
||||||
return getDefaultLanguageLevel(minVersion)
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
libraryValidator = FrameworkLibraryValidatorWithDynamicDescription(
|
libraryValidator = FrameworkLibraryValidatorWithDynamicDescription(
|
||||||
DelegatingLibrariesValidatorContext(editorContext),
|
DelegatingLibrariesValidatorContext(editorContext),
|
||||||
@@ -145,39 +96,33 @@ class KotlinFacetEditorTab(
|
|||||||
validatorsManager.validate()
|
validatorsManager.validate()
|
||||||
}
|
}
|
||||||
|
|
||||||
with(configuration.state) {
|
configuration.state.versionInfo.initializeIfNeeded(editorContext.module, editorContext.rootModel)
|
||||||
if (targetPlatformKind == null) {
|
|
||||||
targetPlatformKind = getDefaultTargetPlatform()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (languageLevel == null) {
|
|
||||||
languageLevel = getDefaultLanguageLevel()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (apiLevel == null) {
|
|
||||||
apiLevel = languageLevel!!.coerceAtMost(getLibraryLanguageLevel())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reset()
|
reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isModified(): Boolean {
|
override fun isModified(): Boolean {
|
||||||
return languageVersionComboBox.selectedItem != configuration.state.languageLevel
|
return with(configuration.state.versionInfo) {
|
||||||
|| targetPlatformComboBox.selectedItem != configuration.state.targetPlatformKind
|
languageVersionComboBox.selectedItem != languageLevel
|
||||||
|| apiVersionComboBox.selectedItem != configuration.state.apiLevel
|
|| targetPlatformComboBox.selectedItem != targetPlatformKind
|
||||||
|
|| apiVersionComboBox.selectedItem != apiLevel
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun reset() {
|
override fun reset() {
|
||||||
languageVersionComboBox.selectedItem = configuration.state.languageLevel
|
with(configuration.state.versionInfo) {
|
||||||
targetPlatformComboBox.selectedItem = configuration.state.targetPlatformKind
|
languageVersionComboBox.selectedItem = languageLevel
|
||||||
apiVersionComboBox.selectedItem = configuration.state.apiLevel
|
targetPlatformComboBox.selectedItem = targetPlatformKind
|
||||||
|
apiVersionComboBox.selectedItem = apiLevel
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun apply() {
|
override fun apply() {
|
||||||
configuration.state.languageLevel = languageVersionComboBox.selectedItem as KotlinFacetConfiguration.LanguageLevel?
|
with(configuration.state.versionInfo) {
|
||||||
configuration.state.targetPlatformKind = targetPlatformComboBox.selectedItem as KotlinFacetConfiguration.TargetPlatform?
|
languageLevel = languageVersionComboBox.selectedItem as KotlinFacetConfiguration.LanguageLevel?
|
||||||
configuration.state.apiLevel = apiVersionComboBox.selectedItem as KotlinFacetConfiguration.LanguageLevel?
|
targetPlatformKind = targetPlatformComboBox.selectedItem as KotlinFacetConfiguration.TargetPlatform?
|
||||||
|
apiLevel = apiVersionComboBox.selectedItem as KotlinFacetConfiguration.LanguageLevel?
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDisplayName() = "General"
|
override fun getDisplayName() = "General"
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.facet
|
||||||
|
|
||||||
|
import com.intellij.framework.library.LibraryVersionProperties
|
||||||
|
import com.intellij.openapi.module.Module
|
||||||
|
import com.intellij.openapi.projectRoots.JavaSdk
|
||||||
|
import com.intellij.openapi.projectRoots.JavaSdkVersion
|
||||||
|
import com.intellij.openapi.roots.LibraryOrderEntry
|
||||||
|
import com.intellij.openapi.roots.ModuleRootManager
|
||||||
|
import com.intellij.openapi.roots.ModuleRootModel
|
||||||
|
import com.intellij.openapi.roots.libraries.LibraryPresentationProvider
|
||||||
|
import com.intellij.util.text.VersionComparatorUtil
|
||||||
|
import org.jetbrains.kotlin.idea.framework.JSLibraryStdPresentationProvider
|
||||||
|
import org.jetbrains.kotlin.idea.framework.JavaRuntimePresentationProvider
|
||||||
|
import org.jetbrains.kotlin.idea.framework.getLibraryProperties
|
||||||
|
import org.jetbrains.kotlin.idea.versions.bundledRuntimeVersion
|
||||||
|
|
||||||
|
private fun getRuntimeLibraryVersions(
|
||||||
|
module: Module,
|
||||||
|
rootModel: ModuleRootModel?,
|
||||||
|
presentationProvider: LibraryPresentationProvider<LibraryVersionProperties>
|
||||||
|
): List<String> {
|
||||||
|
return (rootModel ?: ModuleRootManager.getInstance(module))
|
||||||
|
.orderEntries
|
||||||
|
.asSequence()
|
||||||
|
.filterIsInstance<LibraryOrderEntry>()
|
||||||
|
.mapNotNull { it.library?.let { getLibraryProperties(presentationProvider, it) }?.versionString }
|
||||||
|
.toList()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel?): KotlinFacetConfiguration.TargetPlatform {
|
||||||
|
getRuntimeLibraryVersions(module, rootModel, JSLibraryStdPresentationProvider.getInstance())
|
||||||
|
.firstOrNull()
|
||||||
|
?.let { return KotlinFacetConfiguration.TargetPlatform.JS }
|
||||||
|
|
||||||
|
val sdk = ((rootModel ?: ModuleRootManager.getInstance(module))).sdk
|
||||||
|
val sdkVersion = (sdk?.sdkType as? JavaSdk)?.getVersion(sdk!!)
|
||||||
|
return when {
|
||||||
|
sdkVersion != null && sdkVersion <= JavaSdkVersion.JDK_1_6 -> KotlinFacetConfiguration.TargetPlatform.JVM_1_6
|
||||||
|
else -> KotlinFacetConfiguration.TargetPlatform.JVM_1_8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getDefaultLanguageLevel(explicitVersion: String? = null): KotlinFacetConfiguration.LanguageLevel {
|
||||||
|
val libVersion = explicitVersion ?: bundledRuntimeVersion()
|
||||||
|
return when {
|
||||||
|
libVersion.startsWith("1.0") -> KotlinFacetConfiguration.LanguageLevel.KOTLIN_1_0
|
||||||
|
else -> KotlinFacetConfiguration.LanguageLevel.KOTLIN_1_1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun getLibraryLanguageLevel(
|
||||||
|
module: Module,
|
||||||
|
rootModel: ModuleRootModel?,
|
||||||
|
targetPlatform: KotlinFacetConfiguration.TargetPlatform?
|
||||||
|
): KotlinFacetConfiguration.LanguageLevel {
|
||||||
|
val presentationProvider = when (targetPlatform) {
|
||||||
|
KotlinFacetConfiguration.TargetPlatform.JS ->
|
||||||
|
JSLibraryStdPresentationProvider.getInstance()
|
||||||
|
KotlinFacetConfiguration.TargetPlatform.JVM_1_6,
|
||||||
|
KotlinFacetConfiguration.TargetPlatform.JVM_1_8,
|
||||||
|
null ->
|
||||||
|
JavaRuntimePresentationProvider.getInstance()
|
||||||
|
}
|
||||||
|
val minVersion = getRuntimeLibraryVersions(module, rootModel, presentationProvider).minWith(VersionComparatorUtil.COMPARATOR)
|
||||||
|
return getDefaultLanguageLevel(minVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun KotlinFacetConfiguration.VersionInfo.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) {
|
||||||
|
if (targetPlatformKind == null) {
|
||||||
|
targetPlatformKind = getDefaultTargetPlatform(module, rootModel)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (languageLevel == null) {
|
||||||
|
languageLevel = getDefaultLanguageLevel()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apiLevel == null) {
|
||||||
|
apiLevel = languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind!!))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun Module.getKotlinVersionInfo(rootModel: ModuleRootModel? = null): KotlinFacetConfiguration.VersionInfo {
|
||||||
|
val versionInfo = KotlinFacet.get(this)?.configuration?.state?.versionInfo ?: KotlinFacetConfiguration.VersionInfo()
|
||||||
|
versionInfo.initializeIfNeeded(this, rootModel)
|
||||||
|
return versionInfo
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user