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
@@ -172,7 +172,7 @@ public class ConfigureDialogWithModulesAndVersion extends DialogWrapper {
}
@NotNull
protected static Collection<String> loadVersions(String minimumVersion) throws Exception {
public static Collection<String> loadVersions(String minimumVersion) throws Exception {
List<String> versions = Lists.newArrayList();
String bundledRuntimeVersion = KotlinRuntimeLibraryUtilKt.bundledRuntimeVersion();
@@ -0,0 +1,65 @@
/*
* 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.wizard.service
import org.jetbrains.kotlin.idea.KotlinPluginUtil
import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.asNullable
import org.jetbrains.kotlin.tools.projectWizard.core.compute
import org.jetbrains.kotlin.tools.projectWizard.core.safe
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderServiceImpl
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.io.BufferedReader
import java.io.InputStreamReader
import java.net.URL
import java.util.stream.Collectors
class IdeaKotlinVersionProviderService : KotlinVersionProviderService, IdeaWizardService {
override fun getKotlinVersion(): Version {
if (KotlinPluginUtil.isSnapshotVersion()) {
return VersionsDownloader.getLatestEapOrStableKotlinVersion() ?: KotlinVersionProviderServiceImpl.DEFAULT
}
return KotlinPluginUtil.getPluginVersion().let { Version.fromString(it) }
}
}
private object VersionsDownloader {
fun getLatestEapOrStableKotlinVersion(): Version? {
val latestEap = EapVersionDownloader.getLatestEapVersion()
val latestStable = getLatestStableVersion()
if (latestEap == null) return latestStable
if (latestStable == null) return latestEap
return if (latestEap > latestStable) latestEap else latestStable
}
private fun getLatestStableVersion() = safe {
ConfigureDialogWithModulesAndVersion.loadVersions("1.0.0")
}.asNullable?.firstOrNull()?.let { Version.fromString(it) }
}
private object EapVersionDownloader {
fun getLatestEapVersion() = downloadVersions(EAP_URL).firstOrNull()
private fun downloadPage(url: String): TaskResult<String> = safe {
BufferedReader(InputStreamReader(URL(url).openStream())).lines().collect(Collectors.joining("\n"))
}
@Suppress("SameParameterValue")
private fun downloadVersions(url: String): List<Version> = compute {
val (text) = downloadPage(url)
versionRegexp.findAll(text)
.map { it.groupValues[1].removeSuffix("/") }
.filter { it.isNotEmpty() && it[0].isDigit() }
.map { Version.fromString(it) }
.toList()
.asReversed()
}.asNullable.orEmpty()
private val EAP_URL = "https://dl.bintray.com/kotlin/kotlin-eap/org/jetbrains/kotlin/jvm/org.jetbrains.kotlin.jvm.gradle.plugin/"
private val versionRegexp = """href="([^"\\]+)"""".toRegex()
}
@@ -15,7 +15,8 @@ interface IdeaWizardService : WizardService
object IdeaServices {
val PROJECT_INDEPENDENT: List<IdeaWizardService> = listOf(
IdeaFileSystemWizardService(),
IdeaBuildSystemAvailabilityWizardService()
IdeaBuildSystemAvailabilityWizardService(),
IdeaKotlinVersionProviderService()
)
fun createScopeDependent(project: Project, model: ModifiableModuleModel) = listOf(
@@ -42,5 +42,9 @@ abstract class DynamicComponent(private val valuesReadingContext: ValuesReadingC
if (isInitialized) onValueUpdated(reference)
}
}
protected fun <T> read(reader: ValuesReadingContext.() -> T): T =
reader(valuesReadingContext)
open fun onValueUpdated(reference: SettingReference<*, *>?) {}
}
@@ -10,14 +10,16 @@ import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.awt.event.ItemEvent
import javax.swing.DefaultComboBoxModel
import javax.swing.Icon
import javax.swing.JComboBox
import javax.swing.JList
class DropDownComponent<T : DisplayableSettingItem>(
private val valuesReadingContext: ValuesReadingContext,
initialValues: List<T> = emptyList(),
labelText: String? = null,
filter: (T) -> Boolean = { true },
private val filter: (T) -> Boolean = { true },
private val validator: SettingValidator<T> = settingValidator { ValidationResult.OK },
private val iconProvider: (T) -> Icon? = { null },
onValueUpdate: (T) -> Unit = {}
@@ -65,11 +67,16 @@ class DropDownComponent<T : DisplayableSettingItem>(
}
}
fun setValues(newValues: List<T>) {
@Suppress("UNCHECKED_CAST")
uiComponent.model = DefaultComboBoxModel(newValues.filter(filter).toTypedArray<DisplayableSettingItem>() as Array<T>)
}
override fun updateUiValue(newValue: T) = safeUpdateUi {
uiComponent.selectedItem = newValue
}
@Suppress("UNCHECKED_CAST")
override fun getUiValue(): T = uiComponent.selectedItem as T
override fun getUiValue(): T? = uiComponent.selectedItem as? T
}
@@ -28,7 +28,7 @@ abstract class UIComponent<V : Any>(
protected abstract val uiComponent: JComponent
abstract fun updateUiValue(newValue: V)
abstract fun getUiValue(): V
abstract fun getUiValue(): V?
private var allowEventFiring = true
@@ -41,7 +41,7 @@ abstract class UIComponent<V : Any>(
override fun onInit() {
super.onInit()
validate(getUiValue())
getUiValue()?.let(::validate)
}
final override val component: JComponent by lazy(LazyThreadSafetyMode.NONE) {
@@ -65,5 +65,5 @@ abstract class UIComponent<V : Any>(
}
}
fun <V: Any> UIComponent<V>.valueForSetting(setting: Setting<V, SettingType<V>>): V =
setting.defaultValue ?: getUiValue()
fun <V : Any> UIComponent<V>.valueForSetting(setting: Setting<V, SettingType<V>>): V? =
setting.defaultValue ?: getUiValue()
@@ -20,7 +20,7 @@ import java.awt.BorderLayout
class BuildSystemTypeSettingComponent(
private val valuesReadingContext: ValuesReadingContext
valuesReadingContext: ValuesReadingContext
) : UIComponentDelegatingSettingComponent<BuildSystemType, DropDownSettingType<BuildSystemType>>(
BuildSystemPlugin::type.reference,
valuesReadingContext
@@ -1,6 +1,5 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext
import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference
@@ -28,7 +27,6 @@ class BuildSystemSubStep(valuesReadingContext: ValuesReadingContext) :
private val buildSystemSetting = BuildSystemTypeSettingComponent(valuesReadingContext).asSubComponent()
override fun buildContent(): JComponent = panel {
bordered(needBottomEmptyBorder = false)
add(buildSystemSetting.component, BorderLayout.CENTER)
}
}
@@ -91,7 +91,7 @@ class VersionSettingComponent(
class DropdownSettingComponent(
reference: SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>,
private val valuesReadingContext: ValuesReadingContext
valuesReadingContext: ValuesReadingContext
) : UIComponentDelegatingSettingComponent<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>(
reference,
valuesReadingContext
@@ -7,7 +7,7 @@ import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
abstract class SettingComponent<V : Any, T: SettingType<V>>(
val reference: SettingReference<V, T>,
private val valuesReadingContext: ValuesReadingContext
val valuesReadingContext: ValuesReadingContext
) : DynamicComponent(valuesReadingContext), Displayable {
var value: V?
get() = reference.value
@@ -24,9 +24,7 @@ abstract class UIComponentDelegatingSettingComponent<V : Any, T : SettingType<V>
override fun onInit() {
super.onInit()
if (value == null) {
if (value == null) {
value = uiComponent.valueForSetting(setting)
}
uiComponent.valueForSetting(setting)?.let { value = it }
}
value?.let(uiComponent::updateUiValue)
}
@@ -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 {