From b9226ce54f02e9ece7f4d3b2b16b7ee425ceb364 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sun, 19 Jan 2020 11:32:13 +0300 Subject: [PATCH] Wizard: automatically determine Kotlin version based on Kotlin plugin version For snapshot plugin just take the latest eap or stable version --- .../ConfigureDialogWithModulesAndVersion.java | 2 +- .../IdeaKotlinVersionProviderService.kt | 65 +++++++++++++++++ .../wizard/service/IdeaWizardService.kt | 3 +- .../projectWizard/wizard/ui/Component.kt | 4 ++ .../wizard/ui/components/DropDownComponent.kt | 11 ++- .../wizard/ui/components/UIComponent.kt | 8 +-- .../BuildSystemTypeSettingComponent.kt | 2 +- .../ui/firstStep/FirstWizardStepComponent.kt | 2 - .../ui/setting/DefaultSettingComponent.kt | 2 +- .../wizard/ui/setting/SettingComponent.kt | 2 +- .../UIComponentDelegatingSettingComponent.kt | 4 +- .../templates/gradle/settings.gradle.kts.vm | 5 -- .../templates/gradle/settings.gradle.vm | 5 -- .../service/KotlinVersionProviderService.kt | 38 ++++++++++ .../core/service/WizardService.kt | 3 +- .../kotlin/tools/projectWizard/core/utils.kt | 2 + .../ir/buildsystem/BuildFileIR.kt | 21 +++++- .../gradle/SettingsGradleFileIR.kt | 38 ++++++++++ .../ir/buildsystem/maven/MavenIR.kt | 32 +++++++++ ...AndroidSinglePlatformModuleConfigurator.kt | 24 ++++--- .../ModuleConfiguratorWithTests.kt | 2 +- .../plugins/buildSystem/BuildSystemPlugin.kt | 8 ++- .../plugins/buildSystem/MavenPlugin.kt | 23 +++++- .../buildSystem/gradle/GradlePlugin.kt | 72 ++++++++++++------- .../plugins/kotlin/KotlinPlugin.kt | 28 +++++++- .../plugins/printer/BuildFilePrinter.kt | 4 +- .../settings/buildsystem/Repository.kt | 2 + .../projectWizard/settings/version/Version.kt | 18 ++++- 28 files changed, 351 insertions(+), 79 deletions(-) create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaKotlinVersionProviderService.kt delete mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.kts.vm delete mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.vm create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/SettingsGradleFileIR.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java index 4d599d717e9..95e9c3b2767 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/framework/ui/ConfigureDialogWithModulesAndVersion.java @@ -172,7 +172,7 @@ public class ConfigureDialogWithModulesAndVersion extends DialogWrapper { } @NotNull - protected static Collection loadVersions(String minimumVersion) throws Exception { + public static Collection loadVersions(String minimumVersion) throws Exception { List versions = Lists.newArrayList(); String bundledRuntimeVersion = KotlinRuntimeLibraryUtilKt.bundledRuntimeVersion(); diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaKotlinVersionProviderService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaKotlinVersionProviderService.kt new file mode 100644 index 00000000000..215301607cd --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaKotlinVersionProviderService.kt @@ -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 = safe { + BufferedReader(InputStreamReader(URL(url).openStream())).lines().collect(Collectors.joining("\n")) + } + + @Suppress("SameParameterValue") + private fun downloadVersions(url: String): List = 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() +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt index 283161d3187..b2dae576c5f 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt @@ -15,7 +15,8 @@ interface IdeaWizardService : WizardService object IdeaServices { val PROJECT_INDEPENDENT: List = listOf( IdeaFileSystemWizardService(), - IdeaBuildSystemAvailabilityWizardService() + IdeaBuildSystemAvailabilityWizardService(), + IdeaKotlinVersionProviderService() ) fun createScopeDependent(project: Project, model: ModifiableModuleModel) = listOf( diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt index 1ad77c918ac..8e69e3e612f 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt @@ -42,5 +42,9 @@ abstract class DynamicComponent(private val valuesReadingContext: ValuesReadingC if (isInitialized) onValueUpdated(reference) } } + + protected fun read(reader: ValuesReadingContext.() -> T): T = + reader(valuesReadingContext) + open fun onValueUpdated(reference: SettingReference<*, *>?) {} } \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt index 6e73b8999c6..96f760ad5ad 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/DropDownComponent.kt @@ -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( private val valuesReadingContext: ValuesReadingContext, initialValues: List = emptyList(), labelText: String? = null, - filter: (T) -> Boolean = { true }, + private val filter: (T) -> Boolean = { true }, private val validator: SettingValidator = settingValidator { ValidationResult.OK }, private val iconProvider: (T) -> Icon? = { null }, onValueUpdate: (T) -> Unit = {} @@ -65,11 +67,16 @@ class DropDownComponent( } } + fun setValues(newValues: List) { + @Suppress("UNCHECKED_CAST") + uiComponent.model = DefaultComboBoxModel(newValues.filter(filter).toTypedArray() as Array) + } + 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 } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt index 485adae97b3..2f82f3116da 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/components/UIComponent.kt @@ -28,7 +28,7 @@ abstract class UIComponent( 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( 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( } } -fun UIComponent.valueForSetting(setting: Setting>): V = - setting.defaultValue ?: getUiValue() \ No newline at end of file +fun UIComponent.valueForSetting(setting: Setting>): V? = + setting.defaultValue ?: getUiValue() \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt index ee3e90ae75c..2dfabd485e6 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt @@ -20,7 +20,7 @@ import java.awt.BorderLayout class BuildSystemTypeSettingComponent( - private val valuesReadingContext: ValuesReadingContext + valuesReadingContext: ValuesReadingContext ) : UIComponentDelegatingSettingComponent>( BuildSystemPlugin::type.reference, valuesReadingContext diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt index 712287cef28..bad830c658c 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt @@ -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) } } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt index 0588ff2fa77..4d59a4e2d71 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/DefaultSettingComponent.kt @@ -91,7 +91,7 @@ class VersionSettingComponent( class DropdownSettingComponent( reference: SettingReference>, - private val valuesReadingContext: ValuesReadingContext + valuesReadingContext: ValuesReadingContext ) : UIComponentDelegatingSettingComponent>( reference, valuesReadingContext diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/SettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/SettingComponent.kt index 09076ed88bf..28eb7b0f0ea 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/SettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/SettingComponent.kt @@ -7,7 +7,7 @@ import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent abstract class SettingComponent>( val reference: SettingReference, - private val valuesReadingContext: ValuesReadingContext + val valuesReadingContext: ValuesReadingContext ) : DynamicComponent(valuesReadingContext), Displayable { var value: V? get() = reference.value diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt index 45f82cd42ec..0e77dfe8d36 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/setting/UIComponentDelegatingSettingComponent.kt @@ -24,9 +24,7 @@ abstract class UIComponentDelegatingSettingComponent 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) } diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.kts.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.kts.vm deleted file mode 100644 index b9c6e94536d..00000000000 --- a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.kts.vm +++ /dev/null @@ -1,5 +0,0 @@ -rootProject.name = "${projectName}" - -#foreach($subProject in $subProjects) -include("${subProject}") -#end \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.vm deleted file mode 100644 index 8149c48ce31..00000000000 --- a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/gradle/settings.gradle.vm +++ /dev/null @@ -1,5 +0,0 @@ -rootProject.name = '${projectName}'; - -#foreach($subProject in $subProjects) -include('${subProject}') -#end \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt new file mode 100644 index 00000000000..72da6083a23 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/KotlinVersionProviderService.kt @@ -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) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt index 1ba6e96ed6b..5c9752aacfe 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt @@ -9,7 +9,8 @@ object Services { ProjectImportingWizardServiceImpl(), OsFileSystemWizardService(), BuildSystemAvailabilityWizardServiceImpl(), - DummyFileFormattingService() + DummyFileFormattingService(), + KotlinVersionProviderServiceImpl() ) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt index f47994e4c6d..cc288d7d0c5 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/utils.kt @@ -86,6 +86,8 @@ class ListBuilder { irs += this } + fun isNotEmpty(): Boolean = irs.isNotEmpty() + fun build() = irs.toList() } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt index be395081d73..e662c48d9a6 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt @@ -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, IrsOwner { +) : FileIR { override fun withReplacedIrs(irs: List): BuildFileIR = copy(irs = irs) @Suppress("UNCHECKED_CAST") @@ -27,7 +30,14 @@ data class BuildFileIR( private fun distinctRepositories(): List = irsOfType() - .distinctBy { it.repository } + .distinctBy(RepositoryIR::repository) + .sortedBy { repositoryIR -> + if (repositoryIR.repository is DefaultRepository) 0 else 1 + } + + private fun distinctPluginRepositories(): List = + irsOfType() + .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().takeIf { it.isNotEmpty() } if (plugins != null) { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/SettingsGradleFileIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/SettingsGradleFileIR.kt new file mode 100644 index 00000000000..b04e5e3244f --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/SettingsGradleFileIR.kt @@ -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, + override val irs: List +) : FileIR, GradleIR { + override fun withReplacedIrs(irs: List): 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() + if (repositories.isNotEmpty()) { + sectionCall("pluginManagement", needIndent = true) { + sectionCall("repositories") { + repositories.listNl() + } + } + } + + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt new file mode 100644 index 00000000000..d10492864ef --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt @@ -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 } + } + } +} + + diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt index 49e96974efe..8948a413a50 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt @@ -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 { + +DefaultRepository.GRADLE_PLUGIN_PORTAL + +DefaultRepository.GOOGLE + +DefaultRepository.JCENTER + addIfNotNull(configurationData.kotlinVersion.kotlinVersionKind.repository) + } + + override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module) = buildList { +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 { - +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> = diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt index cb5c5692be3..1ebf3e2a426 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt @@ -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 ) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt index 222052b84dd..6dee07da0ad 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt @@ -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("Build System", GenerationPhase.FIRST_STEP) { @@ -36,7 +38,9 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { val buildSystemData by property>(emptyList()) - val buildFiles by property>(emptyList()) + val buildFiles by listProperty() + + val pluginRepositoreis by listProperty() 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 diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt index 2549aed07b2..3d8e0a61fff 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt @@ -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, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt index a100b768b53..c33aed78f4a 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt @@ -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 { + +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()!!.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 + } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt index 39e7aa40c53..8651c11ad3b 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt @@ -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()!!.getKotlinVersion() + KotlinPlugin::version.update { version.asSuccess() } + } } val projectKind by enumSetting("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 diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/printer/BuildFilePrinter.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/printer/BuildFilePrinter.kt index 34b9f0f17cc..50ba21060ee 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/printer/BuildFilePrinter.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/printer/BuildFilePrinter.kt @@ -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() { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt index adbc63afe07..f32051b09ae 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt @@ -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") } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt index 3166cba8263..36efb80697f 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt @@ -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 { +class Version private constructor(internal val mavenVersion: ArtifactVersion) : Comparable, DisplayableSettingItem { override fun compareTo(other: Version): Int = mavenVersion.compareTo(other.mavenVersion) override fun equals(other: Any?): Boolean = mavenVersion == other.safeAs()?.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 = valueParser { value, path -> val (stringVersion) = value.parseAs(path) safe { fromString(stringVersion) }.mapFailure {