Wizard: move module configurator settings to companion objects

This commit is contained in:
Ilya Kirillov
2020-02-20 21:10:01 +03:00
parent 4c62f64396
commit 3eca687611
10 changed files with 49 additions and 39 deletions
@@ -8,7 +8,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import kotlin.properties.ReadOnlyProperty
interface SettingsOwner : EntitiesOwnerDescriptor {
interface SettingsOwner {
fun <V : Any, T : SettingType<V>> settingDelegate(
create: (path: String) -> SettingBuilder<V, T>
): ReadOnlyProperty<Any, Setting<V, T>>
@@ -1,7 +1,5 @@
package org.jetbrains.kotlin.tools.projectWizard.core
import kotlin.reflect.KClass
interface EntitiesOwnerDescriptor {
val id: String
}
@@ -20,6 +20,7 @@ typealias PluginsCreator = (Context) -> List<Plugin>
abstract class Plugin(override val context: Context) : EntityBase(),
SettingsOwner,
ContextOwner,
EntitiesOwnerDescriptor,
EntitiesOwner<Plugin> {
override val descriptor get() = this
override val id: String get() = path
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
import java.nio.file.Path
object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(),
object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings,
SinglePlatformModuleConfigurator,
AndroidModuleConfigurator,
ModuleConfiguratorWithModuleType {
@@ -19,7 +19,7 @@ interface JSConfigurator : ModuleConfiguratorWithModuleType {
override val moduleType: ModuleType get() = ModuleType.js
}
object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests() {
object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests {
override val moduleKind = ModuleKind.singleplatformJs
override val suggestedModuleName = "js"
override val id = "jsSinglepaltform"
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.nio.file.Path
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KClass
sealed class ModuleCondifuratorSettingsEnvironment {
@@ -51,18 +52,15 @@ fun <T> withSettingsOf(
): T = function(ModuleBasedConfiguratorSettingsEnvironment(configurator, module))
abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwner {
override fun <V : Any, T : SettingType<V>> settingDelegate(
abstract class ModuleConfiguratorSettings : SettingsOwner {
final override fun <V : Any, T : SettingType<V>> settingDelegate(
create: (path: String) -> SettingBuilder<V, T>
): ReadOnlyProperty<Any?, ModuleConfiguratorSetting<V, T>> = cached { name ->
ModuleConfiguratorSetting(create(name).buildInternal())
}
open fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = emptyList()
open fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList()
@Suppress("UNCHECKED_CAST")
override fun <V : DisplayableSettingItem> dropDownSetting(
final override fun <V : DisplayableSettingItem> dropDownSetting(
title: String,
neededAtPhase: GenerationPhase,
parser: Parser<V>,
@@ -76,7 +74,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<V, DropDownSettingType<V>>>
@Suppress("UNCHECKED_CAST")
override fun stringSetting(
final override fun stringSetting(
title: String,
neededAtPhase: GenerationPhase,
init: StringSettingType.Builder.() -> Unit
@@ -88,7 +86,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<String, StringSettingType>>
@Suppress("UNCHECKED_CAST")
override fun booleanSetting(
final override fun booleanSetting(
title: String,
neededAtPhase: GenerationPhase,
init: BooleanSettingType.Builder.() -> Unit
@@ -100,7 +98,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<Boolean, BooleanSettingType>>
@Suppress("UNCHECKED_CAST")
override fun <V : Any> valueSetting(
final override fun <V : Any> valueSetting(
title: String,
neededAtPhase: GenerationPhase,
parser: Parser<V>,
@@ -114,7 +112,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<V, ValueSettingType<V>>>
@Suppress("UNCHECKED_CAST")
override fun versionSetting(
final override fun versionSetting(
title: String,
neededAtPhase: GenerationPhase,
init: VersionSettingType.Builder.() -> Unit
@@ -126,7 +124,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<Version, VersionSettingType>>
@Suppress("UNCHECKED_CAST")
override fun <V : Any> listSetting(
final override fun <V : Any> listSetting(
title: String,
neededAtPhase: GenerationPhase,
parser: Parser<V>,
@@ -140,7 +138,7 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
) as ReadOnlyProperty<Any, ModuleConfiguratorSetting<List<V>, ListSettingType<V>>>
@Suppress("UNCHECKED_CAST")
override fun pathSetting(
final override fun pathSetting(
title: String,
neededAtPhase: GenerationPhase,
init: PathSettingType.Builder.() -> Unit
@@ -160,6 +158,12 @@ abstract class ModuleConfiguratorWithSettings : ModuleConfigurator, SettingsOwne
init()
}
}
interface ModuleConfiguratorWithSettings : ModuleConfigurator {
fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = emptyList()
fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = emptyList()
fun initDefaultValuesFor(module: Module, context: Context) {
withSettingsOf(module) {
@@ -20,22 +20,24 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
abstract class ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings() {
val testFramework by enumSetting<KotlinTestFramework>(
"Test Framework",
neededAtPhase = GenerationPhase.PROJECT_GENERATION
) {
defaultValue = defaultTestFramework()
interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
companion object : ModuleConfiguratorSettings() {
val testFramework by enumSetting<KotlinTestFramework>(
"Test Framework",
neededAtPhase = GenerationPhase.PROJECT_GENERATION
) {
defaultValue = KotlinTestFramework.COMMON
filter = filter@{ reference, kotlinTestFramework ->
if (reference !is ModuleConfiguratorSettingReference<*, *>) return@filter true
filter = filter@{ reference, kotlinTestFramework ->
if (reference !is ModuleConfiguratorSettingReference<*, *>) return@filter true
val moduleType = reference.module?.configurator?.safeAs<ModuleConfiguratorWithModuleType>()?.moduleType
kotlinTestFramework.moduleType == moduleType
val moduleType = reference.module?.configurator?.safeAs<ModuleConfiguratorWithModuleType>()?.moduleType
kotlinTestFramework.moduleType == moduleType
}
}
}
abstract fun defaultTestFramework(): KotlinTestFramework
fun defaultTestFramework(): KotlinTestFramework
override fun ReadingContext.createModuleIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> =
withSettingsOf(module) {
@@ -23,7 +23,7 @@ interface TargetConfigurator : ModuleConfiguratorWithModuleType {
fun ReadingContext.createInnerTargetIrs(module: Module): List<BuildSystemIR> = emptyList()
}
abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests(), TargetConfigurator
abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests, TargetConfigurator
interface SingleCoexistenceTargetConfigurator : TargetConfigurator {
override fun canCoexistsWith(other: List<TargetConfigurator>): Boolean =
@@ -56,7 +56,7 @@ private fun Module.createTargetAccessIr(moduleSubType: ModuleSubType) =
interface JsTargetConfigurator : JSConfigurator, TargetConfigurator, SingleCoexistenceTargetConfigurator
object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWithTests() {
object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWithTests {
override val id = "jsBrowser"
override val text = "Browser"
override val suggestedModuleName = "browser"
@@ -99,7 +99,7 @@ object CommonTargetConfigurator : TargetConfiguratorWithTests(), SimpleTargetCon
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON
}
object JvmTargetConfigurator : JvmModuleConfigurator(),
object JvmTargetConfigurator : JvmModuleConfigurator,
TargetConfigurator,
SimpleTargetConfigurator {
override val moduleSubType = ModuleSubType.jvm
@@ -110,7 +110,7 @@ object JvmTargetConfigurator : JvmModuleConfigurator(),
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
override fun ReadingContext.createInnerTargetIrs(module: Module): List<BuildSystemIR> = buildList {
val targetVersionValue = withSettingsOf(module) { targetJvmVersion.reference.settingValue.value }
val targetVersionValue = withSettingsOf(module) { JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value }
when {
buildSystemType.isGradle -> {
+GradleSectionIR(
@@ -17,12 +17,17 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenProper
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
abstract class JvmModuleConfigurator : ModuleConfiguratorWithTests() {
val targetJvmVersion by enumSetting<TargetJvmVersion>("Target JVM Version", GenerationPhase.PROJECT_GENERATION) {
defaultValue = TargetJvmVersion.JVM_1_8
interface JvmModuleConfigurator : ModuleConfiguratorWithTests {
companion object : ModuleConfiguratorSettings() {
val targetJvmVersion by enumSetting<TargetJvmVersion>("Target JVM Version", GenerationPhase.PROJECT_GENERATION) {
defaultValue = TargetJvmVersion.JVM_1_8
}
}
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = super.getConfiguratorSettings() + targetJvmVersion
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> = buildList {
+super.getConfiguratorSettings()
+targetJvmVersion
}
}
enum class TargetJvmVersion(val value: String) : DisplayableSettingItem {
@@ -66,7 +71,7 @@ interface SinglePlatformModuleConfigurator : ModuleConfigurator {
override val moduleKind get() = ModuleKind.singleplatformJvm
}
object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator(),
object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
SinglePlatformModuleConfigurator,
ModuleConfiguratorWithModuleType {
override val moduleType get() = ModuleType.jvm
@@ -88,7 +93,7 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator(),
buildList {
+GradleImportIR("org.jetbrains.kotlin.gradle.tasks.KotlinCompile")
val targetVersionValue = withSettingsOf(module) { targetJvmVersion.reference.settingValue.value }
val targetVersionValue = withSettingsOf(module) { JvmModuleConfigurator.targetJvmVersion.reference.settingValue.value }
when {
configurationData.buildSystemType.isGradle -> {
+GradleConfigureTaskIR(
@@ -55,7 +55,7 @@ fun <T> withSettingsOf(
): T = function(IdBasedTemplateEnvironment(template, identificator))
abstract class Template : SettingsOwner {
abstract class Template : SettingsOwner, EntitiesOwnerDescriptor {
final override fun <V : Any, T : SettingType<V>> settingDelegate(
create: (path: String) -> SettingBuilder<V, T>
): ReadOnlyProperty<Any, TemplateSetting<V, T>> = cached { name ->