From f1741a4d1b9c90af8d2871fb18f3741b9c7e5039 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 10 Mar 2020 15:23:23 +0300 Subject: [PATCH] Wizard: do not require to default settings to be present in yaml --- .../tools/projectWizard/core/Context.kt | 2 ++ .../core/entity/settings/SettingReference.kt | 1 + .../core/entity/settings/settingUtils.kt | 25 +++++++++++++++++++ .../moduleConfigurators/ModuleConfigurator.kt | 13 ++++++---- .../tools/projectWizard/templates/Template.kt | 15 ++++++----- 5 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/settingUtils.kt diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt index bd3fe85f0da..a9a2353bfa3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt @@ -191,6 +191,8 @@ class Context private constructor( val > SettingReference.setting: Setting get() = with(this) { getSetting() } + + inline operator fun invoke(reader: ReadingContext.() -> T): T = reader() } open inner class WritingContext : ReadingContext() { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt index 5520e70767a..28c3cb1c7a6 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt @@ -114,3 +114,4 @@ inline val > PluginSettingPropertyReference< get() = PluginSettingReference(this, T::class) typealias PluginSettingPropertyReference = KProperty1> + diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/settingUtils.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/settingUtils.kt new file mode 100644 index 00000000000..fe135b98997 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/settingUtils.kt @@ -0,0 +1,25 @@ +/* + * 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.entity.settings + +import org.jetbrains.kotlin.tools.projectWizard.core.* + +fun ParsingContext.parseSettingsMap( + path: String, + values: Map, + settingReferences: List, Setting<*, *>>> +): TaskResult, Any>>> = settingReferences.mapComputeM { (settingReference, setting) -> + val settingValue = values[setting.path] + when { + settingValue != null -> { + setting.type.parse(this, settingValue, setting.path).map { listOf(settingReference to it) } + } + setting.isRequired -> { + fail(ParseError("No value was found for a key `$path.${setting.path}`")) + } + else -> success(emptyList()) + } +}.sequence().map { it.flatten() } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt index c304680824e..2f99cf19cc3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt @@ -261,11 +261,14 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { } or mapParser { map, path -> val (id) = map.parseValue(path, "name") val (configurator) = BY_ID[id].toResult { ConfiguratorNotFoundError(id) } - val (settingsWithValues) = configurator.settings.mapComputeM { setting -> - val (settingValue) = map[setting.path].toResult { ParseError("No value was found for a key `$path.${setting.path}`") } - val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference } - setting.type.parse(this, settingValue, setting.path).map { reference to it } - }.sequence() + val (settingsWithValues) = parseSettingsMap( + path, + map, + configurator.settings.map { setting -> + val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference } + reference to setting + } + ) updateState { it.withSettings(settingsWithValues) } configurator } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt index 01821f15eb8..3cb924d54f9 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt @@ -233,14 +233,17 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor { enumSettingImpl(title, neededAtPhase, init) as ReadOnlyProperty>> companion object { - fun parser(sourcesetIdentificator: Identificator): Parser