Wizard: add jvm target setting for JVM configurations

#KT-36180 fixed
This commit is contained in:
Ilya Kirillov
2020-02-10 22:43:52 +03:00
parent fabb0584da
commit fa4d790f5a
26 changed files with 202 additions and 59 deletions
@@ -8,7 +8,11 @@ repositories {
mavenCentral() mavenCentral()
} }
kotlin { kotlin {
jvm() jvm {
compilations.all {
kotlinOptions.jvmTarget = '1.8'
}
}
sourceSets { sourceSets {
jvmMain { jvmMain {
dependencies { dependencies {
@@ -8,7 +8,11 @@ repositories {
mavenCentral() mavenCentral()
} }
kotlin { kotlin {
jvm() jvm {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
}
sourceSets { sourceSets {
val jvmMain by getting { val jvmMain by getting {
dependencies { dependencies {
@@ -6,6 +6,7 @@ kotlin:
name: a name: a
subModules: subModules:
- type: - type:
targetJvmVersion: "1.8"
name: jvmTarget name: jvmTarget
testFramework: JUNIT4 testFramework: JUNIT4
kind: target kind: target
@@ -1,3 +1,5 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.61' id 'org.jetbrains.kotlin.jvm' version '1.3.61'
} }
@@ -10,4 +12,7 @@ repositories {
dependencies { dependencies {
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit' testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
tasks.withType(KotlinCompile) {
kotlinOptions.jvmTarget = '1.6'
} }
@@ -1,3 +1,5 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
kotlin("jvm") version "1.3.61" kotlin("jvm") version "1.3.61"
} }
@@ -10,4 +12,7 @@ repositories {
dependencies { dependencies {
testImplementation(kotlin("test-junit")) testImplementation(kotlin("test-junit"))
implementation(kotlin("stdlib-jdk8")) implementation(kotlin("stdlib-jdk8"))
}
tasks.withType<KotlinCompile>() {
kotlinOptions.jvmTarget = "1.6"
} }
@@ -14,6 +14,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.code.style>official</kotlin.code.style> <kotlin.code.style>official</kotlin.code.style>
<kotlin.compiler.jvmTarget>1.6</kotlin.compiler.jvmTarget>
</properties> </properties>
<repositories> <repositories>
@@ -2,6 +2,7 @@ kotlin:
projectKind: Singleplatform projectKind: Singleplatform
modules: modules:
- type: - type:
targetJvmVersion: "1.6"
name: JVM Module name: JVM Module
testFramework: JUNIT4 testFramework: JUNIT4
name: nya name: nya
@@ -8,7 +8,11 @@ repositories {
mavenCentral() mavenCentral()
} }
kotlin { kotlin {
jvm() jvm {
compilations.all {
kotlinOptions.jvmTarget = '9'
}
}
js('a') { js('a') {
browser { browser {
@@ -8,7 +8,11 @@ repositories {
mavenCentral() mavenCentral()
} }
kotlin { kotlin {
jvm() jvm {
compilations.all {
kotlinOptions.jvmTarget = "9"
}
}
js("a") { js("a") {
browser { browser {
@@ -6,6 +6,7 @@ kotlin:
name: a name: a
subModules: subModules:
- type: - type:
targetJvmVersion: "9"
name: jvmTarget name: jvmTarget
testFramework: JUNIT4 testFramework: JUNIT4
kind: target kind: target
@@ -14,8 +15,8 @@ kotlin:
- type: main - type: main
- type: test - type: test
- type: - type:
name: jsBrowser name: jsBrowser
testFramework: JS testFramework: JS
kind: target kind: target
name: a name: a
sourcesets: sourcesets:
@@ -1,6 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingReference 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 org.jetbrains.kotlin.tools.projectWizard.templates.Template
import java.nio.file.Paths import java.nio.file.Paths
import kotlin.reflect.KClass import kotlin.reflect.KClass
@@ -31,16 +32,17 @@ fun <T : Any> alwaysFailingParser() = object : Parser<T>() {
fun <T : Any> Parser<T>.parse(context: ParsingContext, value: Any?, path: String) = fun <T : Any> Parser<T>.parse(context: ParsingContext, value: Any?, path: String) =
with(context) { parse(value, path) } with(context) { parse(value, path) }
inline fun <reified E : Enum<E>> enumParser(): Parser<E> = object : Parser<E>() { inline fun <reified E> enumParser(): Parser<E> where E : Enum<E>, E : DisplayableSettingItem = object : Parser<E>() {
override fun ParsingContext.parse(value: Any?, path: String): TaskResult<E> = computeM { override fun ParsingContext.parse(value: Any?, path: String): TaskResult<E> = computeM {
val (enumName) = value.parseAs<String>(path) val (name) = value.parseAs<String>(path)
safe { enumValueOf<E>(enumName) }.mapFailure { val createError = {
listOf( ParseError(
ParseError( "For setting `$path` one of [${enumValues<E>().joinToString { it.name }}] was expected but `$name` was found"
"For setting `$path` one of [${enumValues<E>().joinToString { it.name }}] was expected but `$enumName` was found"
)
) )
} }
val byEnumName = safe { enumValueOf<E>(name) }.mapFailure { createError() }
val byText = enumValues<E>().firstOrNull { it.text == name }.toResult { createError() }
byEnumName.recover { byText }
} }
} }
@@ -189,7 +191,7 @@ val pathParser = valueParser { value, path ->
value.parseAs<String>(path).map { Paths.get(it) }.get() value.parseAs<String>(path).map { Paths.get(it) }.get()
} }
infix fun <V: Any> Parser<V>.or(alternative: Parser<V>): Parser<V> = object : Parser<V>() { infix fun <V : Any> Parser<V>.or(alternative: Parser<V>): Parser<V> = object : Parser<V>() {
override fun ParsingContext.parse(value: Any?, path: String): TaskResult<V> = override fun ParsingContext.parse(value: Any?, path: String): TaskResult<V> =
this@or.parse(this, value, path).recover { alternative.parse(this, value, path) } this@or.parse(this, value, path).recover { alternative.parse(this, value, path) }
} }
@@ -111,7 +111,7 @@ fun <T : Any, R : Any> TaskResult<T>.map(f: (T) -> R): TaskResult<R> = when (thi
is Success<T> -> Success(f(value)) is Success<T> -> Success(f(value))
} }
fun <T : Any> TaskResult<T>.mapFailure(f: (List<Error>) -> List<Error>): TaskResult<T> = when (this) { fun <T : Any> TaskResult<T>.mapFailure(f: (List<Error>) -> Error): TaskResult<T> = when (this) {
is Failure -> Failure(f(errors)) is Failure -> Failure(f(errors))
is Success<T> -> this is Success<T> -> this
} }
@@ -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.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR 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.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.ir.buildsystem.maven.PluginRepositoryMavenIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
@@ -83,6 +84,7 @@ data class BuildFileIR(
node("properties") { node("properties") {
singleLineNode("project.build.sourceEncoding") { +"UTF-8" } singleLineNode("project.build.sourceEncoding") { +"UTF-8" }
singleLineNode("kotlin.code.style") { +"official" } singleLineNode("kotlin.code.style") { +"official" }
irsOfType<MavenPropertyIR>().listNl()
} }
distinctRepositories().takeIf { it.isNotEmpty() }?.let { repositories -> distinctRepositories().takeIf { it.isNotEmpty() }?.let { repositories ->
@@ -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.ir.buildsystem.render
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
interface GradleTaskAccessIR : GradleIR { interface GradleTaskAccessIR : GradleIR
val name: String
}
data class GradleByNameTaskAccessIR( data class GradleByNameTaskAccessIR(
override val name: String, val name: String,
val taskClass: String? = null val taskClass: String? = null
) : GradleTaskAccessIR { ) : GradleTaskAccessIR {
override fun GradlePrinter.renderGradle() { 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( data class GradleConfigureTaskIR(
val taskAccess: GradleTaskAccessIR, val taskAccess: GradleTaskAccessIR,
val dependsOn: List<BuildSystemIR> = emptyList(), val dependsOn: List<BuildSystemIR> = emptyList(),
@@ -20,7 +20,7 @@ interface MavenIR : BuildSystemIR {
data class PluginRepositoryMavenIR( data class PluginRepositoryMavenIR(
val repository: Repository val repository: Repository
): MavenIR { ) : MavenIR {
override fun MavenPrinter.renderMaven() { override fun MavenPrinter.renderMaven() {
node("pluginRepository") { node("pluginRepository") {
singleLineNode("id") { +repository.idForMaven } 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 }
}
}
@@ -46,7 +46,10 @@ object AndroidSinglePlatformModuleConfigurator : ModuleConfiguratorWithSettings(
} }
override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module) = override fun ValuesReadingContext.createBuildFileIRs(
configurationData: ModuleConfigurationData,
module: Module
) =
buildList<BuildSystemIR> { buildList<BuildSystemIR> {
+GradleOnlyPluginByNameIR("com.android.application") +GradleOnlyPluginByNameIR("com.android.application")
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
@@ -34,7 +35,10 @@ object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWi
version = configurationData.kotlinVersion version = configurationData.kotlinVersion
) )
override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> = buildList { override fun ValuesReadingContext.createBuildFileIRs(
configurationData: ModuleConfigurationData,
module: Module
): List<BuildSystemIR> = buildList {
+RawGradleIR { +RawGradleIR {
+"kotlin.target.browser { }" +"kotlin.target.browser { }"
} }
@@ -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.ir.buildsystem.StdlibType
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase 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.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.plugins.kotlin.correspondingStdlib
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
@@ -190,7 +189,10 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
val suggestedModuleName: String? get() = null val suggestedModuleName: String? get() = null
val canContainSubModules: Boolean get() = false val canContainSubModules: Boolean get() = false
fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> = fun ValuesReadingContext.createBuildFileIRs(
configurationData: ModuleConfigurationData,
module: Module
): List<BuildSystemIR> =
emptyList() emptyList()
fun ValuesReadingContext.createModuleIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> = fun ValuesReadingContext.createModuleIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> =
@@ -232,19 +234,20 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
val BY_ID = ALL.associateBy(ModuleConfigurator::id) val BY_ID = ALL.associateBy(ModuleConfigurator::id)
val BY_MODULE_KIND = ALL.groupBy(ModuleConfigurator::moduleKind) val BY_MODULE_KIND = ALL.groupBy(ModuleConfigurator::moduleKind)
fun getParser(moduleIdentificator: Identificator): Parser<ModuleConfigurator> = mapParser { map, path -> fun getParser(moduleIdentificator: Identificator): Parser<ModuleConfigurator> =
val (id) = map.parseValue<String>(path, "name") valueParserM { value, path ->
val (configurator) = BY_ID[id].toResult { ConfiguratorNotFoundError(id) } val (id) = value.parseAs<String>(path)
val (settingsWithValues) = configurator.settings.mapComputeM { setting -> BY_ID[id].toResult { ConfiguratorNotFoundError(id) }
val (settingValue) = map[setting.path].toResult { ParseError("No value was found for a key `$path.${setting.path}`") } } or mapParser { map, path ->
val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference } val (id) = map.parseValue<String>(path, "name")
setting.type.parse(this, settingValue, setting.path).map { reference to it } val (configurator) = BY_ID[id].toResult { ConfiguratorNotFoundError(id) }
}.sequence() val (settingsWithValues) = configurator.settings.mapComputeM { setting ->
updateState { it.withSettings(settingsWithValues) } val (settingValue) = map[setting.path].toResult { ParseError("No value was found for a key `$path.${setting.path}`") }
configurator val reference = withSettingsOf(moduleIdentificator, configurator) { setting.reference }
} or valueParserM { value, path -> setting.type.parse(this, settingValue, setting.path).map { reference to it }
val (id) = value.parseAs<String>(path) }.sequence()
BY_ID[id].toResult { ConfiguratorNotFoundError(id) } updateState { it.withSettings(settingsWithValues) }
} configurator
}
} }
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.CreateGradleValueIR 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 val text = "For Current System"
override fun createTargetIrs(module: Module): List<BuildSystemIR> { override fun ValuesReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> {
val moduleName = module.name val moduleName = module.name
val variableName = "${moduleName}Target" val variableName = "${moduleName}Target"
@@ -73,7 +74,10 @@ object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenc
} }
} }
override fun createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> = buildList { override fun ValuesReadingContext.createBuildFileIRs(
configurationData: ModuleConfigurationData,
module: Module
): List<BuildSystemIR> = buildList {
if (configurationData.buildSystemType == BuildSystemType.GradleGroovyDsl) { if (configurationData.buildSystemType == BuildSystemType.GradleGroovyDsl) {
+GradleImportIR("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests") +GradleImportIR("org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithTests")
} }
@@ -1,10 +1,14 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR 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.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR 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.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
@@ -16,8 +20,8 @@ interface TargetConfigurator : ModuleConfiguratorWithModuleType {
fun canCoexistsWith(other: List<TargetConfigurator>): Boolean = true fun canCoexistsWith(other: List<TargetConfigurator>): Boolean = true
fun createTargetIrs(module: Module): List<BuildSystemIR> fun ValuesReadingContext.createTargetIrs(module: Module): List<BuildSystemIR>
fun createInnerTargetIrs(module: Module): List<BuildSystemIR> = emptyList() fun ValuesReadingContext.createInnerTargetIrs(module: Module): List<BuildSystemIR> = emptyList()
} }
abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests(), TargetConfigurator abstract class TargetConfiguratorWithTests : ModuleConfiguratorWithTests(), TargetConfigurator
@@ -36,7 +40,7 @@ interface SimpleTargetConfigurator : TargetConfigurator, SingleCoexistenceTarget
override val suggestedModuleName: String? get() = moduleSubType.name override val suggestedModuleName: String? get() = moduleSubType.name
override fun createTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun ValuesReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
module.createTargetAccessIr(moduleSubType), module.createTargetAccessIr(moduleSubType),
createInnerTargetIrs(module) createInnerTargetIrs(module)
@@ -60,7 +64,7 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
override fun createTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun ValuesReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
module.createTargetAccessIr(ModuleSubType.js), module.createTargetAccessIr(ModuleSubType.js),
buildList { buildList {
@@ -78,7 +82,7 @@ object JsNodeTargetConfigurator : JsTargetConfigurator {
override val suggestedModuleName = "nodeJs" override val suggestedModuleName = "nodeJs"
override fun createTargetIrs(module: Module): List<BuildSystemIR> = buildList { override fun ValuesReadingContext.createTargetIrs(module: Module): List<BuildSystemIR> = buildList {
+DefaultTargetConfigurationIR( +DefaultTargetConfigurationIR(
module.createTargetAccessIr(ModuleSubType.js), module.createTargetAccessIr(ModuleSubType.js),
buildList { buildList {
@@ -96,14 +100,27 @@ object CommonTargetConfigurator : TargetConfiguratorWithTests(), SimpleTargetCon
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON
} }
object JvmTargetConfigurator : TargetConfiguratorWithTests(), object JvmTargetConfigurator : JvmModuleConfigurator(),
TargetConfigurator, TargetConfigurator,
SimpleTargetConfigurator, SimpleTargetConfigurator,
JvmModuleConfigurator,
SingleCoexistenceTargetConfigurator { SingleCoexistenceTargetConfigurator {
override val moduleSubType = ModuleSubType.jvm override val moduleSubType = ModuleSubType.jvm
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4 override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
override fun ValuesReadingContext.createInnerTargetIrs(module: Module): List<BuildSystemIR> = buildList {
val targetVersionValue = withSettingsOf(module) { targetJvmVersion.reference.settingValue.value }
when {
buildSystemType.isGradle -> {
+GradleSectionIR(
"compilations.all",
BodyIR(
GradleAssignmentIR("kotlinOptions.jvmTarget", GradleStringConstIR(targetVersionValue))
)
)
}
}
}
} }
object AndroidTargetConfigurator : TargetConfigurator, object AndroidTargetConfigurator : TargetConfigurator,
@@ -1,13 +1,43 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.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.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.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType 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.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind 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<TargetJvmVersion>("Target JVM Version", GenerationPhase.PROJECT_GENERATION) {
defaultValue = TargetJvmVersion.JVM_1_8
}
override val settings: List<ModuleConfiguratorSetting<*, *>>
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 AndroidModuleConfigurator : ModuleConfigurator
interface ModuleConfiguratorWithModuleType : ModuleConfigurator { interface ModuleConfiguratorWithModuleType : ModuleConfigurator {
@@ -36,9 +66,8 @@ interface SinglePlatformModuleConfigurator : ModuleConfigurator {
override val moduleKind get() = ModuleKind.singleplatformJvm override val moduleKind get() = ModuleKind.singleplatformJvm
} }
object JvmSinglePlatformModuleConfigurator : ModuleConfiguratorWithTests(), object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator(),
SinglePlatformModuleConfigurator, SinglePlatformModuleConfigurator,
JvmModuleConfigurator,
ModuleConfiguratorWithModuleType { ModuleConfiguratorWithModuleType {
override val moduleType get() = ModuleType.jvm override val moduleType get() = ModuleType.jvm
override val suggestedModuleName = "jvm" override val suggestedModuleName = "jvm"
@@ -53,6 +82,27 @@ object JvmSinglePlatformModuleConfigurator : ModuleConfiguratorWithTests(),
KotlinBuildSystemPluginIR.Type.jvm, KotlinBuildSystemPluginIR.Type.jvm,
version = configurationData.kotlinVersion version = configurationData.kotlinVersion
) )
override fun ValuesReadingContext.createBuildFileIRs(configurationData: ModuleConfigurationData, module: Module): List<BuildSystemIR> =
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)
}
}
}
} }
@@ -156,7 +156,7 @@ class ModulesToIRsConverter(
val modulePath = calculatePathForModule(module, state.parentPath) val modulePath = calculatePathForModule(module, state.parentPath)
taskRunningContext.mutateProjectStructureByModuleConfigurator(module, modulePath) taskRunningContext.mutateProjectStructureByModuleConfigurator(module, modulePath)
val targetIrs = module.subModules.flatMap { subModule -> 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 -> val targetModuleIrs = module.subModules.map { target ->
@@ -223,7 +223,7 @@ class ModulesToIRsConverter(
runArbitraryTask(data, module, modulePath) runArbitraryTask(data, module, modulePath)
} }
private fun createBuildFileIRs( private fun ValuesReadingContext.createBuildFileIRs(
module: Module, module: Module,
state: ModulesToIrsState state: ModulesToIrsState
) = buildList<BuildSystemIR> { ) = buildList<BuildSystemIR> {
@@ -239,7 +239,7 @@ class ModulesToIRsConverter(
} }
} }
addIfNotNull(kotlinPlugin) addIfNotNull(kotlinPlugin)
+module.configurator.createBuildFileIRs(data, module) +with(module.configurator) { createBuildFileIRs(data, module) }
} }
private fun SourcesetDependency.toIR(type: DependencyType): DependencyIR = with(data) { private fun SourcesetDependency.toIR(type: DependencyType): DependencyIR = with(data) {
@@ -10,11 +10,14 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.templates.Template import org.jetbrains.kotlin.tools.projectWizard.templates.Template
@Suppress("EnumEntryName") @Suppress("EnumEntryName")
enum class ModuleKind { enum class ModuleKind : DisplayableSettingItem {
multiplatform, multiplatform,
target, target,
singleplatformJvm, singleplatformJvm,
singleplatformJs, singleplatformJs, ;
override val text: String
get() = name
} }
// TODO separate to classes // TODO separate to classes
@@ -59,9 +59,12 @@ class Sourceset(
} }
@Suppress("EnumEntryName") @Suppress("EnumEntryName")
enum class SourcesetType { enum class SourcesetType: DisplayableSettingItem {
main, test; main, test;
override val text: String
get() = name
companion object { companion object {
val ALL = values().toSet() val ALL = values().toSet()
} }
@@ -34,7 +34,7 @@ class Version private constructor(internal val mavenVersion: ArtifactVersion) :
val parser: Parser<Version> = valueParser { value, path -> val parser: Parser<Version> = valueParser { value, path ->
val (stringVersion) = value.parseAs<String>(path) val (stringVersion) = value.parseAs<String>(path)
safe { fromString(stringVersion) }.mapFailure { safe { fromString(stringVersion) }.mapFailure {
listOf(ParseError("Bad version format for setting `$path`")) ParseError("Bad version format for setting `$path`")
}.get() }.get()
} }
} }
@@ -112,7 +112,7 @@ class SimpleJsClientTemplate : Template() {
+interceptTemplate(KtorServerTemplate()) { +interceptTemplate(KtorServerTemplate()) {
applicableIf { buildFileIR -> applicableIf { buildFileIR ->
val tasks = buildFileIR.irsOfTypeOrNull<GradleConfigureTaskIR>() ?: return@applicableIf false val tasks = buildFileIR.irsOfTypeOrNull<GradleConfigureTaskIR>() ?: return@applicableIf false
tasks.none { it.taskAccess.name.endsWith("Jar") } tasks.none { it.taskAccess.safeAs<GradleByNameTaskAccessIR>()?.name?.endsWith("Jar") == true }
} }
interceptAtPoint(template.routes) { value -> interceptAtPoint(template.routes) { value ->