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