Kotlin Facet: Track configuration version

This commit is contained in:
Alexey Sedunov
2016-11-10 19:49:38 +03:00
parent 27aaac5a96
commit 4613eed406
4 changed files with 35 additions and 19 deletions
@@ -76,6 +76,12 @@ class KotlinCompilerInfo {
} }
class KotlinFacetSettings { class KotlinFacetSettings {
companion object {
// Increment this when making serialization-incompatible changes to configuration data
val CURRENT_VERSION = 1
val DEFAULT_VERSION = 0
}
var versionInfo = KotlinVersionInfo() var versionInfo = KotlinVersionInfo()
var compilerInfo = KotlinCompilerInfo() var compilerInfo = KotlinCompilerInfo()
} }
@@ -20,36 +20,46 @@ import com.intellij.facet.FacetConfiguration
import com.intellij.facet.ui.FacetEditorContext 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.util.xmlb.XmlSerializer
import org.jdom.DataConversionException
import org.jdom.Element import org.jdom.Element
import org.jetbrains.kotlin.config.KotlinFacetSettings import org.jetbrains.kotlin.config.KotlinFacetSettings
class KotlinFacetConfiguration : FacetConfiguration, PersistentStateComponent<KotlinFacetSettings> { class KotlinFacetConfiguration : FacetConfiguration {
private var settings = KotlinFacetSettings() var settings = KotlinFacetSettings()
private set
@Suppress("OverridingDeprecatedMember") @Suppress("OverridingDeprecatedMember")
override fun readExternal(element: Element?) { override fun readExternal(element: Element) {
val version =
try {
element.getAttribute("version")?.intValue
}
catch(e: DataConversionException) {
null
} ?: KotlinFacetSettings.DEFAULT_VERSION
// Reset facet configuration if versions don't match
if (version == KotlinFacetSettings.CURRENT_VERSION) {
XmlSerializer.deserializeInto(settings, element)
}
else {
settings = KotlinFacetSettings()
}
} }
@Suppress("OverridingDeprecatedMember") @Suppress("OverridingDeprecatedMember")
override fun writeExternal(element: Element?) { override fun writeExternal(element: Element) {
element.setAttribute("version", KotlinFacetSettings.CURRENT_VERSION.toString())
XmlSerializer.serializeInto(settings, element)
} }
override fun loadState(state: KotlinFacetSettings) {
this.settings = state
}
override fun getState() = settings
override fun createEditorTabs( override fun createEditorTabs(
editorContext: FacetEditorContext, editorContext: FacetEditorContext,
validatorsManager: FacetValidatorsManager validatorsManager: FacetValidatorsManager
): Array<FacetEditorTab> { ): Array<FacetEditorTab> {
state.initializeIfNeeded(editorContext.module, editorContext.rootModel) settings.initializeIfNeeded(editorContext.module, editorContext.rootModel)
val compilerTab = KotlinFacetEditorCompilerTab(state.compilerInfo, editorContext) val compilerTab = KotlinFacetEditorCompilerTab(settings.compilerInfo, editorContext)
val generalTab = KotlinFacetEditorGeneralTab(this, editorContext, validatorsManager, compilerTab) val generalTab = KotlinFacetEditorGeneralTab(this, editorContext, validatorsManager, compilerTab)
val tabs = arrayListOf(generalTab, compilerTab) val tabs = arrayListOf(generalTab, compilerTab)
KotlinFacetConfigurationExtension.EP_NAME.extensions.flatMapTo(tabs) { it.createEditorTabs(editorContext, validatorsManager) } KotlinFacetConfigurationExtension.EP_NAME.extensions.flatMapTo(tabs) { it.createEditorTabs(editorContext, validatorsManager) }
@@ -105,7 +105,7 @@ class KotlinFacetEditorGeneralTab(
} }
override fun isModified(): Boolean { override fun isModified(): Boolean {
return with(configuration.state.versionInfo) { return with(configuration.settings.versionInfo) {
languageVersionComboBox.selectedItem != languageLevel languageVersionComboBox.selectedItem != languageLevel
|| targetPlatformComboBox.selectedItem != targetPlatformKind || targetPlatformComboBox.selectedItem != targetPlatformKind
|| apiVersionComboBox.selectedItem != apiLevel || apiVersionComboBox.selectedItem != apiLevel
@@ -113,7 +113,7 @@ class KotlinFacetEditorGeneralTab(
} }
override fun reset() { override fun reset() {
with(configuration.state.versionInfo) { with(configuration.settings.versionInfo) {
languageVersionComboBox.selectedItem = languageLevel languageVersionComboBox.selectedItem = languageLevel
targetPlatformComboBox.selectedItem = targetPlatformKind targetPlatformComboBox.selectedItem = targetPlatformKind
apiVersionComboBox.selectedItem = apiLevel apiVersionComboBox.selectedItem = apiLevel
@@ -121,7 +121,7 @@ class KotlinFacetEditorGeneralTab(
} }
override fun apply() { override fun apply() {
with(configuration.state.versionInfo) { with(configuration.settings.versionInfo) {
languageLevel = languageVersionComboBox.selectedItem as LanguageVersion? languageLevel = languageVersionComboBox.selectedItem as LanguageVersion?
targetPlatformKind = targetPlatformComboBox.selectedItem as TargetPlatformKind<*>? targetPlatformKind = targetPlatformComboBox.selectedItem as TargetPlatformKind<*>?
apiLevel = apiVersionComboBox.selectedItem as LanguageVersion? apiLevel = apiVersionComboBox.selectedItem as LanguageVersion?
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
class KotlinFacetSettingsProviderImpl : KotlinFacetSettingsProvider { class KotlinFacetSettingsProviderImpl : KotlinFacetSettingsProvider {
override fun getSettings(module: Module): KotlinFacetSettings { override fun getSettings(module: Module): KotlinFacetSettings {
val settings = KotlinFacet.get(module)?.configuration?.state ?: KotlinFacetSettings() val settings = KotlinFacet.get(module)?.configuration?.settings ?: KotlinFacetSettings()
settings.initializeIfNeeded(module, null) settings.initializeIfNeeded(module, null)
return settings return settings
} }