Wizard: move Android SDK Setting to AndroidPlugin
This commit is contained in:
+2
-2
@@ -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.ValuesReadingContext
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
|
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
|
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.moduleConfigurators.moduleType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
|
||||||
@@ -71,7 +71,7 @@ class ModuleSettingsComponent(
|
|||||||
nameField.component.isVisible = module.kind != ModuleKind.target
|
nameField.component.isVisible = module.kind != ModuleKind.target
|
||||||
|| module.configurator.moduleType != ModuleType.common
|
|| module.configurator.moduleType != ModuleType.common
|
||||||
|
|
||||||
moduleConfiguratorSettingsList.setSettings(module.configuratorSettings)
|
moduleConfiguratorSettingsList.setSettings(module.getConfiguratorSettings())
|
||||||
templateComponent.module = module
|
templateComponent.module = module
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -36,4 +36,9 @@ open class ValuesReadingContext(
|
|||||||
|
|
||||||
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue(): V? =
|
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue(): V? =
|
||||||
context.settingContext[this]
|
context.settingContext[this]
|
||||||
|
|
||||||
|
val <V : Any, T : SettingType<V>> PluginSettingReference<V, T>.pluginSetting: Setting<V, T>
|
||||||
|
get() = context.settingContext.getPluginSetting(this)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+5
-2
@@ -24,9 +24,9 @@ sealed class SettingReference<out V : Any, out T : SettingType<V>> {
|
|||||||
final override fun hashCode() = path.hashCode()
|
final override fun hashCode() = path.hashCode()
|
||||||
}
|
}
|
||||||
|
|
||||||
data class PluginSettingReference<V : Any, T : SettingType<V>>(
|
data class PluginSettingReference<out V : Any, out T : SettingType<V>>(
|
||||||
override val path: String,
|
override val path: String,
|
||||||
override val type: KClass<T>
|
override val type: KClass<@UnsafeVariance T>
|
||||||
) : SettingReference<V, T>() {
|
) : SettingReference<V, T>() {
|
||||||
|
|
||||||
constructor(kProperty: KProperty1<out Plugin, PluginSetting<V, T>>, type: KClass<T>) :
|
constructor(kProperty: KProperty1<out Plugin, PluginSetting<V, T>>, type: KClass<T>) :
|
||||||
@@ -40,6 +40,9 @@ data class PluginSettingReference<V : Any, T : SettingType<V>>(
|
|||||||
settingContext.getPluginSetting(this@PluginSettingReference)
|
settingContext.getPluginSetting(this@PluginSettingReference)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline val <V : Any, reified T : SettingType<V>> PluginSetting<V, T>.reference: PluginSettingReference<V, T>
|
||||||
|
get() = PluginSettingReference(path, T::class)
|
||||||
|
|
||||||
sealed class ModuleConfiguratorSettingReference<V : Any, T : SettingType<V>> : SettingReference<V, T>() {
|
sealed class ModuleConfiguratorSettingReference<V : Any, T : SettingType<V>> : SettingReference<V, T>() {
|
||||||
abstract val descriptor: ModuleConfigurator
|
abstract val descriptor: ModuleConfigurator
|
||||||
abstract val moduleId: Identificator
|
abstract val moduleId: Identificator
|
||||||
|
|||||||
+1
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core
|
|||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
|
import java.util.*
|
||||||
import kotlin.properties.ReadOnlyProperty
|
import kotlin.properties.ReadOnlyProperty
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|||||||
+9
-16
@@ -1,7 +1,9 @@
|
|||||||
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
|
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
|
||||||
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.*
|
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.core.service.kotlinVersionKind
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
|
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.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.BuildScriptRepositoryIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
|
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.buildSystem.gradle.GradlePlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
@@ -27,18 +29,14 @@ import java.nio.file.Path
|
|||||||
object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(),
|
object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(),
|
||||||
SinglePlatformModuleConfigurator,
|
SinglePlatformModuleConfigurator,
|
||||||
AndroidModuleConfigurator,
|
AndroidModuleConfigurator,
|
||||||
ModuleConfiguratorWithModuleType{
|
ModuleConfiguratorWithModuleType {
|
||||||
override val moduleType = ModuleType.jvm
|
override val moduleType = ModuleType.jvm
|
||||||
override val id = "android"
|
override val id = "android"
|
||||||
override val suggestedModuleName = "android"
|
override val suggestedModuleName = "android"
|
||||||
override val text = "Android"
|
override val text = "Android"
|
||||||
override val greyText = "Requires Android SDK"
|
override val greyText = "Requires Android SDK"
|
||||||
|
|
||||||
val androidSdkPath by pathSetting("Android SDK Path", neededAtPhase = GenerationPhase.PROJECT_GENERATION) {
|
private fun createRepositories(configurationData: ModuleConfigurationData) = buildList<Repository> {
|
||||||
shouldExists()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createRepositories(configurationData: ModuleConfigurationData) =buildList<Repository> {
|
|
||||||
+DefaultRepository.GRADLE_PLUGIN_PORTAL
|
+DefaultRepository.GRADLE_PLUGIN_PORTAL
|
||||||
+DefaultRepository.GOOGLE
|
+DefaultRepository.GOOGLE
|
||||||
+DefaultRepository.JCENTER
|
+DefaultRepository.JCENTER
|
||||||
@@ -79,12 +77,7 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(
|
|||||||
configurationData: ModuleConfigurationData,
|
configurationData: ModuleConfigurationData,
|
||||||
module: Module,
|
module: Module,
|
||||||
modulePath: Path
|
modulePath: Path
|
||||||
): TaskResult<Unit> = withSettingsOf(module) {
|
): TaskResult<Unit> = computeM {
|
||||||
val path = androidSdkPath.reference.settingValue
|
|
||||||
GradlePlugin::localProperties.addValues(
|
|
||||||
"sdk.dir" to path
|
|
||||||
)
|
|
||||||
} andThen computeM {
|
|
||||||
val javaPackage = module.javaPackage(configurationData.pomIr)
|
val javaPackage = module.javaPackage(configurationData.pomIr)
|
||||||
TemplatesPlugin::addFileTemplates.execute(
|
TemplatesPlugin::addFileTemplates.execute(
|
||||||
listOf(
|
listOf(
|
||||||
@@ -119,8 +112,8 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(
|
|||||||
override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? =
|
override fun createStdlibType(configurationData: ModuleConfigurationData, module: Module): StdlibType? =
|
||||||
StdlibType.StdlibJdk7
|
StdlibType.StdlibJdk7
|
||||||
|
|
||||||
override val settings: List<ModuleConfiguratorSetting<*, *>> =
|
override fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> =
|
||||||
listOf(androidSdkPath)
|
listOf(AndroidPlugin::androidSdkPath.reference)
|
||||||
|
|
||||||
private object FileTemplateDescriptors {
|
private object FileTemplateDescriptors {
|
||||||
val activityMainXml = FileTemplateDescriptor(
|
val activityMainXml = FileTemplateDescriptor(
|
||||||
|
|||||||
+18
-6
@@ -58,7 +58,8 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
|
|||||||
ModuleConfiguratorSetting(create(name).buildInternal())
|
ModuleConfiguratorSetting(create(name).buildInternal())
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract val settings: List<ModuleConfiguratorSetting<*, *>>
|
open fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = emptyList()
|
||||||
|
open fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList()
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun <V : DisplayableSettingItem> dropDownSetting(
|
override fun <V : DisplayableSettingItem> dropDownSetting(
|
||||||
@@ -162,7 +163,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
|
|||||||
|
|
||||||
fun initDefaultValuesFor(module: Module, context: Context) {
|
fun initDefaultValuesFor(module: Module, context: Context) {
|
||||||
withSettingsOf(module) {
|
withSettingsOf(module) {
|
||||||
settings.forEach { setting ->
|
getConfiguratorSettings().forEach { setting ->
|
||||||
val defaultValue = setting.defaultValue ?: return@forEach
|
val defaultValue = setting.defaultValue ?: return@forEach
|
||||||
context.settingContext[setting.reference] = defaultValue
|
context.settingContext[setting.reference] = defaultValue
|
||||||
}
|
}
|
||||||
@@ -172,14 +173,25 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
|
|||||||
|
|
||||||
val ModuleConfigurator.settings
|
val ModuleConfigurator.settings
|
||||||
get() = when (this) {
|
get() = when (this) {
|
||||||
is ModuleConfiguratorWithSettings -> settings
|
is ModuleConfiguratorWithSettings -> getConfiguratorSettings()
|
||||||
else -> emptyList()
|
else -> emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
val Module.configuratorSettings
|
fun ValuesReadingContext.allSettingsOfModuleConfigurator(moduleConfigurator: ModuleConfigurator) = when (moduleConfigurator) {
|
||||||
get() = configurator.settings.map { setting ->
|
is ModuleConfiguratorWithSettings -> buildList<Setting<Any, SettingType<Any>>> {
|
||||||
ModuleBasedConfiguratorSettingReference(configurator, this, setting)
|
+moduleConfigurator.getConfiguratorSettings()
|
||||||
|
+moduleConfigurator.getPluginSettings().map { it.pluginSetting }
|
||||||
}
|
}
|
||||||
|
else -> emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Module.getConfiguratorSettings() = buildList<SettingReference<*, *>> {
|
||||||
|
+configurator.settings.map { setting ->
|
||||||
|
ModuleBasedConfiguratorSettingReference(configurator, this@getConfiguratorSettings, setting)
|
||||||
|
}
|
||||||
|
configurator.safeAs<ModuleConfiguratorWithSettings>()?.getPluginSettings()?.let { +it }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
|
interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
|
||||||
val moduleKind: ModuleKind
|
val moduleKind: ModuleKind
|
||||||
|
|||||||
+1
-1
@@ -50,7 +50,7 @@ abstract class ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val settings: List<ModuleConfiguratorSetting<*, *>> = listOf(testFramework)
|
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = listOf(testFramework)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -21,8 +21,8 @@ abstract class JvmModuleConfigurator : ModuleConfiguratorWithTests() {
|
|||||||
val targetJvmVersion by enumSetting<TargetJvmVersion>("Target JVM Version", GenerationPhase.PROJECT_GENERATION) {
|
val targetJvmVersion by enumSetting<TargetJvmVersion>("Target JVM Version", GenerationPhase.PROJECT_GENERATION) {
|
||||||
defaultValue = TargetJvmVersion.JVM_1_8
|
defaultValue = TargetJvmVersion.JVM_1_8
|
||||||
}
|
}
|
||||||
override val settings: List<ModuleConfiguratorSetting<*, *>>
|
|
||||||
get() = super.settings + targetJvmVersion
|
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = super.getConfiguratorSettings() + targetJvmVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class TargetJvmVersion(val value: String) : DisplayableSettingItem {
|
enum class TargetJvmVersion(val value: String) : DisplayableSettingItem {
|
||||||
|
|||||||
+37
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -23,6 +23,7 @@ object Plugins {
|
|||||||
TemplatesPlugin(context),
|
TemplatesPlugin(context),
|
||||||
ProjectTemplatesPlugin(context),
|
ProjectTemplatesPlugin(context),
|
||||||
RunConfigurationsPlugin(context),
|
RunConfigurationsPlugin(context),
|
||||||
|
AndroidPlugin(context),
|
||||||
|
|
||||||
// templates
|
// templates
|
||||||
ConsoleJvmApplicationTemplatePlugin(context),
|
ConsoleJvmApplicationTemplatePlugin(context),
|
||||||
|
|||||||
+6
-2
@@ -38,8 +38,12 @@ class Module(
|
|||||||
StringValidators.shouldBeValidIdentifier("Module name `$name`", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES).validate(this, module.name)
|
StringValidators.shouldBeValidIdentifier("Module name `$name`", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES).validate(this, module.name)
|
||||||
} and settingValidator { module ->
|
} and settingValidator { module ->
|
||||||
withSettingsOf(module) {
|
withSettingsOf(module) {
|
||||||
configurator.settings.map { setting ->
|
allSettingsOfModuleConfigurator(configurator).map { setting ->
|
||||||
val value = setting.reference.notRequiredSettingValue
|
val value = when (setting) {
|
||||||
|
is PluginSetting<Any, SettingType<Any>> -> setting.reference.notRequiredSettingValue
|
||||||
|
is ModuleConfiguratorSetting<Any, SettingType<Any>> -> setting.reference.notRequiredSettingValue
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
?: setting.defaultValue
|
?: setting.defaultValue
|
||||||
?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank")
|
?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank")
|
||||||
(setting.validator as SettingValidator<Any>).validate(this@settingValidator, value)
|
(setting.validator as SettingValidator<Any>).validate(this@settingValidator, value)
|
||||||
|
|||||||
Reference in New Issue
Block a user