From fa4d790f5a2a84c7c671c6a6c3a86802c6093517 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 10 Feb 2020 22:43:52 +0300 Subject: [PATCH] Wizard: add jvm target setting for JVM configurations #KT-36180 fixed --- .../jvmTarget/build.gradle | 6 +- .../jvmTarget/build.gradle.kts | 6 +- .../jvmTarget/settings.yaml | 1 + .../kotlinJvm/build.gradle | 5 ++ .../kotlinJvm/build.gradle.kts | 5 ++ .../buildFileGeneration/kotlinJvm/pom.xml | 1 + .../kotlinJvm/settings.yaml | 1 + .../simpleMultiplatform/build.gradle | 6 +- .../simpleMultiplatform/build.gradle.kts | 6 +- .../simpleMultiplatform/settings.yaml | 5 +- .../kotlin/tools/projectWizard/core/Parser.kt | 18 +++--- .../tools/projectWizard/core/TaskResult.kt | 2 +- .../ir/buildsystem/BuildFileIR.kt | 2 + .../ir/buildsystem/gradle/GradleTaskIR.kt | 21 +++++-- .../ir/buildsystem/maven/MavenIR.kt | 11 +++- ...AndroidSinglePlatformModuleConfigurator.kt | 5 +- .../JsModuleConfigurator.kt | 6 +- .../moduleConfigurators/ModuleConfigurator.kt | 35 ++++++------ .../NativeTargetConfigurator.kt | 8 ++- .../moduleConfigurators/TargetConfigurator.kt | 33 ++++++++--- .../moduleConfigurators/configurators.kt | 56 ++++++++++++++++++- .../plugins/kotlin/ModulesToIRsConverter.kt | 6 +- .../settings/buildsystem/Module.kt | 7 ++- .../settings/buildsystem/Sourceset.kt | 5 +- .../projectWizard/settings/version/Version.kt | 2 +- .../templates/SimpleJsClientTemplate.kt | 2 +- 26 files changed, 202 insertions(+), 59 deletions(-) diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle index 4a8c3593736..bb4f59df44b 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle @@ -8,7 +8,11 @@ repositories { mavenCentral() } kotlin { - jvm() + jvm { + compilations.all { + kotlinOptions.jvmTarget = '1.8' + } + } sourceSets { jvmMain { dependencies { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle.kts index 83321d8a56f..c7aaa368f85 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/build.gradle.kts @@ -8,7 +8,11 @@ repositories { mavenCentral() } kotlin { - jvm() + jvm { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + } sourceSets { val jvmMain by getting { dependencies { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml index 05ddaa44bd2..0ae6a6cf615 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/jvmTarget/settings.yaml @@ -6,6 +6,7 @@ kotlin: name: a subModules: - type: + targetJvmVersion: "1.8" name: jvmTarget testFramework: JUNIT4 kind: target diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle index 976461f7cff..0bb3f46648f 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { id 'org.jetbrains.kotlin.jvm' version '1.3.61' } @@ -10,4 +12,7 @@ repositories { dependencies { testImplementation 'org.jetbrains.kotlin:kotlin-test-junit' implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' +} +tasks.withType(KotlinCompile) { + kotlinOptions.jvmTarget = '1.6' } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle.kts index c5b816804b9..a39ab50a237 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { kotlin("jvm") version "1.3.61" } @@ -10,4 +12,7 @@ repositories { dependencies { testImplementation(kotlin("test-junit")) implementation(kotlin("stdlib-jdk8")) +} +tasks.withType() { + kotlinOptions.jvmTarget = "1.6" } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml index c6d077c24d1..b11117b0a48 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/pom.xml @@ -14,6 +14,7 @@ UTF-8 official + 1.6 diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml index d880eb3eb4a..29a6a49a268 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/kotlinJvm/settings.yaml @@ -2,6 +2,7 @@ kotlin: projectKind: Singleplatform modules: - type: + targetJvmVersion: "1.6" name: JVM Module testFramework: JUNIT4 name: nya diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle index c5fcbb53e41..1dbc8e61846 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle @@ -8,7 +8,11 @@ repositories { mavenCentral() } kotlin { - jvm() + jvm { + compilations.all { + kotlinOptions.jvmTarget = '9' + } + } js('a') { browser { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle.kts index 3850bb4d6df..dacf1be351e 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/build.gradle.kts @@ -8,7 +8,11 @@ repositories { mavenCentral() } kotlin { - jvm() + jvm { + compilations.all { + kotlinOptions.jvmTarget = "9" + } + } js("a") { browser { diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml index 2dd45b431bb..0a4f163d0eb 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/buildFileGeneration/simpleMultiplatform/settings.yaml @@ -6,6 +6,7 @@ kotlin: name: a subModules: - type: + targetJvmVersion: "9" name: jvmTarget testFramework: JUNIT4 kind: target @@ -14,8 +15,8 @@ kotlin: - type: main - type: test - type: - name: jsBrowser - testFramework: JS + name: jsBrowser + testFramework: JS kind: target name: a sourcesets: diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt index b550563c85e..a1a1cbe8d91 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.tools.projectWizard.core import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference +import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.templates.Template import java.nio.file.Paths import kotlin.reflect.KClass @@ -31,16 +32,17 @@ fun alwaysFailingParser() = object : Parser() { fun Parser.parse(context: ParsingContext, value: Any?, path: String) = with(context) { parse(value, path) } -inline fun > enumParser(): Parser = object : Parser() { +inline fun enumParser(): Parser where E : Enum, E : DisplayableSettingItem = object : Parser() { override fun ParsingContext.parse(value: Any?, path: String): TaskResult = computeM { - val (enumName) = value.parseAs(path) - safe { enumValueOf(enumName) }.mapFailure { - listOf( - ParseError( - "For setting `$path` one of [${enumValues().joinToString { it.name }}] was expected but `$enumName` was found" - ) + val (name) = value.parseAs(path) + val createError = { + ParseError( + "For setting `$path` one of [${enumValues().joinToString { it.name }}] was expected but `$name` was found" ) } + val byEnumName = safe { enumValueOf(name) }.mapFailure { createError() } + val byText = enumValues().firstOrNull { it.text == name }.toResult { createError() } + byEnumName.recover { byText } } } @@ -189,7 +191,7 @@ val pathParser = valueParser { value, path -> value.parseAs(path).map { Paths.get(it) }.get() } -infix fun Parser.or(alternative: Parser): Parser = object : Parser() { +infix fun Parser.or(alternative: Parser): Parser = object : Parser() { override fun ParsingContext.parse(value: Any?, path: String): TaskResult = this@or.parse(this, value, path).recover { alternative.parse(this, value, path) } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskResult.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskResult.kt index 6bf025e4f7b..693e48184c5 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskResult.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/TaskResult.kt @@ -111,7 +111,7 @@ fun TaskResult.map(f: (T) -> R): TaskResult = when (thi is Success -> Success(f(value)) } -fun TaskResult.mapFailure(f: (List) -> List): TaskResult = when (this) { +fun TaskResult.mapFailure(f: (List) -> Error): TaskResult = when (this) { is Failure -> Failure(f(errors)) is Success -> this } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt index e662c48d9a6..9718233f067 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt @@ -5,6 +5,7 @@ import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenPropertyIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.PluginRepositoryMavenIR import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter @@ -83,6 +84,7 @@ data class BuildFileIR( node("properties") { singleLineNode("project.build.sourceEncoding") { +"UTF-8" } singleLineNode("kotlin.code.style") { +"official" } + irsOfType().listNl() } distinctRepositories().takeIf { it.isNotEmpty() }?.let { repositories -> diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt index 656f3c3d03f..14a0746f697 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt @@ -5,12 +5,10 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter -interface GradleTaskAccessIR : GradleIR { - val name: String -} +interface GradleTaskAccessIR : GradleIR data class GradleByNameTaskAccessIR( - override val name: String, + val name: String, val taskClass: String? = null ) : GradleTaskAccessIR { override fun GradlePrinter.renderGradle() { @@ -27,6 +25,21 @@ data class GradleByNameTaskAccessIR( } } +data class GradleByClassTasksAccessIR( + val taskClass: String +) : GradleTaskAccessIR { + override fun GradlePrinter.renderGradle() { + when (dsl) { + GradlePrinter.GradleDsl.GROOVY -> { + +"tasks.withType($taskClass)" + } + GradlePrinter.GradleDsl.KOTLIN -> { + +"tasks.withType<$taskClass>()" + } + } + } +} + data class GradleConfigureTaskIR( val taskAccess: GradleTaskAccessIR, val dependsOn: List = emptyList(), diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt index d10492864ef..fbabf9395b4 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/maven/MavenIR.kt @@ -20,7 +20,7 @@ interface MavenIR : BuildSystemIR { data class PluginRepositoryMavenIR( val repository: Repository -): MavenIR { +) : MavenIR { override fun MavenPrinter.renderMaven() { node("pluginRepository") { singleLineNode("id") { +repository.idForMaven } @@ -29,4 +29,13 @@ data class PluginRepositoryMavenIR( } } +data class MavenPropertyIR( + val name: String, + val value: String +) : MavenIR { + override fun MavenPrinter.renderMaven() { + singleLineNode(name) { +value } + } +} + diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt index 0b4725e58a1..5b22f26fb26 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt @@ -46,7 +46,10 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings( } - override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module) = + override fun ValuesReadingContext.createBuildFileIRs( + configurationData: ModuleConfigurationData, + module: Module + ) = buildList { +GradleOnlyPluginByNameIR("com.android.application") diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt index 00b8f7634aa..543e18403cf 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR @@ -34,7 +35,10 @@ object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWi version = configurationData.kotlinVersion ) - override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List = buildList { + override fun ValuesReadingContext.createBuildFileIRs( + configurationData: ModuleConfigurationData, + module: Module + ): List = buildList { +RawGradleIR { +"kotlin.target.browser { }" } 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 272f67e594b..626acf2ec13 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 @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystem import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase 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.correspondingStdlib import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* @@ -190,7 +189,10 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { val suggestedModuleName: String? get() = null val canContainSubModules: Boolean get() = false - fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List = + fun ValuesReadingContext.createBuildFileIRs( + configurationData: ModuleConfigurationData, + module: Module + ): List = emptyList() fun ValuesReadingContext.createModuleIRs(configurationData: ModuleConfigurationData, module: Module): List = @@ -232,19 +234,20 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { val BY_ID = ALL.associateBy(ModuleConfigurator::id) val BY_MODULE_KIND = ALL.groupBy(ModuleConfigurator::moduleKind) - fun getParser(moduleIdentificator: Identificator): Parser = mapParser { map, path -> - val (id) = map.parseValue(path, "name") - val (configurator) = BY_ID[id].toResult { ConfiguratorNotFoundError(id) } - val (settingsWithValues) = configurator.settings.mapComputeM { setting -> - val (settingValue) = map[setting.path].toResult { ParseError("No value was found for a key `$path.${setting.path}`") } - val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference } - setting.type.parse(this, settingValue, setting.path).map { reference to it } - }.sequence() - updateState { it.withSettings(settingsWithValues) } - configurator - } or valueParserM { value, path -> - val (id) = value.parseAs(path) - BY_ID[id].toResult { ConfiguratorNotFoundError(id) } - } + fun getParser(moduleIdentificator: Identificator): Parser = + valueParserM { value, path -> + val (id) = value.parseAs(path) + BY_ID[id].toResult { ConfiguratorNotFoundError(id) } + } or mapParser { map, path -> + val (id) = map.parseValue(path, "name") + val (configurator) = BY_ID[id].toResult { ConfiguratorNotFoundError(id) } + val (settingsWithValues) = configurator.settings.mapComputeM { setting -> + val (settingValue) = map[setting.path].toResult { ParseError("No value was found for a key `$path.${setting.path}`") } + val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference } + setting.type.parse(this, settingValue, setting.path).map { reference to it } + }.sequence() + updateState { it.withSettings(settingsWithValues) } + configurator + } } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt index ed9c9d60ada..a38ee0cf5c4 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt @@ -1,5 +1,6 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.CreateGradleValueIR @@ -33,7 +34,7 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc override val text = "For Current System" - override fun createTargetIrs(module: Module): List { + override fun ValuesReadingContext.createTargetIrs(module: Module): List { val moduleName = module.name val variableName = "${moduleName}Target" @@ -73,7 +74,10 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc } } - override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List = buildList { + override fun ValuesReadingContext.createBuildFileIRs( + configurationData: ModuleConfigurationData, + module: Module + ): List = buildList { if (configurationData.buildSystemType == BuildSystemType.GradleGroovyDsl) { +GradleImportIR("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests") } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/TargetConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/TargetConfigurator.kt index 56cdc2a38d2..3079af72466 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/TargetConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/TargetConfigurator.kt @@ -1,10 +1,14 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.RawGradleIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR +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.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module @@ -16,8 +20,8 @@ interface TargetConfigurator : ModuleConfiguratorWithModuleType { fun canCoexistsWith(other: List): Boolean = true - fun createTargetIrs(module: Module): List - fun createInnerTargetIrs(module: Module): List = emptyList() + fun ValuesReadingContext.createTargetIrs(module: Module): List + fun ValuesReadingContext.createInnerTargetIrs(module: Module): List = emptyList() } abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests(), TargetConfigurator @@ -36,7 +40,7 @@ interface SimpleTargetConfigurator : TargetConfigurator, SingleCoexistenceTarget override val suggestedModuleName: String? get() = moduleSubType.name - override fun createTargetIrs(module: Module): List = buildList { + override fun ValuesReadingContext.createTargetIrs(module: Module): List = buildList { +DefaultTargetConfigurationIR( module.createTargetAccessIr(moduleSubType), createInnerTargetIrs(module) @@ -60,7 +64,7 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS - override fun createTargetIrs(module: Module): List = buildList { + override fun ValuesReadingContext.createTargetIrs(module: Module): List = buildList { +DefaultTargetConfigurationIR( module.createTargetAccessIr(ModuleSubType.js), buildList { @@ -78,7 +82,7 @@ object JsNodeTargetConfigurator : JsTargetConfigurator { override val suggestedModuleName = "nodeJs" - override fun createTargetIrs(module: Module): List = buildList { + override fun ValuesReadingContext.createTargetIrs(module: Module): List = buildList { +DefaultTargetConfigurationIR( module.createTargetAccessIr(ModuleSubType.js), buildList { @@ -96,14 +100,27 @@ object CommonTargetConfigurator : TargetConfiguratorWithTests(), SimpleTargetCon override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON } -object JvmTargetConfigurator : TargetConfiguratorWithTests(), +object JvmTargetConfigurator : JvmModuleConfigurator(), TargetConfigurator, SimpleTargetConfigurator, - JvmModuleConfigurator, SingleCoexistenceTargetConfigurator { override val moduleSubType = ModuleSubType.jvm override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4 + + override fun ValuesReadingContext.createInnerTargetIrs(module: Module): List = buildList { + val targetVersionValue = withSettingsOf(module) { targetJvmVersion.reference.settingValue.value } + when { + buildSystemType.isGradle -> { + +GradleSectionIR( + "compilations.all", + BodyIR( + GradleAssignmentIR("kotlinOptions.jvmTarget", GradleStringConstIR(targetVersionValue)) + ) + ) + } + } + } } object AndroidTargetConfigurator : TargetConfigurator, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt index e36debcffe5..2613dc9285d 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt @@ -1,13 +1,43 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext +import org.jetbrains.kotlin.tools.projectWizard.core.entity.ModuleConfiguratorSetting 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.KotlinBuildSystemPluginIR +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType +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.core.buildList +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenPropertyIR +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("Target JVM Version", GenerationPhase.PROJECT_GENERATION) { + defaultValue = TargetJvmVersion.JVM_1_8 + } + override val settings: List> + get() = super.settings + targetJvmVersion +} + +enum class TargetJvmVersion(val value: String) : DisplayableSettingItem { + JVM_1_6("1.6"), + JVM_1_8("1.8"), + JVM_9("9"), + JVM_10("10"), + JVM_11("11"), + JVM_12("12"), + JVM_13("13"); + + override val text: String + get() = value +} -interface JvmModuleConfigurator : ModuleConfigurator interface AndroidModuleConfigurator : ModuleConfigurator interface ModuleConfiguratorWithModuleType : ModuleConfigurator { @@ -36,9 +66,8 @@ interface SinglePlatformModuleConfigurator : ModuleConfigurator { override val moduleKind get() = ModuleKind.singleplatformJvm } -object JvmSinglePlatformModuleConfigurator : ModuleConfiguratorWithTests(), +object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator(), SinglePlatformModuleConfigurator, - JvmModuleConfigurator, ModuleConfiguratorWithModuleType { override val moduleType get() = ModuleType.jvm override val suggestedModuleName = "jvm" @@ -53,6 +82,27 @@ object JvmSinglePlatformModuleConfigurator : ModuleConfiguratorWithTests(), KotlinBuildSystemPluginIR.Type.jvm, version = configurationData.kotlinVersion ) + + + override fun ValuesReadingContext.createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List = + buildList { + +GradleImportIR("org.jetbrains.kotlin.gradle.tasks.KotlinCompile") + + val targetVersionValue = withSettingsOf(module) { targetJvmVersion.reference.settingValue.value } + when { + configurationData.buildSystemType.isGradle -> { + +GradleConfigureTaskIR( + GradleByClassTasksAccessIR("KotlinCompile"), + irs = listOf( + GradleAssignmentIR("kotlinOptions.jvmTarget", GradleStringConstIR(targetVersionValue)) + ) + ) + } + configurationData.buildSystemType == BuildSystemType.Maven -> { + +MavenPropertyIR("kotlin.compiler.jvmTarget", targetVersionValue) + } + } + } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt index 66504a0ebed..57af2ecc06f 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt @@ -156,7 +156,7 @@ class ModulesToIRsConverter( val modulePath = calculatePathForModule(module, state.parentPath) taskRunningContext.mutateProjectStructureByModuleConfigurator(module, modulePath) val targetIrs = module.subModules.flatMap { subModule -> - (subModule.configurator as TargetConfigurator).createTargetIrs(subModule) + with(subModule.configurator as TargetConfigurator) { createTargetIrs(subModule) } } val targetModuleIrs = module.subModules.map { target -> @@ -223,7 +223,7 @@ class ModulesToIRsConverter( runArbitraryTask(data, module, modulePath) } - private fun createBuildFileIRs( + private fun ValuesReadingContext.createBuildFileIRs( module: Module, state: ModulesToIrsState ) = buildList { @@ -239,7 +239,7 @@ class ModulesToIRsConverter( } } addIfNotNull(kotlinPlugin) - +module.configurator.createBuildFileIRs(data, module) + +with(module.configurator) { createBuildFileIRs(data, module) } } private fun SourcesetDependency.toIR(type: DependencyType): DependencyIR = with(data) { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt index 35341a6fa57..1c17bcab176 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Module.kt @@ -10,11 +10,14 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.templates.Template @Suppress("EnumEntryName") -enum class ModuleKind { +enum class ModuleKind : DisplayableSettingItem { multiplatform, target, singleplatformJvm, - singleplatformJs, + singleplatformJs, ; + + override val text: String + get() = name } // TODO separate to classes diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt index e0aefab31ff..0e830b4f944 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt @@ -59,9 +59,12 @@ class Sourceset( } @Suppress("EnumEntryName") -enum class SourcesetType { +enum class SourcesetType: DisplayableSettingItem { main, test; + override val text: String + get() = name + companion object { val ALL = values().toSet() } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt index 36efb80697f..cd097b7b136 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/version/Version.kt @@ -34,7 +34,7 @@ class Version private constructor(internal val mavenVersion: ArtifactVersion) : val parser: Parser = valueParser { value, path -> val (stringVersion) = value.parseAs(path) safe { fromString(stringVersion) }.mapFailure { - listOf(ParseError("Bad version format for setting `$path`")) + ParseError("Bad version format for setting `$path`") }.get() } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt index 6b85d399afc..0d6bc8ddb84 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt @@ -112,7 +112,7 @@ class SimpleJsClientTemplate : Template() { +interceptTemplate(KtorServerTemplate()) { applicableIf { buildFileIR -> val tasks = buildFileIR.irsOfTypeOrNull() ?: return@applicableIf false - tasks.none { it.taskAccess.name.endsWith("Jar") } + tasks.none { it.taskAccess.safeAs()?.name?.endsWith("Jar") == true } } interceptAtPoint(template.routes) { value ->