Wizard: automatically determine Kotlin version based on Kotlin plugin version

For snapshot plugin just take the latest eap or stable version
This commit is contained in:
Ilya Kirillov
2020-01-19 11:32:13 +03:00
parent 40d6fe7a00
commit b9226ce54f
28 changed files with 351 additions and 79 deletions
@@ -1,5 +0,0 @@
rootProject.name = "${projectName}"
#foreach($subProject in $subProjects)
include("${subProject}")
#end
@@ -1,5 +0,0 @@
rootProject.name = '${projectName}';
#foreach($subProject in $subProjects)
include('${subProject}')
#end
@@ -0,0 +1,38 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
interface KotlinVersionProviderService : WizardService {
fun getKotlinVersion(): Version
}
class KotlinVersionProviderServiceImpl : KotlinVersionProviderService, IdeaIndependentWizardService {
override fun getKotlinVersion(): Version = DEFAULT
companion object {
val DEFAULT = Version.fromString("1.3.61")
}
}
val Version.kotlinVersionKind
get() = when {
"eap" in toString().toLowerCase() -> KotlinVersionKind.EAP
"dev" in toString().toLowerCase() -> KotlinVersionKind.DEV
"m" in toString().toLowerCase() -> KotlinVersionKind.M
else -> KotlinVersionKind.STABLE
}
enum class KotlinVersionKind(val repository: Repository?) {
STABLE(repository = null),
EAP(repository = Repositories.KOTLIN_EAP_BINTRAY),
DEV(repository = Repositories.KOTLIN_DEV_BINTRAY),
M(repository = Repositories.KOTLIN_EAP_BINTRAY)
}
@@ -9,7 +9,8 @@ object Services {
ProjectImportingWizardServiceImpl(),
OsFileSystemWizardService(),
BuildSystemAvailabilityWizardServiceImpl(),
DummyFileFormattingService()
DummyFileFormattingService(),
KotlinVersionProviderServiceImpl()
)
}
@@ -86,6 +86,8 @@ class ListBuilder<T> {
irs += this
}
fun isNotEmpty(): Boolean = irs.isNotEmpty()
fun build() = irs.toList()
}
@@ -5,6 +5,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.PluginRepositoryMavenIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
@@ -12,13 +13,15 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import java.nio.file.Path
interface FileIR : BuildSystemIR, IrsOwner
data class BuildFileIR(
val name: String,
val directoryPath: Path,
val modules: ModulesStructureIR,
val pom: PomIR,
override val irs: List<BuildSystemIR>
) : BuildSystemIR, IrsOwner {
) : FileIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): BuildFileIR = copy(irs = irs)
@Suppress("UNCHECKED_CAST")
@@ -27,7 +30,14 @@ data class BuildFileIR(
private fun distinctRepositories(): List<RepositoryIR> =
irsOfType<RepositoryIR>()
.distinctBy { it.repository }
.distinctBy(RepositoryIR::repository)
.sortedBy { repositoryIR ->
if (repositoryIR.repository is DefaultRepository) 0 else 1
}
private fun distinctPluginRepositories(): List<PluginRepositoryMavenIR> =
irsOfType<PluginRepositoryMavenIR>()
.distinctBy(PluginRepositoryMavenIR::repository)
.sortedBy { repositoryIR ->
if (repositoryIR.repository is DefaultRepository) 0 else 1
}
@@ -82,6 +92,13 @@ data class BuildFileIR(
}
}
distinctPluginRepositories().takeIf { it.isNotEmpty() }?.let { repositories ->
nl()
node("pluginRepositories") {
repositories.listNl()
}
}
val plugins = irsOfType<BuildSystemPluginIR>().takeIf { it.isNotEmpty() }
if (plugins != null) {
@@ -0,0 +1,38 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
data class SettingsGradleFileIR(
val projectName: String,
val subProjects: List<String>,
override val irs: List<BuildSystemIR>
) : FileIR, GradleIR {
override fun withReplacedIrs(irs: List<BuildSystemIR>): SettingsGradleFileIR = copy(irs = irs)
override fun GradlePrinter.renderGradle() {
+"rootProject.name = "; +projectName.quotified
nl(lineBreaks = 2)
if (subProjects.isNotEmpty()) {
nl()
subProjects.list(separator = { nl() }) { subProject ->
+"include("; +subProject.quotified; +")"
}
nl(lineBreaks = 2)
}
val repositories = irsOfType<RepositoryIR>()
if (repositories.isNotEmpty()) {
sectionCall("pluginManagement", needIndent = true) {
sectionCall("repositories") {
repositories.listNl()
}
}
}
}
}
@@ -0,0 +1,32 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
interface MavenIR : BuildSystemIR {
fun MavenPrinter.renderMaven()
override fun BuildFilePrinter.render() {
if (this is MavenPrinter) renderMaven()
}
}
data class PluginRepositoryMavenIR(
val repository: Repository
): MavenIR {
override fun MavenPrinter.renderMaven() {
node("pluginRepository") {
singleLineNode("id") { +repository.idForMaven }
singleLineNode("url") { +repository.url }
}
}
}
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.AndroidConfigIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptDependencyIR
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugi
import org.jetbrains.kotlin.tools.projectWizard.settings.JavaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
@@ -34,6 +36,14 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(
shouldExists()
}
private fun createRepositories(configurationData: ModuleConfigurationData) =buildList<Repository> {
+DefaultRepository.GRADLE_PLUGIN_PORTAL
+DefaultRepository.GOOGLE
+DefaultRepository.JCENTER
addIfNotNull(configurationData.kotlinVersion.kotlinVersionKind.repository)
}
override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module) =
buildList<BuildSystemIR> {
+GradleOnlyPluginByNameIR("com.android.application")
@@ -45,19 +55,11 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(
)
+GradleOnlyPluginByNameIR("kotlin-android-extensions")
+AndroidConfigIR(configurationData.pomIr.artifactId)
+listOf(
DefaultRepository.GRADLE_PLUGIN_PORTAL,
DefaultRepository.GOOGLE,
DefaultRepository.JCENTER
).map(::RepositoryIR)
+createRepositories(configurationData).map(::RepositoryIR)
}
override fun createRootBuildFileIrs(configurationData: ModuleConfigurationData) = buildList<BuildSystemIR> {
+listOf(
DefaultRepository.GRADLE_PLUGIN_PORTAL,
DefaultRepository.GOOGLE,
DefaultRepository.JCENTER
).map { BuildScriptRepositoryIR(RepositoryIR(it)) }
+createRepositories(configurationData).map { BuildScriptRepositoryIR(RepositoryIR(it)) }
+listOf(
RawGradleIR { call("classpath") { +"com.android.tools.build:gradle:3.2.1".quotified } },
RawGradleIR {
@@ -113,7 +115,7 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(
)
}
override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? =
override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? =
StdlibType.StdlibJdk7
override val settings: List<ModuleConfiguratorSetting<*, *>> =
@@ -44,7 +44,7 @@ abstract class ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings() {
dependencyName,
isInMppModule = module.kind
.let { it == ModuleKind.multiplatform || it == ModuleKind.target },
version = KotlinPlugin::version.settingValue,
version = KotlinPlugin::version.propertyValue,
dependencyType = DependencyType.TEST
)
}
@@ -16,7 +16,9 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.printBuildFile
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles
import java.nio.file.Path
abstract class BuildSystemPlugin(context: Context) : Plugin(context) {
val type by enumSetting<BuildSystemType>("Build System", GenerationPhase.FIRST_STEP) {
@@ -36,7 +38,9 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) {
val buildSystemData by property<List<BuildSystemData>>(emptyList())
val buildFiles by property<List<BuildFileIR>>(emptyList())
val buildFiles by listProperty<BuildFileIR>()
val pluginRepositoreis by listProperty<Repository>()
val takeRepositoriesFromDependencies by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runBefore(BuildSystemPlugin::createModules)
@@ -139,6 +143,6 @@ val TaskRunningContext.allModulesPaths
}
val TaskRunningContext.buildSystemType: BuildSystemType
val ValuesReadingContext.buildSystemType: BuildSystemType
get() = BuildSystemPlugin::type.reference.settingValue
@@ -6,20 +6,24 @@ import org.jetbrains.kotlin.tools.projectWizard.core.checker
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RootFileModuleStructureIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.ModulesDependencyMavenIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.PluginRepositoryMavenIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles
class MavenPlugin(context: Context) : BuildSystemPlugin(context) {
override val title: String = "Maven"
private val isMaven = checker {
rule(BuildSystemPlugin::type.reference shouldBeEqual BuildSystemType.Maven)
}
val createSettingsFileTask by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runAfter(KotlinPlugin::createModules)
runBefore(BuildSystemPlugin::createModules)
activityChecker = checker {
rule(BuildSystemPlugin::type.reference shouldBeEqual BuildSystemType.Maven)
}
activityChecker = isMaven
withAction {
BuildSystemPlugin::buildFiles.update { buildFiles ->
if (buildFiles.size == 1) return@update buildFiles.asSuccess()
@@ -38,6 +42,19 @@ class MavenPlugin(context: Context) : BuildSystemPlugin(context) {
}
}
val addBuildSystemPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runAfter(KotlinPlugin::createPluginRepositories)
runBefore(BuildSystemPlugin::createModules)
activityChecker = isMaven
withAction {
val repositories = BuildSystemPlugin::pluginRepositoreis.propertyValue
updateBuildFiles { buildFile ->
buildFile.withIrs(repositories.map(::PluginRepositoryMavenIR)).asSuccess()
}
}
}
val addBuildSystemData by addBuildSystemData(
BuildSystemData(
type = BuildSystemType.Maven,
@@ -2,14 +2,22 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.SettingsGradleFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.allModulesPaths
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.printBuildFile
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
@@ -103,33 +111,28 @@ abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) {
}
}
val createSettingsFileTask by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runBefore(TemplatesPlugin::addTemplatesToModules)
runAfter(KotlinPlugin::createPluginRepositories)
activityChecker = isGradle
withAction {
val templateDescriptor = when (buildSystemType) {
BuildSystemType.GradleKotlinDsl -> FileTemplateDescriptor(
"gradle/settings.gradle.kts.vm",
"settings.gradle.kts".asPath()
)
BuildSystemType.GradleGroovyDsl -> FileTemplateDescriptor(
"gradle/settings.gradle.vm",
"settings.gradle".asPath()
)
else -> return@withAction UNIT_SUCCESS
val (createBuildFile, buildFileName) = settingsGradleBuildFileData ?: return@withAction UNIT_SUCCESS
val repositories = buildList<RepositoryIR> {
+BuildSystemPlugin::pluginRepositoreis.propertyValue.map(::RepositoryIR)
if (isNotEmpty()) {
+RepositoryIR(DefaultRepository.MAVEN_CENTRAL)
}
}
TemplatesPlugin::addFileTemplate.execute(
FileTemplate(
templateDescriptor,
StructurePlugin::projectPath.settingValue,
mapOf(
"projectName" to StructurePlugin::name.settingValue,
"subProjects" to allModulesPaths
.map { path ->
path.joinToString(separator = "") { ":$it" }
}
)
)
val settingsGradleIR = SettingsGradleFileIR(
StructurePlugin::name.settingValue,
allModulesPaths.map { path -> path.joinToString(separator = "") { ":$it" } },
repositories
)
val buildFileText = createBuildFile().printBuildFile { settingsGradleIR.render(this) }
service<FileSystemWizardService>()!!.createFile(
projectPath / buildFileName,
buildFileText
)
}
}
@@ -139,3 +142,18 @@ abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) {
private val defaultVersions = listOf("5.5.1").map(Version.Companion::fromString)
}
}
val ValuesReadingContext.settingsGradleBuildFileData
get() = when (buildSystemType) {
BuildSystemType.GradleKotlinDsl ->
BuildFileData(
{ GradlePrinter(GradlePrinter.GradleDsl.KOTLIN) },
"settings.gradle.kts"
)
BuildSystemType.GradleGroovyDsl ->
BuildFileData(
{ GradlePrinter(GradlePrinter.GradleDsl.GROOVY) },
"settings.gradle"
)
else -> null
}
@@ -3,10 +3,14 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderServiceImpl
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.buildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.pomIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
@@ -16,8 +20,15 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.nio.file.Path
class KotlinPlugin(context: Context) : Plugin(context) {
val version by versionSetting("Kotlin Version", GenerationPhase.FIRST_STEP) {
defaultValue = DEFAULT_VERSION
val version by property(KotlinVersionProviderServiceImpl.DEFAULT)
val initKotlinVersions by pipelineTask(GenerationPhase.PREPARE) {
title = "Downloading list of Kotlin versions"
withAction {
val version = service<KotlinVersionProviderService>()!!.getKotlinVersion()
KotlinPlugin::version.update { version.asSuccess() }
}
}
val projectKind by enumSetting<ProjectKind>("Project Kind", GenerationPhase.FIRST_STEP)
@@ -59,6 +70,17 @@ class KotlinPlugin(context: Context) : Plugin(context) {
}
}
val createPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runBefore(BuildSystemPlugin::createModules)
withAction {
val pluginRepository = KotlinPlugin::version.propertyValue.kotlinVersionKind.repository ?: return@withAction UNIT_SUCCESS
BuildSystemPlugin::pluginRepositoreis.addValues(pluginRepository) andThen
updateBuildFiles { buildFile ->
buildFile.withIrs(RepositoryIR(pluginRepository)).asSuccess()
}
}
}
val createSourcesetDirectories by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runAfter(KotlinPlugin::createModules)
withAction {
@@ -83,7 +105,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
modules,
projectPath,
StructurePlugin::name.settingValue,
KotlinPlugin::version.settingValue,
KotlinPlugin::version.propertyValue,
buildSystemType,
pomIR(),
this
@@ -8,8 +8,8 @@ abstract class BuildFilePrinter {
private val builder = StringBuilder()
protected var currentIndent = 0
fun nl() {
+"\n"
fun nl(lineBreaks: Int = 1) {
+"\n".repeat(lineBreaks)
}
fun nlIndented() {
@@ -39,4 +39,6 @@ data class BintrayRepository(val repository: String) : CustomMavenRepository {
object Repositories {
val KTOR_BINTRAY = BintrayRepository("kotlin/ktor")
val KOTLIN_EAP_BINTRAY = BintrayRepository("kotlin/kotlin-eap")
val KOTLIN_DEV_BINTRAY = BintrayRepository("kotlin/kotlin-dev")
}
@@ -1,20 +1,36 @@
package org.jetbrains.kotlin.tools.projectWizard.settings.version
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.version.maven.ArtifactVersion
import org.jetbrains.kotlin.tools.projectWizard.settings.version.maven.DefaultArtifactVersion
class Version private constructor(internal val mavenVersion: ArtifactVersion) : Comparable<Version> {
class Version private constructor(internal val mavenVersion: ArtifactVersion) : Comparable<Version>, DisplayableSettingItem {
override fun compareTo(other: Version): Int = mavenVersion.compareTo(other.mavenVersion)
override fun equals(other: Any?): Boolean = mavenVersion == other.safeAs<Version>()?.mavenVersion
override fun hashCode(): Int = mavenVersion.hashCode()
override fun toString(): String = mavenVersion.toString()
val major
get() = mavenVersion.majorVersion
val minor
get() = mavenVersion.minorVersion
val incremental
get() = mavenVersion.incrementalVersion
override val text: String
get() = toString()
override val greyText: String?
get() = null
companion object {
fun fromString(string: String) = Version(
DefaultArtifactVersion(string)
)
fun fromComponents(major: Int, minor: Int, incremental: Int) =
fromString("$major.$minor.$incremental")
val parser: Parser<Version> = valueParser { value, path ->
val (stringVersion) = value.parseAs<String>(path)
safe { fromString(stringVersion) }.mapFailure {