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:
+1
-1
@@ -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();
|
||||
|
||||
+65
@@ -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()
|
||||
}
|
||||
+2
-1
@@ -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(
|
||||
|
||||
+4
@@ -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<*, *>?) {}
|
||||
}
|
||||
+9
-2
@@ -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
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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()
|
||||
+1
-1
@@ -20,7 +20,7 @@ import java.awt.BorderLayout
|
||||
|
||||
|
||||
class BuildSystemTypeSettingComponent(
|
||||
private val valuesReadingContext: ValuesReadingContext
|
||||
valuesReadingContext: ValuesReadingContext
|
||||
) : UIComponentDelegatingSettingComponent<BuildSystemType, DropDownSettingType<BuildSystemType>>(
|
||||
BuildSystemPlugin::type.reference,
|
||||
valuesReadingContext
|
||||
|
||||
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-3
@@ -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)
|
||||
}
|
||||
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
rootProject.name = "${projectName}"
|
||||
|
||||
#foreach($subProject in $subProjects)
|
||||
include("${subProject}")
|
||||
#end
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
rootProject.name = '${projectName}';
|
||||
|
||||
#foreach($subProject in $subProjects)
|
||||
include('${subProject}')
|
||||
#end
|
||||
+38
@@ -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)
|
||||
}
|
||||
+2
-1
@@ -9,7 +9,8 @@ object Services {
|
||||
ProjectImportingWizardServiceImpl(),
|
||||
OsFileSystemWizardService(),
|
||||
BuildSystemAvailabilityWizardServiceImpl(),
|
||||
DummyFileFormattingService()
|
||||
DummyFileFormattingService(),
|
||||
KotlinVersionProviderServiceImpl()
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
@@ -86,6 +86,8 @@ class ListBuilder<T> {
|
||||
irs += this
|
||||
}
|
||||
|
||||
fun isNotEmpty(): Boolean = irs.isNotEmpty()
|
||||
|
||||
fun build() = irs.toList()
|
||||
}
|
||||
|
||||
|
||||
+19
-2
@@ -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) {
|
||||
|
||||
+38
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+32
@@ -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 }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+13
-11
@@ -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<*, *>> =
|
||||
|
||||
+1
-1
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
+6
-2
@@ -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
|
||||
|
||||
|
||||
+20
-3
@@ -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,
|
||||
|
||||
+45
-27
@@ -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
|
||||
}
|
||||
+25
-3
@@ -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
|
||||
|
||||
+2
-2
@@ -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() {
|
||||
|
||||
+2
@@ -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")
|
||||
}
|
||||
|
||||
+17
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user