Configuration: Support selection of "Latest stable" version vs specific one
#KT-21229 Fixed
Original commit: 38d3362bcb
This commit is contained in:
@@ -70,6 +70,48 @@ object CoroutineSupport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sealed class VersionView : DescriptionAware {
|
||||||
|
abstract val version: LanguageVersion
|
||||||
|
|
||||||
|
object LatestStable : VersionView() {
|
||||||
|
override val version: LanguageVersion = LanguageVersion.LATEST_STABLE
|
||||||
|
|
||||||
|
override val description: String
|
||||||
|
get() = "Latest stable (${version.versionString})"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Specific(override val version: LanguageVersion) : VersionView() {
|
||||||
|
override val description: String
|
||||||
|
get() = version.description
|
||||||
|
|
||||||
|
override fun equals(other: Any?) = other is Specific && version == other.version
|
||||||
|
|
||||||
|
override fun hashCode() = version.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun deserialize(value: String?, isAutoAdvance: Boolean): VersionView {
|
||||||
|
if (isAutoAdvance) return VersionView.LatestStable
|
||||||
|
val languageVersion = LanguageVersion.fromVersionString(value)
|
||||||
|
return if (languageVersion != null) VersionView.Specific(languageVersion) else VersionView.LatestStable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var CommonCompilerArguments.languageVersionView: VersionView
|
||||||
|
get() = VersionView.deserialize(languageVersion, autoAdvanceLanguageVersion)
|
||||||
|
set(value) {
|
||||||
|
languageVersion = value.version.versionString
|
||||||
|
autoAdvanceLanguageVersion = value == VersionView.LatestStable
|
||||||
|
}
|
||||||
|
|
||||||
|
var CommonCompilerArguments.apiVersionView: VersionView
|
||||||
|
get() = VersionView.deserialize(apiVersion, autoAdvanceApiVersion)
|
||||||
|
set(value) {
|
||||||
|
apiVersion = value.version.versionString
|
||||||
|
autoAdvanceApiVersion = value == VersionView.LatestStable
|
||||||
|
}
|
||||||
|
|
||||||
class KotlinFacetSettings {
|
class KotlinFacetSettings {
|
||||||
companion object {
|
companion object {
|
||||||
// Increment this when making serialization-incompatible changes to configuration data
|
// Increment this when making serialization-incompatible changes to configuration data
|
||||||
|
|||||||
@@ -74,6 +74,8 @@ private fun readV1Config(element: Element): KotlinFacetSettings {
|
|||||||
compilerArguments.apiVersion = apiLevel
|
compilerArguments.apiVersion = apiLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compilerArguments.detectVersionAutoAdvance()
|
||||||
|
|
||||||
if (useProjectSettings != null) {
|
if (useProjectSettings != null) {
|
||||||
this.useProjectSettings = useProjectSettings
|
this.useProjectSettings = useProjectSettings
|
||||||
}
|
}
|
||||||
@@ -106,6 +108,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings {
|
|||||||
element.getChild("compilerArguments")?.let {
|
element.getChild("compilerArguments")?.let {
|
||||||
compilerArguments = platformKind.createCompilerArguments { freeArgs = ArrayList() }
|
compilerArguments = platformKind.createCompilerArguments { freeArgs = ArrayList() }
|
||||||
XmlSerializer.deserializeInto(compilerArguments!!, it)
|
XmlSerializer.deserializeInto(compilerArguments!!, it)
|
||||||
|
compilerArguments!!.detectVersionAutoAdvance()
|
||||||
}
|
}
|
||||||
testOutputPath = element.getChild("testOutputPath")?.let {
|
testOutputPath = element.getChild("testOutputPath")?.let {
|
||||||
PathUtil.toSystemDependentName((it.content.firstOrNull() as? Text)?.textTrim)
|
PathUtil.toSystemDependentName((it.content.firstOrNull() as? Text)?.textTrim)
|
||||||
@@ -214,8 +217,8 @@ private fun Element.restoreNormalOrdering(bean: Any) {
|
|||||||
.forEachIndexed { index, element -> elementsToReorder[index] = element.clone() }
|
.forEachIndexed { index, element -> elementsToReorder[index] = element.clone() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildChildElement(element: Element, tag: String, bean: Any, filter: SerializationFilter) {
|
private fun buildChildElement(element: Element, tag: String, bean: Any, filter: SerializationFilter): Element {
|
||||||
Element(tag).apply {
|
return Element(tag).apply {
|
||||||
XmlSerializer.serializeInto(bean, this, filter)
|
XmlSerializer.serializeInto(bean, this, filter)
|
||||||
restoreNormalOrdering(bean)
|
restoreNormalOrdering(bean)
|
||||||
element.addContent(this)
|
element.addContent(this)
|
||||||
@@ -245,7 +248,24 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) {
|
|||||||
}
|
}
|
||||||
compilerArguments?.let { copyBean(it) }?.let {
|
compilerArguments?.let { copyBean(it) }?.let {
|
||||||
it.convertPathsToSystemIndependent()
|
it.convertPathsToSystemIndependent()
|
||||||
buildChildElement(element, "compilerArguments", it, filter)
|
val compilerArgumentsXml = buildChildElement(element, "compilerArguments", it, filter)
|
||||||
|
compilerArgumentsXml.dropVersionsIfNecessary(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun CommonCompilerArguments.detectVersionAutoAdvance() {
|
||||||
|
autoAdvanceLanguageVersion = languageVersion == null
|
||||||
|
autoAdvanceApiVersion = apiVersion == null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Element.dropVersionsIfNecessary(settings: CommonCompilerArguments) {
|
||||||
|
// Do not serialize language/api version if they correspond to the default language version
|
||||||
|
if (settings.autoAdvanceLanguageVersion) {
|
||||||
|
getOption("languageVersion")?.detach()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.autoAdvanceApiVersion) {
|
||||||
|
getOption("apiVersion")?.detach()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user