From 37286d5b0634ad24f01166a212d164288e258fca Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 13 Oct 2016 18:23:30 +0300 Subject: [PATCH] Kotlin Facet: Add API version setting --- .../idea/facet/KotlinFacetConfiguration.kt | 1 + .../kotlin/idea/facet/KotlinFacetEditorTab.kt | 71 ++++++++++++++----- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt index ec1fd5fef0e..eebb4906013 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/KotlinFacetConfiguration.kt @@ -40,6 +40,7 @@ class KotlinFacetConfiguration : FacetConfiguration, PersistentStateComponent(KotlinFacetConfiguration.LanguageLevel.values()).apply { + setRenderer(DescriptionListCellRenderer()) + } + private val targetPlatformComboBox = JComboBox(KotlinFacetConfiguration.TargetPlatform.values()).apply { setRenderer(DescriptionListCellRenderer()) } - private val validator: FrameworkLibraryValidator + private val libraryValidator: FrameworkLibraryValidator + private val versionValidator = VersionValidator() - private fun getRuntimeLibraryVersions( - libToProperties: Library.() -> LibraryVersionProperties? - ): List { + private fun getRuntimeLibraryVersions(presentationProvider: LibraryPresentationProvider): List { return editorContext .rootModel .orderEntries .asSequence() .filterIsInstance() - .mapNotNull { it.library?.libToProperties()?.versionString } + .mapNotNull { it.library?.let { getLibraryProperties(presentationProvider, it) } ?.versionString } .toList() } private fun getDefaultTargetPlatform(): KotlinFacetConfiguration.TargetPlatform { - getRuntimeLibraryVersions { getLibraryProperties(JSLibraryStdPresentationProvider.getInstance(), this) }.firstOrNull()?.let { javaLib -> + getRuntimeLibraryVersions(JSLibraryStdPresentationProvider.getInstance()).firstOrNull()?.let { return KotlinFacetConfiguration.TargetPlatform.JS } @@ -98,21 +110,36 @@ class KotlinFacetEditorTab( } } - private fun getDefaultLanguageLevel(): KotlinFacetConfiguration.LanguageLevel { - val libVersion = bundledRuntimeVersion() + 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 { - validator = FrameworkLibraryValidatorWithDynamicDescription( + libraryValidator = FrameworkLibraryValidatorWithDynamicDescription( DelegatingLibrariesValidatorContext(editorContext), validatorsManager, "kotlin" ) { (targetPlatformComboBox.selectedItem as KotlinFacetConfiguration.TargetPlatform).libraryDescription } - validatorsManager.registerValidator(validator) + + validatorsManager.registerValidator(libraryValidator) + validatorsManager.registerValidator(versionValidator) targetPlatformComboBox.addActionListener { validatorsManager.validate() @@ -126,6 +153,10 @@ class KotlinFacetEditorTab( if (languageLevel == null) { languageLevel = getDefaultLanguageLevel() } + + if (apiLevel == null) { + apiLevel = languageLevel!!.coerceAtMost(getLibraryLanguageLevel()) + } } reset() @@ -134,16 +165,19 @@ class KotlinFacetEditorTab( override fun isModified(): Boolean { return languageVersionComboBox.selectedItem != configuration.state.languageLevel || targetPlatformComboBox.selectedItem != configuration.state.targetPlatformKind + || apiVersionComboBox.selectedItem != configuration.state.apiLevel } override fun reset() { languageVersionComboBox.selectedItem = configuration.state.languageLevel targetPlatformComboBox.selectedItem = configuration.state.targetPlatformKind + apiVersionComboBox.selectedItem = configuration.state.apiLevel } override fun apply() { configuration.state.languageLevel = languageVersionComboBox.selectedItem as KotlinFacetConfiguration.LanguageLevel? configuration.state.targetPlatformKind = targetPlatformComboBox.selectedItem as KotlinFacetConfiguration.TargetPlatform? + configuration.state.apiLevel = apiVersionComboBox.selectedItem as KotlinFacetConfiguration.LanguageLevel? } override fun getDisplayName() = "General" @@ -153,6 +187,7 @@ class KotlinFacetEditorTab( val contentPanel = FormBuilder .createFormBuilder() .addLabeledComponent("&Language version: ", languageVersionComboBox) + .addLabeledComponent("&Standard library API version: ", apiVersionComboBox) .addLabeledComponent("&Target platform: ", targetPlatformComboBox) .panel mainPanel.add(contentPanel, BorderLayout.NORTH)