From 9e47d0b33ccc08ee53dc8b7d3c009881c5c9d6fc Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 20 Feb 2020 16:33:13 +0300 Subject: [PATCH] Wizard: move Android SDK Setting to AndroidPlugin --- .../ui/secondStep/ModuleSettingsComponent.kt | 4 +- .../core/ValuesReadingContext.kt | 5 +++ .../projectWizard/core/entity/Setting.kt | 7 +++- .../kotlin/tools/projectWizard/core/utils.kt | 1 + ...AndroidSinglePlatformModuleConfigurator.kt | 25 +++++-------- .../moduleConfigurators/ModuleConfigurator.kt | 24 +++++++++--- .../ModuleConfiguratorWithTests.kt | 2 +- .../moduleConfigurators/configurators.kt | 4 +- .../projectWizard/plugins/AndroidPlugin.kt | 37 +++++++++++++++++++ .../tools/projectWizard/plugins/Plugins.kt | 1 + .../settings/buildsystem/Module.kt | 8 +++- 11 files changed, 87 insertions(+), 31 deletions(-) create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt index dbab011fbee..cd56f38c261 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt @@ -5,7 +5,7 @@ import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult -import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.configuratorSettings +import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.getConfiguratorSettings import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module @@ -71,7 +71,7 @@ class ModuleSettingsComponent( nameField.component.isVisible = module.kind != ModuleKind.target || module.configurator.moduleType != ModuleType.common - moduleConfiguratorSettingsList.setSettings(module.configuratorSettings) + moduleConfiguratorSettingsList.setSettings(module.getConfiguratorSettings()) templateComponent.module = module } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt index 422b9ce49fc..aa0feea887b 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/ValuesReadingContext.kt @@ -36,4 +36,9 @@ open class ValuesReadingContext( fun > SettingReference.notRequiredSettingValue(): V? = context.settingContext[this] + + val > PluginSettingReference.pluginSetting: Setting + get() = context.settingContext.getPluginSetting(this) + + } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt index a3ee9346643..729cb1d2b8b 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Setting.kt @@ -24,9 +24,9 @@ sealed class SettingReference> { final override fun hashCode() = path.hashCode() } -data class PluginSettingReference>( +data class PluginSettingReference>( override val path: String, - override val type: KClass + override val type: KClass<@UnsafeVariance T> ) : SettingReference() { constructor(kProperty: KProperty1>, type: KClass) : @@ -40,6 +40,9 @@ data class PluginSettingReference>( settingContext.getPluginSetting(this@PluginSettingReference) } +inline val > PluginSetting.reference: PluginSettingReference + get() = PluginSettingReference(path, T::class) + sealed class ModuleConfiguratorSettingReference> : SettingReference() { abstract val descriptor: ModuleConfigurator abstract val moduleId: Identificator 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 cc288d7d0c5..ee7536abe9f 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 @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core import java.io.IOException import java.nio.file.Path import java.nio.file.Paths +import java.util.* import kotlin.properties.ReadOnlyProperty import kotlin.random.Random import kotlin.reflect.KProperty 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 15c71fd24c4..da8f888a3c2 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 @@ -1,7 +1,9 @@ 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.entity.PluginSettingReference +import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingType +import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference 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 @@ -9,7 +11,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScrip import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptRepositoryIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact -import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.plugins.AndroidPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.GradlePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType @@ -27,18 +29,14 @@ import java.nio.file.Path object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(), SinglePlatformModuleConfigurator, AndroidModuleConfigurator, - ModuleConfiguratorWithModuleType{ + ModuleConfiguratorWithModuleType { override val moduleType = ModuleType.jvm override val id = "android" override val suggestedModuleName = "android" override val text = "Android" override val greyText = "Requires Android SDK" - val androidSdkPath by pathSetting("Android SDK Path", neededAtPhase = GenerationPhase.PROJECT_GENERATION) { - shouldExists() - } - - private fun createRepositories(configurationData: ModuleConfigurationData) =buildList { + private fun createRepositories(configurationData: ModuleConfigurationData) = buildList { +DefaultRepository.GRADLE_PLUGIN_PORTAL +DefaultRepository.GOOGLE +DefaultRepository.JCENTER @@ -79,12 +77,7 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings( configurationData: ModuleConfigurationData, module: Module, modulePath: Path - ): TaskResult = withSettingsOf(module) { - val path = androidSdkPath.reference.settingValue - GradlePlugin::localProperties.addValues( - "sdk.dir" to path - ) - } andThen computeM { + ): TaskResult = computeM { val javaPackage = module.javaPackage(configurationData.pomIr) TemplatesPlugin::addFileTemplates.execute( listOf( @@ -119,8 +112,8 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings( override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? = StdlibType.StdlibJdk7 - override val settings: List> = - listOf(androidSdkPath) + override fun getPluginSettings(): List>> = + listOf(AndroidPlugin::androidSdkPath.reference) private object FileTemplateDescriptors { val activityMainXml = FileTemplateDescriptor( 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 626acf2ec13..ff069240589 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 @@ -58,7 +58,8 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne ModuleConfiguratorSetting(create(name).buildInternal()) } - abstract val settings: List> + open fun getConfiguratorSettings(): List> = emptyList() + open fun getPluginSettings(): List>> = emptyList() @Suppress("UNCHECKED_CAST") override fun dropDownSetting( @@ -162,7 +163,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne fun initDefaultValuesFor(module: Module, context: Context) { withSettingsOf(module) { - settings.forEach { setting -> + getConfiguratorSettings().forEach { setting -> val defaultValue = setting.defaultValue ?: return@forEach context.settingContext[setting.reference] = defaultValue } @@ -172,14 +173,25 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne val ModuleConfigurator.settings get() = when (this) { - is ModuleConfiguratorWithSettings -> settings + is ModuleConfiguratorWithSettings -> getConfiguratorSettings() else -> emptyList() } -val Module.configuratorSettings - get() = configurator.settings.map { setting -> - ModuleBasedConfiguratorSettingReference(configurator, this, setting) +fun ValuesReadingContext.allSettingsOfModuleConfigurator(moduleConfigurator: ModuleConfigurator) = when (moduleConfigurator) { + is ModuleConfiguratorWithSettings -> buildList>> { + +moduleConfigurator.getConfiguratorSettings() + +moduleConfigurator.getPluginSettings().map { it.pluginSetting } } + else -> emptyList() +} + +fun Module.getConfiguratorSettings() = buildList> { + +configurator.settings.map { setting -> + ModuleBasedConfiguratorSettingReference(configurator, this@getConfiguratorSettings, setting) + } + configurator.safeAs()?.getPluginSettings()?.let { +it } +} + interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { val moduleKind: ModuleKind 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 9bb49279c01..ada6a29ad83 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 @@ -50,7 +50,7 @@ abstract class ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings() { } } - override val settings: List> = listOf(testFramework) + override fun getConfiguratorSettings(): List> = listOf(testFramework) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt index 2613dc9285d..0a931f0bf56 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt @@ -21,8 +21,8 @@ abstract class JvmModuleConfigurator : ModuleConfiguratorWithTests() { val targetJvmVersion by enumSetting("Target JVM Version", GenerationPhase.PROJECT_GENERATION) { defaultValue = TargetJvmVersion.JVM_1_8 } - override val settings: List> - get() = super.settings + targetJvmVersion + + override fun getConfiguratorSettings(): List> = super.getConfiguratorSettings() + targetJvmVersion } enum class TargetJvmVersion(val value: String) : DisplayableSettingItem { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt new file mode 100644 index 00000000000..2530b8bc2b6 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt @@ -0,0 +1,37 @@ +/* + * 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.plugins + +import org.jetbrains.kotlin.tools.projectWizard.core.Context +import org.jetbrains.kotlin.tools.projectWizard.core.Plugin +import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS +import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidModuleConfigurator +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.allModules +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.GradlePlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin + +class AndroidPlugin(context: Context) : Plugin(context) { + val androidSdkPath by pathSetting( + "Android SDK Path", + neededAtPhase = GenerationPhase.PROJECT_GENERATION + ) { + shouldExists() + } + + val addAndroidSdkToLocalProperties by pipelineTask(GenerationPhase.PROJECT_GENERATION) { + runBefore(GradlePlugin::createLocalPropertiesFile) + runAfter(KotlinPlugin::createModules) + + withAction { + if (allModules.none { it.originalModule.configurator is AndroidModuleConfigurator }) return@withAction UNIT_SUCCESS + val path = AndroidPlugin::androidSdkPath.settingValue + GradlePlugin::localProperties.addValues( + "sdk.dir" to path + ) + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt index 17d0bbe11e2..19dbde493ca 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt @@ -23,6 +23,7 @@ object Plugins { TemplatesPlugin(context), ProjectTemplatesPlugin(context), RunConfigurationsPlugin(context), + AndroidPlugin(context), // templates ConsoleJvmApplicationTemplatePlugin(context), diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt index 1eccf64d1bc..a098862ac91 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt @@ -38,8 +38,12 @@ class Module( StringValidators.shouldBeValidIdentifier("Module name `$name`", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES).validate(this, module.name) } and settingValidator { module -> withSettingsOf(module) { - configurator.settings.map { setting -> - val value = setting.reference.notRequiredSettingValue + allSettingsOfModuleConfigurator(configurator).map { setting -> + val value = when (setting) { + is PluginSetting> -> setting.reference.notRequiredSettingValue + is ModuleConfiguratorSetting> -> setting.reference.notRequiredSettingValue + else -> null + } ?: setting.defaultValue ?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank") (setting.validator as SettingValidator).validate(this@settingValidator, value)