diff --git a/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties b/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties index 884e2b82d2e..76940f2b0fd 100644 --- a/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties +++ b/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties @@ -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 diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/Setting.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/Setting.kt index ef5e4b5d6e9..4a697f4858e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/Setting.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/Setting.kt @@ -58,7 +58,7 @@ class TemplateSetting>( sealed class SettingDefaultValue { data class Value(val value: V) : SettingDefaultValue() data class Dynamic( - val getter: Reader.(SettingReference>) -> V + val getter: Reader.(SettingReference>) -> V? ) : SettingDefaultValue() } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingBuilder.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingBuilder.kt index 4df13f6ee86..b3cd3a2c14e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingBuilder.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingBuilder.kt @@ -23,7 +23,7 @@ abstract class SettingBuilder>( var isRequired: Boolean? = null fun value(value: V) = SettingDefaultValue.Value(value) - fun dynamic(getter: Reader.(SettingReference>) -> V) = + fun dynamic(getter: Reader.(SettingReference>) -> V?) = SettingDefaultValue.Dynamic(getter) protected var validator = 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 d063eceae9d..3aba8282104 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 @@ -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 withSettingsOf( ): T = function(ModuleBasedConfiguratorSettingsEnvironment(configurator, module)) +fun > Reader.settingValue(module: Module, setting: ModuleConfiguratorSetting): V? = + withSettingsOf(module) { + setting.reference.notRequiredSettingValue + } + + abstract class ModuleConfiguratorSettings : SettingsOwner { final override fun > settingDelegate( create: (path: String) -> SettingBuilder 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 45597870f65..b5ce10c6185 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 @@ -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()?.moduleType - kotlinTestFramework.moduleType == moduleType + moduleType in kotlinTestFramework.moduleTypes + } + defaultValue = dynamic { reference -> + if (buildSystemType == BuildSystemType.Jps) return@dynamic KotlinTestFramework.NONE + reference + .safeAs>() + ?.module + ?.configurator + ?.safeAs() + ?.defaultTestFramework() } } } @@ -66,32 +77,40 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings { enum class KotlinTestFramework( override val text: String, - val moduleType: ModuleType, + val moduleTypes: List, val dependencyNames: List ) : 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") ) -} \ No newline at end of file +} + +val KotlinTestFramework.isPresent + get() = this != KotlinTestFramework.NONE \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt index 0c21a6e8e70..c1f332ced74 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModuleType.kt @@ -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) } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt index e9e19a2348d..d345c4cd152 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt @@ -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>( @@ -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() @@ -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 } } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt index 32f1ae889ad..83c2be4a7fd 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt @@ -58,6 +58,11 @@ fun withSettingsOf( function: TemplateEnvironment.() -> T ): T = function(IdBasedTemplateEnvironment(template, identificator)) +fun > Reader.settingValue(module: Module, setting: TemplateSetting): V? = + withSettingsOf(module) { + setting.reference.notRequiredSettingValue + } + abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSettingItem { final override fun > settingDelegate(