Wizard: allow creating module without unit test engine & create JPS projects without one by default

This commit is contained in:
Ilya Kirillov
2020-04-10 18:32:56 +03:00
parent 0e199ae94c
commit be6cd4de4a
8 changed files with 71 additions and 30 deletions
@@ -96,7 +96,8 @@ module.configurator.tests.setting.framework.junit4=JUnit 4
module.configurator.tests.setting.framework.junit5=JUnit 5
module.configurator.tests.setting.framework.test.ng=TestNG
module.configurator.tests.setting.framework.js=JavaScript
module.configurator.tests.setting.framework.common=common
module.configurator.tests.setting.framework.common=Common
module.configurator.tests.setting.framework.none=None
module.configurator.native.for.current.system=Your system
project.template.empty.singleplatform.title=Backend Application
@@ -58,7 +58,7 @@ class TemplateSetting<out V : Any, out T : SettingType<V>>(
sealed class SettingDefaultValue<out V : Any> {
data class Value<V : Any>(val value: V) : SettingDefaultValue<V>()
data class Dynamic<V : Any>(
val getter: Reader.(SettingReference<V, SettingType<V>>) -> V
val getter: Reader.(SettingReference<V, SettingType<V>>) -> V?
) : SettingDefaultValue<V>()
}
@@ -23,7 +23,7 @@ abstract class SettingBuilder<V : Any, T : SettingType<V>>(
var isRequired: Boolean? = null
fun value(value: V) = SettingDefaultValue.Value(value)
fun dynamic(getter: Reader.(SettingReference<V, SettingType<V>>) -> V) =
fun dynamic(getter: Reader.(SettingReference<V, SettingType<V>>) -> V?) =
SettingDefaultValue.Dynamic(getter)
protected var validator =
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.correspondingStdl
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
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModulePath
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import java.nio.file.Path
@@ -55,6 +54,12 @@ fun <T> withSettingsOf(
): T = function(ModuleBasedConfiguratorSettingsEnvironment(configurator, module))
fun <V : Any, T : SettingType<V>> Reader.settingValue(module: Module, setting: ModuleConfiguratorSetting<V, T>): V? =
withSettingsOf(module) {
setting.reference.notRequiredSettingValue
}
abstract class ModuleConfiguratorSettings : SettingsOwner {
final override fun <V : Any, T : SettingType<V>> settingDelegate(
create: (path: String) -> SettingBuilder<V, T>
@@ -6,19 +6,21 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinArbitraryDependencyIR
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
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.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
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
@@ -33,7 +35,16 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
if (reference !is ModuleConfiguratorSettingReference<*, *>) return@filter true
val moduleType = reference.module?.configurator?.safeAs<ModuleConfiguratorWithModuleType>()?.moduleType
kotlinTestFramework.moduleType == moduleType
moduleType in kotlinTestFramework.moduleTypes
}
defaultValue = dynamic { reference ->
if (buildSystemType == BuildSystemType.Jps) return@dynamic KotlinTestFramework.NONE
reference
.safeAs<ModuleConfiguratorSettingReference<*, *>>()
?.module
?.configurator
?.safeAs<ModuleConfiguratorWithTests>()
?.defaultTestFramework()
}
}
}
@@ -66,32 +77,40 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
enum class KotlinTestFramework(
override val text: String,
val moduleType: ModuleType,
val moduleTypes: List<ModuleType>,
val dependencyNames: List<String>
) : DisplayableSettingItem {
NONE(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.none"),
ModuleType.ALL.toList(),
emptyList()
),
JUNIT4(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.junit4"),
ModuleType.jvm,
listOf(ModuleType.jvm),
listOf("test-junit")
),
JUNIT5(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.junit5"),
ModuleType.jvm,
listOf(ModuleType.jvm),
listOf("test-junit5")
),
TEST_NG(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.test.ng"),
ModuleType.jvm,
listOf(ModuleType.jvm),
listOf("test-testng")
),
JS(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.js"),
ModuleType.js,
listOf(ModuleType.js),
listOf("test-js")
),
COMMON(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.common"),
ModuleType.common,
listOf(ModuleType.common),
listOf("test-common", "test-annotations-common")
)
}
}
val KotlinTestFramework.isPresent
get() = this != KotlinTestFramework.NONE
@@ -17,7 +17,7 @@ enum class ModuleType(val projectTypeName: String) {
;
companion object {
val ALL = setOf(jvm, js, native, common)
val ALL = setOf(jvm, js, native, common, android)
}
}
@@ -7,15 +7,20 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.RESOURCES_DIR
import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.SRC_DIR
import org.jetbrains.kotlin.tools.projectWizard.core.service.TemplateEngineService
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfiguratorWithTests
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.isPresent
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectName
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles
import org.jetbrains.kotlin.tools.projectWizard.templates.*
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.InterceptionPoint
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptionApplicationState
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.applyAll
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.settingValue
import java.nio.file.Path
class TemplatesPlugin(context: Context) : Plugin(context) {
val templates by property<Map<String, Template>>(
@@ -90,8 +95,8 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
val modules = buildFile.modules.modules
val applicationState = modules.mapNotNull { module ->
module.template?.createInterceptors(module)
}.flatten()
module.template?.createInterceptors(module)
}.flatten()
.applyAll(TemplateInterceptionApplicationState(buildFile, emptyMap()))
val templateEngine = service<TemplateEngineService>()
@@ -118,8 +123,8 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
putAll(interceptionPointSettings.mapKeys { it.key.name })
putAll(defaultSettings(module))
}
return with(template) { getFileTemplates(module) }.map { (fileTemplateDescriptor, filePath) ->
val path = generatePathForFileTemplate(module, filePath)
return with(template) { getFileTemplates(module) }.mapNotNull { (fileTemplateDescriptor, filePath) ->
val path = generatePathForFileTemplate(module, filePath) ?: return@mapNotNull null
val fileTemplate = FileTemplate(
fileTemplateDescriptor,
module.path / path,
@@ -134,20 +139,26 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
"moduleName" to moduleIR.name
)
private fun generatePathForFileTemplate(module: ModuleIR, filePath: FilePath) = when (module) {
is SingleplatformModuleIR -> {
when (filePath) {
is SrcFilePath -> SRC_DIR / filePath.sourcesetType.toString() / KOTLIN_DIR
is ResourcesFilePath -> SRC_DIR / filePath.sourcesetType.toString() / RESOURCES_DIR
private fun Reader.generatePathForFileTemplate(module: ModuleIR, filePath: FilePath): Path? {
if (filePath is SrcFilePath
&& filePath.sourcesetType == SourcesetType.test
&& settingValue(module.originalModule, ModuleConfiguratorWithTests.testFramework)?.isPresent != true
) return null
return when (module) {
is SingleplatformModuleIR -> {
when (filePath) {
is SrcFilePath -> SRC_DIR / filePath.sourcesetType.toString() / KOTLIN_DIR
is ResourcesFilePath -> SRC_DIR / filePath.sourcesetType.toString() / RESOURCES_DIR
}
}
}
is MultiplatformModuleIR -> {
val directory = when (filePath) {
is SrcFilePath -> KOTLIN_DIR
is ResourcesFilePath -> RESOURCES_DIR
is MultiplatformModuleIR -> {
val directory = when (filePath) {
is SrcFilePath -> KOTLIN_DIR
is ResourcesFilePath -> RESOURCES_DIR
}
SRC_DIR / "${module.name}${filePath.sourcesetType.name.capitalize()}" / directory
}
SRC_DIR / "${module.name}${filePath.sourcesetType.name.capitalize()}" / directory
}
}
}
@@ -58,6 +58,11 @@ fun <T> withSettingsOf(
function: TemplateEnvironment.() -> T
): T = function(IdBasedTemplateEnvironment(template, identificator))
fun <V : Any, T : SettingType<V>> Reader.settingValue(module: Module, setting: TemplateSetting<V, T>): V? =
withSettingsOf(module) {
setting.reference.notRequiredSettingValue
}
abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSettingItem {
final override fun <V : Any, T : SettingType<V>> settingDelegate(