Wizard: move core module UI texts to bundles

This commit is contained in:
Ilya Kirillov
2020-03-25 16:02:17 +03:00
parent 80bae578bf
commit 9fc1220b99
58 changed files with 616 additions and 257 deletions
@@ -1,5 +0,0 @@
module.kind.android.module=Android Module
module.kind.js.module=JS Module
module.kind.module=Module
module.kind.mpp.module=MPP Module
module.kind.target=Target
@@ -11,6 +11,7 @@ module.dependencies.module.dependencies=Module dependencies
module.dependencies.add.module.dependency=Add module dependency module.dependencies.add.module.dependency=Add module dependency
module.dependencies.remove.module.dependency=Remove module dependency module.dependencies.remove.module.dependency=Remove module dependency
editor.modules.add=Add {0}
editor.modules.remove.selected.module=Do you want to remove selected {0} editor.modules.remove.selected.module=Do you want to remove selected {0}
editor.modules.remove.selected.submodules=This will also remove all submodules. editor.modules.remove.selected.submodules=This will also remove all submodules.
editor.modules.remove.selected.no.undone=This action cannot be undone. editor.modules.remove.selected.no.undone=This action cannot be undone.
@@ -21,7 +22,7 @@ editor.modules.remove.tooltip=Remove {0}
editor.modules.project=Project editor.modules.project=Project
editor.modules.add.module=Add a module to the project editor.modules.add.module=Add a module to the project
editor.modules.no.modules=No modules created editor.modules.no.modules=No modules created
module.settings.name=Name module.settings.name=Name
module.settings.name.same.as.project=[The same as the project name] module.settings.name.same.as.project=[The same as the project name]
@@ -5,13 +5,12 @@ import com.intellij.openapi.ui.popup.ListPopup
import com.intellij.openapi.ui.popup.PopupStep import com.intellij.openapi.ui.popup.PopupStep
import com.intellij.openapi.ui.popup.util.BaseListPopupStep import com.intellij.openapi.ui.popup.util.BaseListPopupStep
import com.intellij.ui.popup.PopupFactoryImpl import com.intellij.ui.popup.PopupFactoryImpl
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem 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.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardUIBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.fullTextHtml import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.fullTextHtml
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.icon import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.icon
import javax.swing.Icon import javax.swing.Icon
@@ -4,6 +4,7 @@ import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.ActionToolbarPosition import com.intellij.openapi.actionSystem.ActionToolbarPosition
import com.intellij.openapi.ui.Messages import com.intellij.openapi.ui.Messages
import com.intellij.ui.ToolbarDecorator import com.intellij.ui.ToolbarDecorator
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.IOSSinglePlatformModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.IOSSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsSingleplatformModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsSingleplatformModuleConfigurator
@@ -12,7 +13,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
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.settings.buildsystem.Sourceset import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardUIBundle import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardUIBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.createPanelWithPopupHandler import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.createPanelWithPopupHandler
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -58,7 +58,7 @@ class ModulesEditorToolbarDecorator(
null -> true null -> true
else -> false else -> false
} }
text = "Add" + " " + when (tree.selectedSettingItem?.safeAs<Module>()?.kind) { val moduleKindTextToAdd = when (tree.selectedSettingItem?.safeAs<Module>()?.kind) {
ModuleKind.multiplatform -> KotlinNewProjectWizardBundle.message("module.kind.target") ModuleKind.multiplatform -> KotlinNewProjectWizardBundle.message("module.kind.target")
ModuleKind.singleplatformJvm -> KotlinNewProjectWizardBundle.message("module.kind.module") ModuleKind.singleplatformJvm -> KotlinNewProjectWizardBundle.message("module.kind.module")
ModuleKind.singleplatformJs -> KotlinNewProjectWizardBundle.message("module.kind.js.module") ModuleKind.singleplatformJs -> KotlinNewProjectWizardBundle.message("module.kind.js.module")
@@ -66,9 +66,12 @@ class ModulesEditorToolbarDecorator(
ModuleKind.target -> "" ModuleKind.target -> ""
null -> "" null -> ""
} }
text = KotlinNewProjectWizardUIBundle.message("editor.modules.add", moduleKindTextToAdd)
} }
event.presentation.isEnabled event.presentation.isEnabled
} }
setRemoveAction { setRemoveAction {
val moduleKindText = selectedModuleKindText ?: KotlinNewProjectWizardBundle.message("module.kind.module") val moduleKindText = selectedModuleKindText ?: KotlinNewProjectWizardBundle.message("module.kind.module")
if (Messages.showOkCancelDialog( if (Messages.showOkCancelDialog(
@@ -8,7 +8,7 @@ dependencies {
compileOnly(project(":kotlin-reflect-api")) compileOnly(project(":kotlin-reflect-api"))
//needed only for message bundles //needed only for message bundles
implementation(intellijCoreDep()) implementation(intellijDep()) { includeJars("util") }
testImplementation(project(":kotlin-test:kotlin-test-junit")) testImplementation(project(":kotlin-test:kotlin-test-junit"))
testImplementation(commonDep("junit:junit")) testImplementation(commonDep("junit:junit"))
@@ -0,0 +1,148 @@
buildsystem.type.gradle.groovy=Gradle Groovy
buildsystem.type.gradle.kotlin=Gradle Kotlin
buildsystem.type.intellij=IntelliJ
buildsystem.type.maven=Maven
error.template.not.found=Template with an id {0} is not found
error.required.settings.are.not.present=The following required settings is not present
error.configurator.not.found=Module type {0} was not found
error.invalid.module.dependency=Invalid module dependency from module {0} to {1}
module.configuration.group.android.native=Android Native
module.configuration.group.ios=iOS
module.configuration.group.linux=Linux
module.configuration.group.macos=macOS
module.configuration.group.windows.mingw=Windows (MinGW)
module.kind.android.module=Android Module
module.kind.ios.module=iOS Module
module.kind.js.module=JS Module
module.kind.module=Module
module.kind.mpp.module=MPP Module
module.kind.target=Target
plugin.buildsystem.setting.type=Build System
plugin.buildsystem.setting.type.error.wrong.project.kind={0} cannot be generated using {1}
plugin.kotlin.downloading.kotlin.versions=Downloading list of Kotlin versions
plugin.kotlin.setting.modules=Modules
plugin.kotlin.setting.modules.error.duplicated.modules=There are {0} modules with name {1}
plugin.kotlin.setting.modules.error.duplicated.targets=There are {0} targets with name {1}
plugin.kotlin.setting.project.kind=Project Kind
project.kind.android=Android project
project.kind.kotlin.js=Kotlin/JS project
project.kind.multiplatform=Multiplatform project
project.kind.singleplatform=Singleplatform project
project=Project
plugin.structure.setting.location=Location
plugin.structure.setting.name=Name
plugin.structure.setting.group.id=Group ID
plugin.structure.setting.artifact.id=Artifact ID
plugin.structure.setting.version=Version
plugin.android.setting.sdk=Android SDK
validation.should.not.be.blank={0} should not be blank
validation.identifier={0} should consist only of letters, digits{1}
validation.identifier.additional.symbols=", and symbols: {0}
validation.file.should.exists=File for {0} should exists
version.error.bad.format=Bad version format for setting {0}
parse.error.no.value.for.key=No value was found for a key {0}
module.type.jvm=Kotlin/JVM
module.type.js=Kotlin/JS
module.type.common=Common
module.type.android=Android
module.type.native=Kotlin/Native
module.type.ios=iOS
module.name=Module name
module.name.with.name=Module name {0}
module.configurator.js=JS for Browser
module.configurator.android=Android
module.configurator.android.setting.android.plugin=Android Plugin
module.configurator.android.setting.android.plugin.application=Android Application
module.configurator.android.setting.android.plugin.library=Android
module.configurator.common=Common
module.configurator.jvm=JVM
module.configurator.jvm.setting.target.jvm.version=Target JVM Version
module.configurator.jvm.setting.java.support=Java language support
module.configurator.mpp=Multiplatform
module.configurator.ios=IOS
module.configurator.ios.requires.xcode=Requires Xcode
module.configurator.js.browser=Browser
module.configurator.js.node=Node.js
module.configurator.tests.setting.framework=Test Framework
module.configurator.tests.setting.framework.junit4=JUnit 4
module.configurator.tests.setting.framework.junit5=JUnit 5
module.configurator.tests.setting.framework.test.ng=Test NG
module.configurator.tests.setting.framework.js=JavaScript
module.configurator.tests.setting.framework.common=common
module.configurator.native.for.current.system=Your system
project.template.empty.singleplatform.title=Backend Application
project.template.empty.singleplatform.description=Create a backend application with Kotlin/JVM.
project.template.empty.mpp.title=Multiplatform Application
project.template.empty.mpp.description=Create applications for different platforms that support sharing common code.
project.template.empty.jvm.console.title=Console Application
project.template.empty.jvm.console.description=Create a console application with Kotlin/JVM. Use it for prototyping or testing purposes.
project.template.mpp.lib.title=Multiplatform Library
project.template.mpp.lib.description=Create a library for sharing common code among different platforms.
project.template.full.stack.title=Full-Stack Web Application
project.template.full.stack.description=Create a fully-functional web application using Kotlin/JS for the frontend and Kotlin/JVM for the backend.
project.template.native.console.title=Native Application
project.template.native.console.description=Create an application with Kotlin/Native that works as a standalone application under a specific platform.
project.template.frontend.title=Frontend Application
project.template.frontend.description=Create a frontend application with Kotlin/JS if you already have a backend.
project.template.mpp.mobile.title=Multiplatform Mobile Application
project.template.mpp.mobile.description=Create mobile applications for iOS and Android with Kotlin Multiplatform Mobile, which supports sharing common code between platforms.
project.template.mpp.mobile.lib.title=Multiplatform Mobile Library
project.template.mpp.mobile.lib.description=Create a library that supports sharing code between iOS and Android.
module.template.console.jvm.title=Console Application
module.template.console.jvm.description=Simple "Hello World!" Kotlin/JVM application that works in the console
module.template.ktor.server.title=Ktor Server
module.template.ktor.server.description=Configurable Ktor web server for building web applications
module.template.ktor.server.setting.engine=Ktor Server Engine
module.template.ktor.server.setting.engine.netty=Netty
module.template.ktor.server.setting.engine.tomcat=Tomcat
module.template.ktor.server.setting.engine.jetty=Jetty
module.template.native.console.title=Native Application
module.template.native.console.description=Simple Kotlin/Native application for your operating system
module.template.js.simple.title=Frontend Application
module.template.js.simple.description=Configurable Kotlin/JS frontend application
module.template.js.simple.run.configuration.dev=BrowserDevelopmentRun in continuous mode
module.template.js.simple.run.configuration.prod=BrowserProductionRun in continuous mode
module.template.js.simple.setting.rendering.engine=Rendering engine
module.template.js.simple.setting.rendering.kotlinx.html=Use statically typed Kotlinx.html DSL
module.template.js.simple.setting.rendering.react=Use Kotlin-wrapped React library
module.template.js.simple.setting.rendering.react.styled=Use Kotlin-wrapped React framework together with Styled Components
@@ -5,12 +5,16 @@
package org.jetbrains.kotlin.tools.projectWizard package org.jetbrains.kotlin.tools.projectWizard
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
interface WizardRunConfiguration { interface WizardRunConfiguration {
@get:Nls
val configurationName: String val configurationName: String
} }
data class WizardGradleRunConfiguration( data class WizardGradleRunConfiguration(
override val configurationName: String, @Nls override val configurationName: String,
val taskName: String, @NonNls val taskName: String,
val parameters: List<String> val parameters: List<String>
) : WizardRunConfiguration ) : WizardRunConfiguration
@@ -3,16 +3,16 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.tools.projectWizard.wizard package org.jetbrains.kotlin.tools.projectWizard
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.annotations.PropertyKey import org.jetbrains.annotations.PropertyKey
import org.jetbrains.kotlin.util.AbstractKotlinBundle import com.intellij.AbstractBundle
@NonNls @NonNls
private const val BUNDLE = "messages.KotlinNewProjectWizardBundle" private const val BUNDLE = "messages.KotlinNewProjectWizardBundle"
object KotlinNewProjectWizardBundle : AbstractKotlinBundle(BUNDLE) { object KotlinNewProjectWizardBundle : AbstractBundle(BUNDLE) {
@JvmStatic @JvmStatic
fun message(@NonNls @PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any): String = getMessage(key, *params) fun message(@NonNls @PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any): String = getMessage(key, *params)
} }
@@ -1,6 +1,9 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.annotations.NonNls
interface EntitiesOwnerDescriptor { interface EntitiesOwnerDescriptor {
@get:NonNls
val id: String val id: String
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.templates.Template import org.jetbrains.kotlin.tools.projectWizard.templates.Template
@@ -22,7 +23,7 @@ fun ParsingState.withSettings(newSettings: List<Pair<SettingReference<*, *>, Any
typealias ParsingContext = ComputeContext<ParsingState> typealias ParsingContext = ComputeContext<ParsingState>
abstract class Parser<out T : Any> { abstract class Parser<out T : Any> {
abstract fun ParsingContext.parse(value: Any?, path: String): TaskResult<T> abstract fun ParsingContext.parse(value: Any?, @NonNls path: String): TaskResult<T>
} }
fun <T : Any> alwaysFailingParser(errorMessage: String) = object : Parser<T>() { fun <T : Any> alwaysFailingParser(errorMessage: String) = object : Parser<T>() {
@@ -33,7 +34,7 @@ fun <T : Any> alwaysFailingParser(errorMessage: String) = 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?, @NonNls path: String) =
with(context) { parse(value, path) } with(context) { parse(value, path) }
inline fun <reified E> enumParser(): Parser<E> where E : Enum<E>, E : DisplayableSettingItem = object : Parser<E>() { inline fun <reified E> enumParser(): Parser<E> where E : Enum<E>, E : DisplayableSettingItem = object : Parser<E>() {
@@ -90,31 +91,31 @@ inline fun <reified T : Any> valueParser() = valueParser { value, path ->
value.parseAs(path, T::class).get() value.parseAs(path, T::class).get()
} }
fun Any?.classMismatchError(path: String, expected: KClass<*>): ParseError { fun Any?.classMismatchError(@NonNls path: String, expected: KClass<*>): ParseError {
val classpath = this?.let { it::class.simpleName } ?: "null" val classpath = this?.let { it::class.simpleName } ?: "null"
return ParseError("Expected ${expected.simpleName!!} for `$path` but $classpath was found") return ParseError("Expected ${expected.simpleName!!} for `$path` but $classpath was found")
} }
inline fun <reified V : Any> Any?.parseAs(path: String) = inline fun <reified V : Any> Any?.parseAs(@NonNls path: String) =
safeAs<V>().toResult { classMismatchError(path, V::class) } safeAs<V>().toResult { classMismatchError(path, V::class) }
inline fun <reified T : Any> Any?.parseAs(path: String, klass: KClass<T>): TaskResult<T> = inline fun <reified T : Any> Any?.parseAs(@NonNls path: String, klass: KClass<T>): TaskResult<T> =
this?.takeIf { it::class.isSubclassOf(klass) }?.safeAs<T>() this?.takeIf { it::class.isSubclassOf(klass) }?.safeAs<T>()
.toResult { classMismatchError(path, klass) } .toResult { classMismatchError(path, klass) }
inline fun <reified V : Any> Map<*, *>.parseValue(path: String, name: String) = inline fun <reified V : Any> Map<*, *>.parseValue(@NonNls path: String, @NonNls name: String) =
get(name).parseAs<V>("$path.$name") get(name).parseAs<V>("$path.$name")
inline fun <reified V : Any> Map<*, *>.parseValue(path: String, name: String, defaultValue: (() -> V)) = inline fun <reified V : Any> Map<*, *>.parseValue(@NonNls path: String, @NonNls name: String, defaultValue: (() -> V)) =
get(name)?.parseAs<V>("$path.$name") ?: defaultValue().asSuccess() get(name)?.parseAs<V>("$path.$name") ?: defaultValue().asSuccess()
inline fun <reified V : Any, R : Any> Map<*, *>.parseValue( inline fun <reified V : Any, R : Any> Map<*, *>.parseValue(
context: ParsingContext, context: ParsingContext,
path: String, @NonNls path: String,
name: String, @NonNls name: String,
crossinline parser: suspend ParsingContext.(V) -> TaskResult<R> crossinline parser: suspend ParsingContext.(V) -> TaskResult<R>
) = with(context) { ) = with(context) {
computeM { computeM {
@@ -124,16 +125,16 @@ inline fun <reified V : Any, R : Any> Map<*, *>.parseValue(
} }
inline fun <reified T : Any> Map<*, *>.parseValue( inline fun <reified T : Any> Map<*, *>.parseValue(
path: String, @NonNls path: String,
name: String, @NonNls name: String,
klass: KClass<T> klass: KClass<T>
) = get(path).parseAs("$path.$name", klass) ) = get(path).parseAs("$path.$name", klass)
fun <R : Any> Map<*, *>.parseValue( fun <R : Any> Map<*, *>.parseValue(
context: ParsingContext, context: ParsingContext,
path: String, @NonNls path: String,
name: String, @NonNls name: String,
parser: Parser<R>, parser: Parser<R>,
defaultValue: (() -> R)? = null defaultValue: (() -> R)? = null
) = with(context) { ) = with(context) {
@@ -147,7 +148,7 @@ fun <R : Any> Map<*, *>.parseValue(
inline fun <reified V : Any, R : Any> Any?.parseAs( inline fun <reified V : Any, R : Any> Any?.parseAs(
context: ParsingContext, context: ParsingContext,
path: String, @NonNls path: String,
crossinline parser: suspend ParsingContext.(V) -> TaskResult<R> crossinline parser: suspend ParsingContext.(V) -> TaskResult<R>
) = with(context) { ) = with(context) {
computeM { computeM {
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.annotations.Nls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.Failure import org.jetbrains.kotlin.tools.projectWizard.core.Failure
import org.jetbrains.kotlin.tools.projectWizard.core.Reader import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
@@ -25,7 +27,9 @@ fun <V> inValidatorContext(validator: Reader.(V) -> SettingValidator<V>) =
object StringValidators { object StringValidators {
fun shouldNotBeBlank(name: String) = settingValidator { value: String -> fun shouldNotBeBlank(name: String) = settingValidator { value: String ->
if (value.isBlank()) ValidationResult.ValidationError("${name.capitalize()} should not be blank ") if (value.isBlank()) ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message("validation.should.not.be.blank", name.capitalize())
)
else ValidationResult.OK else ValidationResult.OK
} }
@@ -34,10 +38,10 @@ object StringValidators {
val allowedExtraSymbolsStringified = allowedExtraSymbols val allowedExtraSymbolsStringified = allowedExtraSymbols
.takeIf { it.isNotEmpty() } .takeIf { it.isNotEmpty() }
?.joinToString(separator = ", ") { char -> "'$char'" } ?.joinToString(separator = ", ") { char -> "'$char'" }
?.let { chars -> ", and symbols: $chars" } ?.let { chars -> KotlinNewProjectWizardBundle.message("validation.identifier.additional.symbols", chars) }
.orEmpty() .orEmpty()
ValidationResult.ValidationError( ValidationResult.ValidationError(
"${name.capitalize()} should consist only of letters, digits$allowedExtraSymbolsStringified" KotlinNewProjectWizardBundle.message("validation.identifier", name.capitalize(), allowedExtraSymbolsStringified)
) )
} else ValidationResult.OK } else ValidationResult.OK
} }
@@ -54,7 +58,7 @@ sealed class ValidationResult {
} }
data class ValidationError(val messages: List<String>, val target: Any? = null) : ValidationResult() { data class ValidationError(val messages: List<String>, val target: Any? = null) : ValidationResult() {
constructor(message: String, target: Any? = null) : this(listOf(message), target) constructor(@Nls message: String, target: Any? = null) : this(listOf(message), target)
override val isOk = false override val isOk = false
} }
@@ -66,7 +70,7 @@ sealed class ValidationResult {
} }
companion object { companion object {
fun create(condition: Boolean, message: String) = fun create(condition: Boolean, @Nls message: String) =
if (condition) OK else ValidationError(message) if (condition) OK else ValidationError(message)
inline fun create(condition: Boolean, message: () -> String) = inline fun create(condition: Boolean, message: () -> String) =
@@ -1,6 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.annotations.Nls
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import kotlin.reflect.KProperty1 import kotlin.reflect.KProperty1
@@ -47,6 +48,7 @@ data class PipelineTask(
var isAvailable: Checker = ALWAYS_AVAILABLE_CHECKER var isAvailable: Checker = ALWAYS_AVAILABLE_CHECKER
@Nls
var title: String? = null var title: String? = null
fun withAction(action: Writer.() -> TaskResult<Unit>) { fun withAction(action: Writer.() -> TaskResult<Unit>) {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.Reader import org.jetbrains.kotlin.tools.projectWizard.core.Reader
@@ -18,6 +19,7 @@ import kotlin.reflect.KProperty1
sealed class SettingReference<out V : Any, out T : SettingType<V>> { sealed class SettingReference<out V : Any, out T : SettingType<V>> {
@get:NonNls
abstract val path: String abstract val path: String
abstract val type: KClass<out T> abstract val type: KClass<out T>
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
@@ -198,7 +199,12 @@ object PathSettingType : SettingType<Path>() {
init { init {
validate { pathValue -> validate { pathValue ->
if (pathValue.toString().isBlank()) if (pathValue.toString().isBlank())
ValidationResult.ValidationError("${title.capitalize()} should not be blank") ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message(
"validation.should.not.be.blank",
title.capitalize()
)
)
else ValidationResult.OK else ValidationResult.OK
} }
} }
@@ -206,7 +212,9 @@ object PathSettingType : SettingType<Path>() {
fun shouldExists() = validate { pathValue -> fun shouldExists() = validate { pathValue ->
if (isUnitTestMode) return@validate ValidationResult.OK if (isUnitTestMode) return@validate ValidationResult.OK
if (!Files.exists(pathValue)) if (!Files.exists(pathValue))
ValidationResult.ValidationError("File for ${title.capitalize()} should exists") ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message("validation.file.should.exists", title.capitalize())
)
else ValidationResult.OK else ValidationResult.OK
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
fun ParsingContext.parseSettingsMap( fun ParsingContext.parseSettingsMap(
@@ -18,7 +19,7 @@ fun ParsingContext.parseSettingsMap(
setting.type.parse(this, settingValue, setting.path).map { listOf(settingReference to it) } setting.type.parse(this, settingValue, setting.path).map { listOf(settingReference to it) }
} }
setting.isRequired -> { setting.isRequired -> {
fail(ParseError("No value was found for a key `$path.${setting.path}`")) fail(ParseError(KotlinNewProjectWizardBundle.message("parse.error.no.value.for.key", "$path.${setting.path}")))
} }
else -> success(emptyList()) else -> success(emptyList())
} }
@@ -1,9 +1,13 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import java.io.IOException import java.io.IOException
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
abstract class Error { abstract class Error {
@get:Nls
abstract val message: String abstract val message: String
} }
@@ -24,31 +28,32 @@ data class IOError(override val exception: IOException) : ExceptionError()
data class ExceptionErrorImpl(override val exception: Exception) : ExceptionError() data class ExceptionErrorImpl(override val exception: Exception) : ExceptionError()
data class ParseError(override val message: String) : Error() data class ParseError(@Nls override val message: String) : Error()
data class TemplateNotFoundError(val id: String) : Error() { data class TemplateNotFoundError(val id: String) : Error() {
override val message: String override val message: String
get() = "Template with an id `$id` is not found" get() = KotlinNewProjectWizardBundle.message("error.template.not.found", id)
} }
data class RequiredSettingsIsNotPresentError(val settingNames: List<String>) : Error() { data class RequiredSettingsIsNotPresentError(val settingNames: List<String>) : Error() {
override val message: String override val message: String
get() = buildString { get() = buildString {
append("The following required settings is not present: \n") append(KotlinNewProjectWizardBundle.message("error.required.settings.are.not.present") + '\n')
settingNames.joinTo(this, "\n") { " $it" } settingNames.joinTo(this, "\n") { " $it" }
} }
} }
data class CircularTaskDependencyError(val taskName: String) : Error() { data class CircularTaskDependencyError(@NonNls val taskName: String) : Error() {
@get:NonNls
override val message: String override val message: String
get() = "$taskName task has circular dependencies" get() = "$taskName task has circular dependencies"
} }
data class BadSettingValueError(override val message: String) : Error() data class BadSettingValueError(@Nls override val message: String) : Error()
data class ConfiguratorNotFoundError(val id: String) : Error() { data class ConfiguratorNotFoundError(val id: String) : Error() {
override val message: String override val message: String
get() = "Module type `$id` was not found" get() = KotlinNewProjectWizardBundle.message("error.configurator.not.found", id)
} }
data class ValidationError(val validationMessage: String) : Error() { data class ValidationError(val validationMessage: String) : Error() {
@@ -56,9 +61,9 @@ data class ValidationError(val validationMessage: String) : Error() {
get() = validationMessage.capitalize() get() = validationMessage.capitalize()
} }
data class ProjectImportingError(override val message: String) : Error() data class ProjectImportingError(@Nls override val message: String) : Error()
data class InvalidModuleDependencyError(val from: Module, val to: Module, val reason: String? = null) : Error() { data class InvalidModuleDependencyError(val from: Module, val to: Module, @Nls val reason: String? = null) : Error() {
override val message: String override val message: String
get() = "Invalid module dependency from module ${from.name} to ${to.name}" + reason?.let { ": $it" } get() = KotlinNewProjectWizardBundle.message("error.invalid.module.dependency", from.name, to.name) + reason?.let { ": $it" }
} }
@@ -1,6 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core package org.jetbrains.kotlin.tools.projectWizard.core
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.annotations.NonNls
import java.io.IOException import java.io.IOException
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
@@ -26,19 +27,19 @@ inline infix fun <A : Any> ((A) -> A?).andThenNullable(crossinline then: (A) ->
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun <T> idFunction(): (T) -> T = { it } inline fun <T> idFunction(): (T) -> T = { it }
operator fun Path.div(other: String): Path = operator fun Path.div(@NonNls other: String): Path =
resolve(other) resolve(other)
operator fun Path.div(other: Path): Path = operator fun Path.div(other: Path): Path =
resolve(other.toString()) resolve(other.toString())
operator fun String.div(other: Path): Path = operator fun @receiver:NonNls String.div(other: Path): Path =
Paths.get(this).resolve(other) Paths.get(this).resolve(other)
operator fun String.div(other: String): Path = operator fun @receiver:NonNls String.div(@NonNls other: String): Path =
Paths.get(this).resolve(other) Paths.get(this).resolve(other)
fun String.asPath(): Path = Paths.get(this) fun @receiver:NonNls String.asPath(): Path = Paths.get(this)
fun <T : Any> safe(operation: () -> T): TaskResult<T> = fun <T : Any> safe(operation: () -> T): TaskResult<T> =
try { try {
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.core.ignore import org.jetbrains.kotlin.tools.projectWizard.core.ignore
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
@@ -30,7 +31,7 @@ data class ApplicationPluginIR(val mainClass: String) : DefaultBuildSystemPlugin
} }
} }
data class GradleOnlyPluginByNameIR(val pluginId: String) : BuildSystemPluginIR, GradleIR { data class GradleOnlyPluginByNameIR(@NonNls val pluginId: String) : BuildSystemPluginIR, GradleIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
call("id") { +pluginId.quotified } call("id") { +pluginId.quotified }
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import org.jetbrains.annotations.NonNls
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.FreeIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
@@ -22,7 +23,7 @@ data class RawGradleIR(
override fun GradlePrinter.renderGradle() = renderer() override fun GradlePrinter.renderGradle() = renderer()
} }
fun rawIR(ir: String) = RawGradleIR { +ir } fun rawIR(@NonNls ir: String) = RawGradleIR { +ir }
fun rawIR(ir: GradlePrinter.() -> String) = RawGradleIR { +ir() } fun rawIR(ir: GradlePrinter.() -> String) = RawGradleIR { +ir() }
fun MutableList<BuildSystemIR>.addRawIR(ir: GradlePrinter.() -> String) { fun MutableList<BuildSystemIR>.addRawIR(ir: GradlePrinter.() -> String) {
@@ -30,7 +31,7 @@ fun MutableList<BuildSystemIR>.addRawIR(ir: GradlePrinter.() -> String) {
} }
class CreateGradleValueIR(val name: String, val body: GradleIR) : GradleIR { class CreateGradleValueIR(@NonNls val name: String, val body: GradleIR) : GradleIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
when (dsl) { when (dsl) {
GradlePrinter.GradleDsl.KOTLIN -> { GradlePrinter.GradleDsl.KOTLIN -> {
@@ -51,7 +52,7 @@ class CreateGradleValueIR(val name: String, val body: GradleIR) : GradleIR {
} }
data class GradleCallIr( data class GradleCallIr(
val name: String, @NonNls val name: String,
val parameters: List<BuildSystemIR> = emptyList(), val parameters: List<BuildSystemIR> = emptyList(),
val isConstructorCall: Boolean = false, val isConstructorCall: Boolean = false,
) : GradleIR { ) : GradleIR {
@@ -70,7 +71,7 @@ data class GradleCallIr(
} }
data class GradleNewInstanceCall( data class GradleNewInstanceCall(
val name: String, @NonNls val name: String,
val parameters: List<BuildSystemIR> = emptyList() val parameters: List<BuildSystemIR> = emptyList()
) : GradleIR { ) : GradleIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
@@ -85,7 +86,7 @@ data class GradleNewInstanceCall(
data class GradleSectionIR( data class GradleSectionIR(
val name: String, @NonNls val name: String,
val body: BodyIR val body: BodyIR
) : GradleIR, FreeIR { ) : GradleIR, FreeIR {
constructor(name: String, bodyBuilder: MutableList<BuildSystemIR>.() -> Unit) : this( constructor(name: String, bodyBuilder: MutableList<BuildSystemIR>.() -> Unit) : this(
@@ -101,7 +102,7 @@ data class GradleSectionIR(
} }
data class GradleAssignmentIR( data class GradleAssignmentIR(
val target: String, @NonNls val target: String,
val assignee: BuildSystemIR val assignee: BuildSystemIR
) : GradleIR, FreeIR { ) : GradleIR, FreeIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
@@ -111,7 +112,7 @@ data class GradleAssignmentIR(
} }
data class GradleStringConstIR( data class GradleStringConstIR(
val text: String @NonNls val text: String
) : GradleIR { ) : GradleIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
+text.quotified +text.quotified
@@ -119,9 +120,9 @@ data class GradleStringConstIR(
} }
data class CompilationAccessIr( data class CompilationAccessIr(
val targetName: String, @NonNls val targetName: String,
val compilationName: String, @NonNls val compilationName: String,
val property: String? @NonNls val property: String?
) : GradleIR { ) : GradleIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
when (dsl) { when (dsl) {
@@ -132,7 +133,7 @@ data class CompilationAccessIr(
} }
} }
data class GradleDynamicPropertyAccessIR(val qualifier: BuildSystemIR, val propertyName: String) : GradleIR { data class GradleDynamicPropertyAccessIR(val qualifier: BuildSystemIR, @NonNls val propertyName: String) : GradleIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
qualifier.render(this) qualifier.render(this)
when (dsl) { when (dsl) {
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import org.jetbrains.annotations.NonNls
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.FreeIR 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
@@ -26,7 +27,7 @@ data class GradleByNameTaskAccessIR(
} }
data class GradleByClassTasksAccessIR( data class GradleByClassTasksAccessIR(
val taskClass: String @NonNls val taskClass: String
) : GradleTaskAccessIR { ) : GradleTaskAccessIR {
override fun GradlePrinter.renderGradle() { override fun GradlePrinter.renderGradle() {
when (dsl) { when (dsl) {
@@ -6,11 +6,12 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.PersistentList
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
data class SettingsGradleFileIR( data class SettingsGradleFileIR(
val projectName: String, @NonNls val projectName: String,
val subProjects: List<String>, val subProjects: List<String>,
override val irs: PersistentList<BuildSystemIR> override val irs: PersistentList<BuildSystemIR>
) : FileIR, GradleIR { ) : FileIR, GradleIR {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven
import org.jetbrains.annotations.NonNls
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.RepositoryWrapper import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryWrapper
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
@@ -31,8 +32,8 @@ data class PluginRepositoryMavenIR(
} }
data class MavenPropertyIR( data class MavenPropertyIR(
val name: String, @NonNls val name: String,
val value: String @NonNls val value: String
) : MavenIR { ) : MavenIR {
override fun MavenPrinter.renderMaven() { override fun MavenPrinter.renderMaven() {
singleLineNode(name) { +value } singleLineNode(name) { +value }
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.core.buildList 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.gradle.*
fun runTaskIrs(mainClass: String, classPath: BuildSystemIR? = null) = buildList<BuildSystemIR> { fun runTaskIrs(@NonNls mainClass: String, classPath: BuildSystemIR? = null) = buildList<BuildSystemIR> {
+ApplicationPluginIR(mainClass) +ApplicationPluginIR(mainClass)
+GradleSectionIR("application", buildBody { +GradleSectionIR("application", buildBody {
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.library package org.jetbrains.kotlin.tools.projectWizard.library
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
@@ -7,12 +8,12 @@ sealed class LibraryArtifact
data class MavenArtifact( data class MavenArtifact(
val repository: Repository, val repository: Repository,
val groupId: String, @NonNls val groupId: String,
val artifactId: String @NonNls val artifactId: String
) : LibraryArtifact() ) : LibraryArtifact()
data class NpmArtifact( data class NpmArtifact(
val name: String @NonNls val name: String
) : LibraryArtifact() ) : LibraryArtifact()
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.Versions import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
@@ -41,8 +43,6 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
override val moduleType: ModuleType override val moduleType: ModuleType
get() = ModuleType.android get() = ModuleType.android
override val greyText: String
get() = "Requires Android SDK"
override fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> = override fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> =
listOf(AndroidPlugin::androidSdkPath.reference) listOf(AndroidPlugin::androidSdkPath.reference)
@@ -128,6 +128,8 @@ object AndroidTargetConfigurator : TargetConfigurator,
override val moduleSubType = ModuleSubType.android override val moduleSubType = ModuleSubType.android
override val moduleType = ModuleType.android override val moduleType = ModuleType.android
override val text = KotlinNewProjectWizardBundle.message("module.configurator.android")
override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin = override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin =
withSettingsOf(module) { androidPlugin.reference.settingValue } withSettingsOf(module) { androidPlugin.reference.settingValue }
@@ -150,10 +152,19 @@ object AndroidTargetConfigurator : TargetConfigurator,
) )
} }
val androidPlugin by enumSetting<AndroidGradlePlugin>("Android Library", neededAtPhase = GenerationPhase.PROJECT_GENERATION) val androidPlugin by enumSetting<AndroidGradlePlugin>(
KotlinNewProjectWizardBundle.message("module.configurator.android.setting.android.plugin"),
neededAtPhase = GenerationPhase.PROJECT_GENERATION
)
} }
enum class AndroidGradlePlugin(override val text: String, val pluginName: String) : DisplayableSettingItem { enum class AndroidGradlePlugin(override val text: String, @NonNls val pluginName: String) : DisplayableSettingItem {
APPLICATION("Android Application", "com.android.application"), APPLICATION(
LIBRARY("Android Library", "com.android.library") KotlinNewProjectWizardBundle.message("module.configurator.android.setting.android.plugin.application"),
"com.android.application"
),
LIBRARY(
KotlinNewProjectWizardBundle.message("module.configurator.android.setting.android.plugin.library"),
"com.android.library"
)
} }
@@ -1,7 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
@@ -19,9 +20,11 @@ object AndroidSinglePlatformModuleConfigurator :
SinglePlatformModuleConfigurator, SinglePlatformModuleConfigurator,
AndroidModuleConfigurator { AndroidModuleConfigurator {
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformAndroid override val moduleKind: ModuleKind get() = ModuleKind.singleplatformAndroid
@NonNls
override val id = "android" override val id = "android"
@NonNls
override val suggestedModuleName = "android" override val suggestedModuleName = "android"
override val text = "Android" override val text = KotlinNewProjectWizardBundle.message("module.configurator.android")
override val requiresRootBuildFile: Boolean = true override val requiresRootBuildFile: Boolean = true
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
@@ -14,10 +16,16 @@ import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
import java.nio.file.Path import java.nio.file.Path
object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, ModuleConfiguratorSettings() { object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, ModuleConfiguratorSettings() {
@NonNls
override val id = "IOS Module" override val id = "IOS Module"
@NonNls
override val suggestedModuleName = "ios" override val suggestedModuleName = "ios"
override val moduleKind: ModuleKind = ModuleKind.singleplatformJvm override val moduleKind: ModuleKind = ModuleKind.singleplatformJvm
override val greyText = "Requires Apple Xcode" override val greyText = KotlinNewProjectWizardBundle.message("module.configurator.ios.requires.xcode")
override val text = KotlinNewProjectWizardBundle.message("module.configurator.ios")
override val needCreateBuildFile: Boolean = false override val needCreateBuildFile: Boolean = false
override val requiresRootBuildFile: Boolean = true override val requiresRootBuildFile: Boolean = true
@@ -74,6 +82,7 @@ object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, M
.asPath() .asPath()
) )
@NonNls
private const val DEFAULT_APP_NAME = "appName" private const val DEFAULT_APP_NAME = "appName"
val dependentModule by valueSetting<DependentModuleReference>( val dependentModule by valueSetting<DependentModuleReference>(
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.Reader
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
@@ -22,9 +24,13 @@ interface JSConfigurator : ModuleConfiguratorWithModuleType {
object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests, SinglePlatformModuleConfigurator { object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests, SinglePlatformModuleConfigurator {
override val moduleKind = ModuleKind.singleplatformJs override val moduleKind = ModuleKind.singleplatformJs
@NonNls
override val suggestedModuleName = "js" override val suggestedModuleName = "js"
@NonNls
override val id = "jsSinglepaltform" override val id = "jsSinglepaltform"
override val text = "JS for Browser" override val text = KotlinNewProjectWizardBundle.message("module.configurator.js")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
@@ -199,8 +199,6 @@ fun Module.getConfiguratorSettings() = buildList<SettingReference<*, *>> {
interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
val moduleKind: ModuleKind val moduleKind: ModuleKind
override val text: String
get() = id
val suggestedModuleName: String? get() = null val suggestedModuleName: String? get() = null
val canContainSubModules: Boolean get() = false val canContainSubModules: Boolean get() = false
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting 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.ModuleConfiguratorSettingReference
@@ -24,7 +26,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings { interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
companion object : ModuleConfiguratorSettings() { companion object : ModuleConfiguratorSettings() {
val testFramework by enumSetting<KotlinTestFramework>( val testFramework by enumSetting<KotlinTestFramework>(
"Test Framework", KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework"),
neededAtPhase = GenerationPhase.PROJECT_GENERATION neededAtPhase = GenerationPhase.PROJECT_GENERATION
) { ) {
filter = filter@{ reference, kotlinTestFramework -> filter = filter@{ reference, kotlinTestFramework ->
@@ -67,9 +69,29 @@ enum class KotlinTestFramework(
val moduleType: ModuleType, val moduleType: ModuleType,
val dependencyNames: List<String> val dependencyNames: List<String>
) : DisplayableSettingItem { ) : DisplayableSettingItem {
JUNIT4("JUnit 4 Test Framework", ModuleType.jvm, listOf("test-junit")), JUNIT4(
JUNIT5("JUnit 5 Test Framework", ModuleType.jvm, listOf("test-junit5")), KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.junit4"),
TEST_NG("Test NG Test Framework", ModuleType.jvm, listOf("test-testng")), ModuleType.jvm,
JS("JavaScript Test Framework", ModuleType.js, listOf("test-js")), listOf("test-junit")
COMMON("Common Test Framework", ModuleType.common, listOf("test-common", "test-annotations-common")), ),
JUNIT5(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.junit5"),
ModuleType.jvm,
listOf("test-junit5")
),
TEST_NG(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.test.ng"),
ModuleType.jvm,
listOf("test-testng")
),
JS(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.js"),
ModuleType.js,
listOf("test-js")
),
COMMON(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.common"),
ModuleType.common,
listOf("test-common", "test-annotations-common")
)
} }
@@ -1,6 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
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.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
@@ -20,6 +22,8 @@ interface NativeTargetConfigurator : TargetConfigurator
class RealNativeTargetConfigurator private constructor( class RealNativeTargetConfigurator private constructor(
override val moduleSubType: ModuleSubType override val moduleSubType: ModuleSubType
) : NativeTargetConfigurator, SimpleTargetConfigurator { ) : NativeTargetConfigurator, SimpleTargetConfigurator {
override val text: String = moduleSubType.name.capitalize()
override fun createInnerTargetIrs(reader: Reader, module: Module): List<BuildSystemIR> = if (moduleSubType.isIOS) { override fun createInnerTargetIrs(reader: Reader, module: Module): List<BuildSystemIR> = if (moduleSubType.isIOS) {
listOf( listOf(
GradleSectionIR("binaries") { GradleSectionIR("binaries") {
@@ -43,8 +47,11 @@ class RealNativeTargetConfigurator private constructor(
object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenceTargetConfigurator { object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenceTargetConfigurator {
override val moduleType = ModuleType.native override val moduleType = ModuleType.native
@NonNls
override val id = "nativeForCurrentSystem" override val id = "nativeForCurrentSystem"
override val text = "Your system"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.native.for.current.system")
override fun Reader.createTargetIrs( override fun Reader.createTargetIrs(
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
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
@@ -15,7 +16,7 @@ object TargetConfigurationGroups {
object NATIVE { object NATIVE {
val LINUX = FinalTargetConfiguratorGroup( val LINUX = FinalTargetConfiguratorGroup(
"Linux", KotlinNewProjectWizardBundle.message("module.configuration.group.linux"),
ModuleType.native, ModuleType.native,
listOf( listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.linuxX64), RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.linuxX64),
@@ -26,7 +27,7 @@ object TargetConfigurationGroups {
) )
val WINDOWS = FinalTargetConfiguratorGroup( val WINDOWS = FinalTargetConfiguratorGroup(
"Windows (MinGW)", KotlinNewProjectWizardBundle.message("module.configuration.group.windows.mingw"),
ModuleType.native, ModuleType.native,
listOf( listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.mingwX64), RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.mingwX64),
@@ -35,7 +36,7 @@ object TargetConfigurationGroups {
) )
val MAC = FinalTargetConfiguratorGroup( val MAC = FinalTargetConfiguratorGroup(
"macOS", KotlinNewProjectWizardBundle.message("module.configuration.group.macos"),
ModuleType.native, ModuleType.native,
listOf( listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.macosX64) RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.macosX64)
@@ -43,7 +44,7 @@ object TargetConfigurationGroups {
) )
val IOS = FinalTargetConfiguratorGroup( val IOS = FinalTargetConfiguratorGroup(
"iOS", KotlinNewProjectWizardBundle.message("module.configuration.group.ios"),
ModuleType.native, ModuleType.native,
listOf( listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.iosArm32), RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.iosArm32),
@@ -53,7 +54,7 @@ object TargetConfigurationGroups {
) )
val ANDROID_NATIVE = FinalTargetConfiguratorGroup( val ANDROID_NATIVE = FinalTargetConfiguratorGroup(
"Android Native", KotlinNewProjectWizardBundle.message("module.configuration.group.android.native"),
ModuleType.native, ModuleType.native,
listOf( listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.androidNativeArm64), RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.androidNativeArm64),
@@ -1,6 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
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.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
@@ -41,7 +43,6 @@ interface SimpleTargetConfigurator : TargetConfigurator {
val moduleSubType: ModuleSubType val moduleSubType: ModuleSubType
override val moduleType get() = moduleSubType.moduleType override val moduleType get() = moduleSubType.moduleType
override val id get() = "${moduleSubType.name}Target" override val id get() = "${moduleSubType.name}Target"
override val text get() = moduleSubType.name.capitalize()
override val suggestedModuleName: String? get() = moduleSubType.name override val suggestedModuleName: String? get() = moduleSubType.name
@@ -66,10 +67,15 @@ private fun Module.createTargetAccessIr(moduleSubType: ModuleSubType) =
interface JsTargetConfigurator : JSConfigurator, TargetConfigurator, SingleCoexistenceTargetConfigurator interface JsTargetConfigurator : JSConfigurator, TargetConfigurator, SingleCoexistenceTargetConfigurator
object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWithTests { object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWithTests {
@NonNls
override val id = "jsBrowser" override val id = "jsBrowser"
override val text = "Browser"
@NonNls
override val suggestedModuleName = "browser" override val suggestedModuleName = "browser"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.js.browser")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
override fun Reader.createTargetIrs( override fun Reader.createTargetIrs(
@@ -87,10 +93,14 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit
} }
object JsNodeTargetConfigurator : JsTargetConfigurator { object JsNodeTargetConfigurator : JsTargetConfigurator {
@NonNls
override val id = "jsNode" override val id = "jsNode"
override val text = "Node.js"
@NonNls
override val suggestedModuleName = "nodeJs" override val suggestedModuleName = "nodeJs"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.js.node")
override fun Reader.createTargetIrs( override fun Reader.createTargetIrs(
module: Module module: Module
@@ -108,6 +118,7 @@ object JsNodeTargetConfigurator : JsTargetConfigurator {
object CommonTargetConfigurator : TargetConfiguratorWithTests(), SimpleTargetConfigurator, SingleCoexistenceTargetConfigurator { object CommonTargetConfigurator : TargetConfiguratorWithTests(), SimpleTargetConfigurator, SingleCoexistenceTargetConfigurator {
override val moduleSubType = ModuleSubType.common override val moduleSubType = ModuleSubType.common
override val text: String = KotlinNewProjectWizardBundle.message("module.configurator.common")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON
} }
@@ -117,8 +128,7 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
SimpleTargetConfigurator { SimpleTargetConfigurator {
override val moduleSubType = ModuleSubType.jvm override val moduleSubType = ModuleSubType.jvm
override val text: String override val text: String = KotlinNewProjectWizardBundle.message("module.configurator.jvm")
get() = "JVM"
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4 override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
@@ -149,7 +159,10 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
Settings.javaSupport Settings.javaSupport
object Settings : ModuleConfiguratorSettings() { object Settings : ModuleConfiguratorSettings() {
val javaSupport by booleanSetting("Java language support", GenerationPhase.PROJECT_GENERATION) { val javaSupport by booleanSetting(
KotlinNewProjectWizardBundle.message("module.configurator.jvm.setting.java.support"),
GenerationPhase.PROJECT_GENERATION
) {
defaultValue = value(false) defaultValue = value(false)
} }
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.annotations.Nls
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.DisplayableSettingItem
@@ -9,22 +10,22 @@ interface DisplayableTargetConfiguratorGroup : TargetConfiguratorGroup, Displaya
val moduleType: ModuleType val moduleType: ModuleType
} }
interface TargetConfiguratorGroupWithSubItems: TargetConfiguratorGroup { interface TargetConfiguratorGroupWithSubItems : TargetConfiguratorGroup {
val subItems: List<DisplayableSettingItem> val subItems: List<DisplayableSettingItem>
} }
data class StepTargetConfiguratorGroup( data class StepTargetConfiguratorGroup(
override val text: String, @Nls override val text: String,
override val moduleType: ModuleType, override val moduleType: ModuleType,
override val subItems: List<DisplayableSettingItem> override val subItems: List<DisplayableSettingItem>
): DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems ) : DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
data class FinalTargetConfiguratorGroup( data class FinalTargetConfiguratorGroup(
override val text: String, @Nls override val text: String,
override val moduleType: ModuleType, override val moduleType: ModuleType,
override val subItems: List<DisplayableSettingItem> override val subItems: List<DisplayableSettingItem>
): DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems ) : DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
data class FirstStepTargetConfiguratorGroup( data class FirstStepTargetConfiguratorGroup(
override val subItems: List<DisplayableSettingItem> override val subItems: List<DisplayableSettingItem>
): TargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems ) : TargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
@@ -1,6 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators 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.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
@@ -20,7 +22,10 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
interface JvmModuleConfigurator : ModuleConfiguratorWithTests { interface JvmModuleConfigurator : ModuleConfiguratorWithTests {
companion object : ModuleConfiguratorSettings() { companion object : ModuleConfiguratorSettings() {
val targetJvmVersion by enumSetting<TargetJvmVersion>("Target JVM Version", GenerationPhase.PROJECT_GENERATION) { val targetJvmVersion by enumSetting<TargetJvmVersion>(
KotlinNewProjectWizardBundle.message("module.configurator.jvm.setting.target.jvm.version"),
GenerationPhase.PROJECT_GENERATION
) {
defaultValue = value(TargetJvmVersion.JVM_1_8) defaultValue = value(TargetJvmVersion.JVM_1_8)
} }
} }
@@ -31,7 +36,7 @@ interface JvmModuleConfigurator : ModuleConfiguratorWithTests {
} }
} }
enum class TargetJvmVersion(val value: String) : DisplayableSettingItem { enum class TargetJvmVersion(@NonNls val value: String) : DisplayableSettingItem {
JVM_1_6("1.6"), JVM_1_6("1.6"),
JVM_1_8("1.8"), JVM_1_8("1.8"),
JVM_9("9"), JVM_9("9"),
@@ -54,9 +59,13 @@ val ModuleConfigurator.moduleType: ModuleType?
object MppModuleConfigurator : ModuleConfigurator { object MppModuleConfigurator : ModuleConfigurator {
override val moduleKind = ModuleKind.multiplatform override val moduleKind = ModuleKind.multiplatform
@NonNls
override val suggestedModuleName = "shared" override val suggestedModuleName = "shared"
@NonNls
override val id = "multiplatform" override val id = "multiplatform"
override val text = "Multiplatform" override val text = KotlinNewProjectWizardBundle.message("module.configurator.mpp")
override val canContainSubModules = true override val canContainSubModules = true
override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? = override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
@@ -76,8 +85,10 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
ModuleConfiguratorWithModuleType { ModuleConfiguratorWithModuleType {
override val moduleType get() = ModuleType.jvm override val moduleType get() = ModuleType.jvm
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformJvm override val moduleKind: ModuleKind get() = ModuleKind.singleplatformJvm
override val suggestedModuleName = "jvm" @NonNls override val suggestedModuleName = "jvm"
override val id = "JVM Module" @NonNls override val id = "JVM Module"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.jvm")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4 override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
@@ -120,9 +131,6 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
} }
val ModuleType.defaultTarget val ModuleType.defaultTarget
get() = when (this) { get() = when (this) {
ModuleType.jvm -> JvmTargetConfigurator ModuleType.jvm -> JvmTargetConfigurator
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.Context import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
@@ -18,7 +19,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
class AndroidPlugin(context: Context) : Plugin(context) { class AndroidPlugin(context: Context) : Plugin(context) {
val androidSdkPath by pathSetting( val androidSdkPath by pathSetting(
"Android SDK Path", KotlinNewProjectWizardBundle.message("plugin.android.setting.sdk"),
neededAtPhase = GenerationPhase.PROJECT_GENERATION neededAtPhase = GenerationPhase.PROJECT_GENERATION
) { ) {
isSavable = true isSavable = true
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
@@ -13,26 +13,41 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.nio.file.Paths import java.nio.file.Paths
class StructurePlugin(context: Context) : Plugin(context) { class StructurePlugin(context: Context) : Plugin(context) {
val projectPath by pathSetting("Location", GenerationPhase.FIRST_STEP) { val projectPath by pathSetting(
KotlinNewProjectWizardBundle.message("plugin.structure.setting.location"),
GenerationPhase.FIRST_STEP
) {
defaultValue = value(Paths.get(".")) defaultValue = value(Paths.get("."))
} }
val name by stringSetting("Name", GenerationPhase.FIRST_STEP) { val name by stringSetting(
KotlinNewProjectWizardBundle.message("plugin.structure.setting.name"),
GenerationPhase.FIRST_STEP
) {
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Name", Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)) validate(StringValidators.shouldBeValidIdentifier(title, Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES))
} }
val groupId by stringSetting("Group ID", GenerationPhase.FIRST_STEP) { val groupId by stringSetting(
KotlinNewProjectWizardBundle.message("plugin.structure.setting.group.id"),
GenerationPhase.FIRST_STEP
) {
isSavable = true isSavable = true
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Group ID", setOf('.', '_'))) validate(StringValidators.shouldBeValidIdentifier(title, setOf('.', '_')))
} }
val artifactId by stringSetting("Artifact ID", GenerationPhase.FIRST_STEP) { val artifactId by stringSetting(
KotlinNewProjectWizardBundle.message("plugin.structure.setting.artifact.id"),
GenerationPhase.FIRST_STEP
) {
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Artifact ID", setOf('_'))) validate(StringValidators.shouldBeValidIdentifier(title, setOf('_')))
} }
val version by stringSetting("Version", GenerationPhase.FIRST_STEP) { val version by stringSetting(
KotlinNewProjectWizardBundle.message("plugin.structure.setting.version"),
GenerationPhase.FIRST_STEP
) {
shouldNotBeBlank() shouldNotBeBlank()
validate(StringValidators.shouldBeValidIdentifier("Version", setOf('_', '-', '.'))) validate(StringValidators.shouldBeValidIdentifier(title, setOf('_', '-', '.')))
defaultValue = value("1.0-SNAPSHOT") defaultValue = value("1.0-SNAPSHOT")
} }
@@ -1,6 +1,9 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
@@ -22,7 +25,10 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles
abstract class BuildSystemPlugin(context: Context) : Plugin(context) { abstract class BuildSystemPlugin(context: Context) : Plugin(context) {
val type by enumSetting<BuildSystemType>("Build System", GenerationPhase.FIRST_STEP) { val type by enumSetting<BuildSystemType>(
KotlinNewProjectWizardBundle.message("plugin.buildsystem.setting.type"),
GenerationPhase.FIRST_STEP
) {
isSavable = true isSavable = true
filter = { _, type -> filter = { _, type ->
val service = service<BuildSystemAvailabilityWizardService>() val service = service<BuildSystemAvailabilityWizardService>()
@@ -33,8 +39,15 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) {
if (!buildSystemType.isGradle if (!buildSystemType.isGradle
&& KotlinPlugin::projectKind.reference.notRequiredSettingValue != ProjectKind.Singleplatform && KotlinPlugin::projectKind.reference.notRequiredSettingValue != ProjectKind.Singleplatform
) { ) {
val projectKind = KotlinPlugin::projectKind.reference.notRequiredSettingValue?.text?.capitalize() ?: "Project" val projectKind = KotlinPlugin::projectKind.reference.notRequiredSettingValue?.text?.capitalize()
ValidationResult.ValidationError("$projectKind cannot be generated using ${buildSystemType.text}") ?: KotlinNewProjectWizardBundle.message("project")
ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message(
"plugin.buildsystem.setting.type.error.wrong.project.kind",
projectKind,
buildSystemType.text
)
)
} else ValidationResult.OK } else ValidationResult.OK
} }
} }
@@ -106,14 +119,14 @@ data class BuildSystemData(
data class BuildFileData( data class BuildFileData(
val createPrinter: () -> BuildFilePrinter, val createPrinter: () -> BuildFilePrinter,
val buildFileName: String @NonNls val buildFileName: String
) )
enum class BuildSystemType(override val text: String) : DisplayableSettingItem { enum class BuildSystemType(@Nls override val text: String) : DisplayableSettingItem {
GradleKotlinDsl("Gradle Kotlin"), GradleKotlinDsl(KotlinNewProjectWizardBundle.message("buildsystem.type.gradle.kotlin")),
GradleGroovyDsl("Gradle Groovy"), GradleGroovyDsl(KotlinNewProjectWizardBundle.message("buildsystem.type.gradle.groovy")),
Jps("IntelliJ"), Jps(KotlinNewProjectWizardBundle.message("buildsystem.type.intellij")),
Maven("Maven") Maven(KotlinNewProjectWizardBundle.message("buildsystem.type.maven"))
; ;
@@ -3,8 +3,6 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem
import org.jetbrains.kotlin.tools.projectWizard.core.Context import org.jetbrains.kotlin.tools.projectWizard.core.Context
class JpsPlugin(context: Context) : BuildSystemPlugin(context) { class JpsPlugin(context: Context) : BuildSystemPlugin(context) {
override val title: String = "IDEA"
val addBuildSystemData by addBuildSystemData( val addBuildSystemData by addBuildSystemData(
BuildSystemData( BuildSystemData(
type = BuildSystemType.Jps, type = BuildSystemType.Jps,
@@ -13,8 +13,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles
class MavenPlugin(context: Context) : BuildSystemPlugin(context) { class MavenPlugin(context: Context) : BuildSystemPlugin(context) {
override val title: String = "Maven"
private val isMaven = checker { private val isMaven = checker {
BuildSystemPlugin::type.settingValue == BuildSystemType.Maven BuildSystemPlugin::type.settingValue == BuildSystemType.Maven
} }
@@ -7,8 +7,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemT
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
class GroovyDslPlugin(context: Context) : GradlePlugin(context) { class GroovyDslPlugin(context: Context) : GradlePlugin(context) {
override val title: String = "Gradle (Groovy DSL)"
val addBuildSystemData by addBuildSystemData( val addBuildSystemData by addBuildSystemData(
BuildSystemData( BuildSystemData(
type = BuildSystemType.GradleGroovyDsl, type = BuildSystemType.GradleGroovyDsl,
@@ -7,8 +7,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemT
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
class KotlinDslPlugin(context: Context) : GradlePlugin(context) { class KotlinDslPlugin(context: Context) : GradlePlugin(context) {
override val title: String = "Gradle (Kotlin DSL)"
val addBuildSystemData by addBuildSystemData( val addBuildSystemData by addBuildSystemData(
BuildSystemData( BuildSystemData(
type = BuildSystemType.GradleKotlinDsl, type = BuildSystemType.GradleKotlinDsl,
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
@@ -26,7 +27,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
val version by property(Versions.KOTLIN) val version by property(Versions.KOTLIN)
val initKotlinVersions by pipelineTask(GenerationPhase.PREPARE_GENERATION) { val initKotlinVersions by pipelineTask(GenerationPhase.PREPARE_GENERATION) {
title = "Downloading list of Kotlin versions" title = KotlinNewProjectWizardBundle.message("plugin.kotlin.downloading.kotlin.versions")
withAction { withAction {
val version = service<KotlinVersionProviderService>().getKotlinVersion() val version = service<KotlinVersionProviderService>().getKotlinVersion()
@@ -34,18 +35,29 @@ class KotlinPlugin(context: Context) : Plugin(context) {
} }
} }
val projectKind by enumSetting<ProjectKind>("Project Kind", GenerationPhase.FIRST_STEP) val projectKind by enumSetting<ProjectKind>(
KotlinNewProjectWizardBundle.message("plugin.kotlin.setting.project.kind"),
GenerationPhase.FIRST_STEP
)
private fun List<Module>.findDuplicatesByName() = private fun List<Module>.findDuplicatesByName() =
groupingBy { it.name }.eachCount().filter { it.value > 1 } groupingBy { it.name }.eachCount().filter { it.value > 1 }
val modules by listSetting("Modules", GenerationPhase.SECOND_STEP, Module.parser) { val modules by listSetting(
KotlinNewProjectWizardBundle.message("plugin.kotlin.setting.modules"),
GenerationPhase.SECOND_STEP,
Module.parser
) {
validate { value -> validate { value ->
val allModules = value.withAllSubModules() val allModules = value.withAllSubModules()
val duplicatedModules = allModules.findDuplicatesByName() val duplicatedModules = allModules.findDuplicatesByName()
if (duplicatedModules.isEmpty()) ValidationResult.OK if (duplicatedModules.isEmpty()) ValidationResult.OK
else ValidationResult.ValidationError( else ValidationResult.ValidationError(
"There are ${duplicatedModules.values.first()} modules with name `${duplicatedModules.keys.first()}`" KotlinNewProjectWizardBundle.message(
"plugin.kotlin.setting.modules.error.duplicated.modules",
duplicatedModules.values.first(),
duplicatedModules.keys.first()
)
) )
} }
@@ -54,7 +66,11 @@ class KotlinPlugin(context: Context) : Plugin(context) {
val duplicatedModules = module.subModules.findDuplicatesByName() val duplicatedModules = module.subModules.findDuplicatesByName()
if (duplicatedModules.isEmpty()) ValidationResult.OK if (duplicatedModules.isEmpty()) ValidationResult.OK
else ValidationResult.ValidationError( else ValidationResult.ValidationError(
"There are ${duplicatedModules.values.first()} targets for module `${module.name}` with name `${duplicatedModules.keys.first()}`" KotlinNewProjectWizardBundle.message(
"plugin.kotlin.setting.modules.error.duplicated.targets",
duplicatedModules.values.first(),
duplicatedModules.keys.first()
)
) )
}.fold() }.fold()
} }
@@ -119,9 +135,6 @@ class KotlinPlugin(context: Context) : Plugin(context) {
companion object { companion object {
// TODO update default versions
private val DEFAULT_VERSION = Version.fromString("1.3.61")
private val moduleDependenciesValidator = settingValidator<List<Module>> { modules -> private val moduleDependenciesValidator = settingValidator<List<Module>> { modules ->
val allModules = modules.withAllSubModules(includeSourcesets = true).toSet() val allModules = modules.withAllSubModules(includeSourcesets = true).toSet()
val allModulePaths = allModules.map(Module::path).toSet() val allModulePaths = allModules.map(Module::path).toSet()
@@ -131,7 +144,13 @@ class KotlinPlugin(context: Context) : Plugin(context) {
is ModuleReference.ByPath -> dependency.path in allModulePaths is ModuleReference.ByPath -> dependency.path in allModulePaths
is ModuleReference.ByModule -> dependency.module in allModules is ModuleReference.ByModule -> dependency.module in allModules
} }
ValidationResult.create(isValidModule) { "Invalid module dependency $dependency of module ${module.path}" } ValidationResult.create(isValidModule) {
KotlinNewProjectWizardBundle.message(
"plugin.kotlin.setting.modules.error.duplicated.modules",
dependency,
module.path
)
}
} }
}.fold() }.fold()
} }
@@ -139,10 +158,10 @@ class KotlinPlugin(context: Context) : Plugin(context) {
} }
enum class ProjectKind(override val text: String) : DisplayableSettingItem { enum class ProjectKind(override val text: String) : DisplayableSettingItem {
Singleplatform("Singleplatform project"), Singleplatform(KotlinNewProjectWizardBundle.message("project.kind.singleplatform")),
Multiplatform("Multiplatform project"), Multiplatform(KotlinNewProjectWizardBundle.message("project.kind.multiplatform")),
Android("Android project"), Android(KotlinNewProjectWizardBundle.message("project.kind.android")),
Js("Kotlin/JS project") Js(KotlinNewProjectWizardBundle.message("project.kind.kotlin.js"))
} }
fun List<Module>.withAllSubModules(includeSourcesets: Boolean = false): List<Module> = buildList { fun List<Module>.withAllSubModules(includeSourcesets: Boolean = false): List<Module> = buildList {
@@ -1,17 +1,18 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.StdlibType
import java.util.* import java.util.*
//TODO maybe split into interfaces like it made with module configurators //TODO maybe split into interfaces like it made with module configurators
@Suppress("EnumEntryName") @Suppress("EnumEntryName")
enum class ModuleType(val projectTypeName: String) { enum class ModuleType(val projectTypeName: String) {
jvm("Kotlin/JVM"), jvm(KotlinNewProjectWizardBundle.message("module.type.jvm")),
js("Kotlin/JS"), js(KotlinNewProjectWizardBundle.message("module.type.js")),
native("Kotlin/Native"), native(KotlinNewProjectWizardBundle.message("module.type.native")),
common("Common"), common(KotlinNewProjectWizardBundle.message("module.type.common")),
android("Android"), android(KotlinNewProjectWizardBundle.message("module.type.android")),
// ios("iOS") // ios(KotlinNewProjectWizardBundle.message("module.type.ios"))
; ;
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.printer package org.jetbrains.kotlin.tools.projectWizard.plugins.printer
import org.jetbrains.annotations.NonNls
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.render import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
@@ -25,7 +26,7 @@ abstract class BuildFilePrinter {
builder.append(this) builder.append(this)
} }
operator fun String.unaryPlus() { operator fun @receiver:NonNls String.unaryPlus() {
builder.append(this) builder.append(this)
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.printer package org.jetbrains.kotlin.tools.projectWizard.plugins.printer
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFilePrinter() { class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFilePrinter() {
@@ -26,7 +27,7 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
GradleDsl.GROOVY -> "'$this'" GradleDsl.GROOVY -> "'$this'"
} }
fun call(name: String, forceBrackets: Boolean = false, body: () -> Unit) { fun call(@NonNls name: String, forceBrackets: Boolean = false, body: () -> Unit) {
+name +name
when { when {
dsl == GradleDsl.KOTLIN || forceBrackets -> { dsl == GradleDsl.KOTLIN || forceBrackets -> {
@@ -39,7 +40,7 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
} }
} }
fun sectionCall(name: String, needIndent: Boolean = false, body: () -> Unit) { fun sectionCall(@NonNls name: String, needIndent: Boolean = false, body: () -> Unit) {
+name +name
+" " +" "
inBrackets { inBrackets {
@@ -49,7 +50,7 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
} }
fun <I : BuildSystemIR> sectionCall( fun <I : BuildSystemIR> sectionCall(
name: String, @NonNls name: String,
irs: List<I>, irs: List<I>,
renderEmpty: Boolean = false renderEmpty: Boolean = false
) { ) {
@@ -61,7 +62,7 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
} }
} }
fun assignmentOrCall(target: String, assignee: () -> Unit) = when (dsl) { fun assignmentOrCall(@NonNls target: String, assignee: () -> Unit) = when (dsl) {
GradleDsl.KOTLIN -> { GradleDsl.KOTLIN -> {
+"$target = " +"$target = "
assignee() assignee()
@@ -69,13 +70,13 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
GradleDsl.GROOVY -> call(target, forceBrackets = false, body = assignee) GradleDsl.GROOVY -> call(target, forceBrackets = false, body = assignee)
} }
fun assignment(target: String, assignee: () -> Unit) { fun assignment(@NonNls target: String, assignee: () -> Unit) {
+"$target = " +"$target = "
assignee() assignee()
} }
inline fun getting(name: String, prefix: String?, body: () -> Unit = {}) { inline fun getting(@NonNls name: String, @NonNls prefix: String?, body: () -> Unit = {}) {
when (dsl) { when (dsl) {
GradleDsl.GROOVY -> { GradleDsl.GROOVY -> {
prefix?.let { +it; +"." } prefix?.let { +it; +"." }
@@ -1,12 +1,13 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.printer package org.jetbrains.kotlin.tools.projectWizard.plugins.printer
import org.jetbrains.annotations.NonNls
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.render import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
class class
MavenPrinter(override val indent: Int = 4) : BuildFilePrinter() { MavenPrinter(override val indent: Int = 4) : BuildFilePrinter() {
fun node( fun node(
name: String, @NonNls name: String,
attributes: List<Pair<String, String>> = emptyList(), attributes: List<Pair<String, String>> = emptyList(),
singleLine: Boolean = false, singleLine: Boolean = false,
body: () -> Unit body: () -> Unit
@@ -44,7 +45,7 @@ MavenPrinter(override val indent: Int = 4) : BuildFilePrinter() {
get() = "\"$this\"" get() = "\"$this\""
fun singleLineNode( fun singleLineNode(
name: String, @NonNls name: String,
attributes: List<Pair<String, String>> = emptyList(), attributes: List<Pair<String, String>> = emptyList(),
body: () -> Unit body: () -> Unit
) = node(name, attributes, singleLine = true, body = body) ) = node(name, attributes, singleLine = true, body = body)
@@ -1,5 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.projectTemplates package org.jetbrains.kotlin.tools.projectWizard.projectTemplates
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
@@ -133,8 +135,10 @@ private fun ModuleType.createDefaultTarget(
) = MultiplatformTargetModule(name, defaultTarget, createDefaultSourcesets()) ) = MultiplatformTargetModule(name, defaultTarget, createDefaultSourcesets())
object EmptySingleplatformProjectTemplate : ProjectTemplate() { object EmptySingleplatformProjectTemplate : ProjectTemplate() {
override val title = "Backend Application" override val title = KotlinNewProjectWizardBundle.message("project.template.empty.singleplatform.title")
override val description = "Create a backend application with Kotlin/JVM." override val description = KotlinNewProjectWizardBundle.message("project.template.empty.singleplatform.description")
@NonNls
override val suggestedProjectName = "myKotlinJvmProject" override val suggestedProjectName = "myKotlinJvmProject"
override val projectKind = ProjectKind.Singleplatform override val projectKind = ProjectKind.Singleplatform
@@ -147,8 +151,10 @@ object EmptySingleplatformProjectTemplate : ProjectTemplate() {
} }
object EmptyMultiplatformProjectTemplate : ProjectTemplate() { object EmptyMultiplatformProjectTemplate : ProjectTemplate() {
override val title = "Multiplatform Application" override val title = KotlinNewProjectWizardBundle.message("project.template.empty.mpp.title")
override val description = "Create applications for different platforms that support sharing common code." override val description = KotlinNewProjectWizardBundle.message("project.template.empty.mpp.description")
@NonNls
override val suggestedProjectName = "myKotlinMultiplatformProject" override val suggestedProjectName = "myKotlinMultiplatformProject"
override val projectKind = ProjectKind.Multiplatform override val projectKind = ProjectKind.Multiplatform
@@ -161,8 +167,10 @@ object EmptyMultiplatformProjectTemplate : ProjectTemplate() {
} }
object JvmConsoleApplication : ProjectTemplate() { object JvmConsoleApplication : ProjectTemplate() {
override val title = "Console Application" override val title = KotlinNewProjectWizardBundle.message("project.template.empty.jvm.console.title")
override val description = "Create a console application with Kotlin/JVM. Use it for prototyping or testing purposes." override val description = KotlinNewProjectWizardBundle.message("project.template.empty.jvm.console.description")
@NonNls
override val suggestedProjectName = "myConsoleApplication" override val suggestedProjectName = "myConsoleApplication"
override val projectKind = ProjectKind.Singleplatform override val projectKind = ProjectKind.Singleplatform
@@ -180,8 +188,10 @@ object JvmConsoleApplication : ProjectTemplate() {
} }
object MultiplatformLibrary : ProjectTemplate() { object MultiplatformLibrary : ProjectTemplate() {
override val title = "Multiplatform Library" override val title = KotlinNewProjectWizardBundle.message("project.template.mpp.lib.title")
override val description = "Create a library for sharing common code among different platforms." override val description = KotlinNewProjectWizardBundle.message("project.template.mpp.lib.description")
@NonNls
override val suggestedProjectName = "myMultiplatformLibrary" override val suggestedProjectName = "myMultiplatformLibrary"
override val projectKind = ProjectKind.Multiplatform override val projectKind = ProjectKind.Multiplatform
@@ -202,9 +212,10 @@ object MultiplatformLibrary : ProjectTemplate() {
} }
object JvmServerJsClient : ProjectTemplate() { object JvmServerJsClient : ProjectTemplate() {
override val title: String = "Full-Stack Web Application" override val title: String = KotlinNewProjectWizardBundle.message("project.template.full.stack.title")
override val description: String = "" + override val description: String = KotlinNewProjectWizardBundle.message("project.template.full.stack.description")
"Create a fully-functional web application using Kotlin/JS for the frontend and Kotlin/JVM for the backend."
@NonNls
override val suggestedProjectName: String = "myFullStackApplication" override val suggestedProjectName: String = "myFullStackApplication"
override val projectKind: ProjectKind = ProjectKind.Multiplatform override val projectKind: ProjectKind = ProjectKind.Multiplatform
override val setsPluginSettings: List<SettingWithValue<*, *>> = listOf( override val setsPluginSettings: List<SettingWithValue<*, *>> = listOf(
@@ -227,9 +238,10 @@ object JvmServerJsClient : ProjectTemplate() {
} }
object NativeConsoleApplication : ProjectTemplate() { object NativeConsoleApplication : ProjectTemplate() {
override val title = "Native Application" override val title = KotlinNewProjectWizardBundle.message("project.template.native.console.title")
override val description = override val description = KotlinNewProjectWizardBundle.message("project.template.native.console.description")
"Create an application with Kotlin/Native that works as a standalone application under a specific platform."
@NonNls
override val suggestedProjectName = "myNativeConsoleApp" override val suggestedProjectName = "myNativeConsoleApp"
override val projectKind = ProjectKind.Multiplatform override val projectKind = ProjectKind.Multiplatform
@@ -252,8 +264,10 @@ object NativeConsoleApplication : ProjectTemplate() {
} }
object JsBrowserApplication : ProjectTemplate() { object JsBrowserApplication : ProjectTemplate() {
override val title = "Frontend Application" override val title = KotlinNewProjectWizardBundle.message("project.template.frontend.title")
override val description = "Create a frontend application with Kotlin/JS if you already have a backend." override val description = KotlinNewProjectWizardBundle.message("project.template.frontend.description")
@NonNls
override val suggestedProjectName = "myKotlinJsApplication" override val suggestedProjectName = "myKotlinJsApplication"
override val projectKind = ProjectKind.Js override val projectKind = ProjectKind.Js
@@ -274,10 +288,10 @@ object JsBrowserApplication : ProjectTemplate() {
} }
object MPPMobileApplication : ProjectTemplate() { object MPPMobileApplication : ProjectTemplate() {
override val title = "Multiplatform Mobile Application" override val title = KotlinNewProjectWizardBundle.message("project.template.mpp.mobile.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.mpp.mobile.description")
override val description = @NonNls
"Create mobile applications for iOS and Android with Kotlin Multiplatform Mobile, which supports sharing common code between platforms."
override val suggestedProjectName = "myIOSApplication" override val suggestedProjectName = "myIOSApplication"
override val projectKind = ProjectKind.Multiplatform override val projectKind = ProjectKind.Multiplatform
@@ -325,8 +339,10 @@ object MPPMobileApplication : ProjectTemplate() {
} }
object MultiplatformMobileLibrary : ProjectTemplate() { object MultiplatformMobileLibrary : ProjectTemplate() {
override val title = "Multiplatform Mobile Library" override val title = KotlinNewProjectWizardBundle.message("project.template.mpp.mobile.lib.title")
override val description = "Create a library that supports sharing code between iOS and Android." override val description = KotlinNewProjectWizardBundle.message("project.template.mpp.mobile.lib.description")
@NonNls
override val suggestedProjectName = "myMppMobileLibrary" override val suggestedProjectName = "myMppMobileLibrary"
override val projectKind = ProjectKind.Multiplatform override val projectKind = ProjectKind.Multiplatform
@@ -1,7 +1,12 @@
package org.jetbrains.kotlin.tools.projectWizard.settings package org.jetbrains.kotlin.tools.projectWizard.settings
import org.jetbrains.annotations.Nls
interface DisplayableSettingItem { interface DisplayableSettingItem {
@get:Nls
val text: String val text: String
@get:Nls
val greyText: String? val greyText: String?
get() = null get() = null
} }
@@ -1,9 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem package org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem
import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.PersistentList
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
@@ -29,7 +31,7 @@ enum class ModuleKind : DisplayableSettingItem {
// TODO separate to classes // TODO separate to classes
class Module( class Module(
var name: String, @NonNls var name: String,
val configurator: ModuleConfigurator, val configurator: ModuleConfigurator,
var template: Template?, var template: Template?,
val sourcesets: List<Sourceset>, val sourcesets: List<Sourceset>,
@@ -62,12 +64,12 @@ class Module(
override val text: String get() = name override val text: String get() = name
override val greyText: String? override val greyText: String?
get() = when { get() = when {
kind == ModuleKind.target -> "${configurator.text} Target" kind == ModuleKind.target -> configurator.text + KotlinNewProjectWizardBundle.message("module.kind.target")
configurator == MppModuleConfigurator -> "MPP Module" configurator == MppModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.mpp.module")
configurator == AndroidSinglePlatformModuleConfigurator -> "Android Module" configurator == AndroidSinglePlatformModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.android.module")
configurator == IOSSinglePlatformModuleConfigurator -> "IOS Module" configurator == IOSSinglePlatformModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.ios.module")
configurator == JsSingleplatformModuleConfigurator -> "JS Module" configurator == JsSingleplatformModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.js.module")
else -> "Module" else -> KotlinNewProjectWizardBundle.message("module.kind.module")
} }
fun SettingsWriter.initDefaultValuesForSettings() { fun SettingsWriter.initDefaultValuesForSettings() {
@@ -101,10 +103,12 @@ class Module(
} }
private val moduleNameValidator = settingValidator<Module> { module -> private val moduleNameValidator = settingValidator<Module> { module ->
StringValidators.shouldNotBeBlank("Module name").validate(this, module.name) StringValidators.shouldNotBeBlank(KotlinNewProjectWizardBundle.message("module.name")).validate(this, module.name)
} and settingValidator { module -> } and settingValidator { module ->
StringValidators.shouldBeValidIdentifier("Module name `${module.name}`", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES) StringValidators.shouldBeValidIdentifier(
.validate(this, module.name) KotlinNewProjectWizardBundle.message("module.name", module.name),
ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES
).validate(this, module.name)
} }
val moduleConfiguratorValidator = settingValidator<Module> { module -> val moduleConfiguratorValidator = settingValidator<Module> { module ->
@@ -117,7 +121,12 @@ class Module(
} }
val value = reference?.notRequiredSettingValue val value = reference?.notRequiredSettingValue
?: reference?.savedOrDefaultValue ?: reference?.savedOrDefaultValue
?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank") ?: return@map ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message(
"validation.should.not.be.blank",
setting.title.capitalize()
)
)
(setting.validator as SettingValidator<Any>).validate(this@settingValidator, value) (setting.validator as SettingValidator<Any>).validate(this@settingValidator, value)
}.fold() }.fold()
} }
@@ -129,7 +138,12 @@ class Module(
template.settings.map { setting -> template.settings.map { setting ->
val value = setting.reference.notRequiredSettingValue val value = setting.reference.notRequiredSettingValue
?: setting.reference.savedOrDefaultValue ?: setting.reference.savedOrDefaultValue
?: return@map ValidationResult.ValidationError("${setting.title.capitalize()} should not be blank") ?: return@map ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message(
"validation.should.not.be.blank",
setting.title.capitalize()
)
)
(setting.validator as SettingValidator<Any>).validate(this@settingValidator, value) (setting.validator as SettingValidator<Any>).validate(this@settingValidator, value)
}.fold() }.fold()
} }
@@ -157,7 +171,7 @@ val Module.isRootModule
get() = parent == null get() = parent == null
@Suppress("FunctionName") @Suppress("FunctionName")
fun MultiplatformTargetModule(name: String, configurator: ModuleConfigurator, sourcesets: List<Sourceset>) = fun MultiplatformTargetModule(@NonNls name: String, configurator: ModuleConfigurator, sourcesets: List<Sourceset>) =
Module( Module(
name, name,
configurator, configurator,
@@ -167,7 +181,7 @@ fun MultiplatformTargetModule(name: String, configurator: ModuleConfigurator, so
) )
@Suppress("FunctionName") @Suppress("FunctionName")
fun MultiplatformModule(name: String, targets: List<Module> = emptyList()) = fun MultiplatformModule(@NonNls name: String, targets: List<Module> = emptyList()) =
Module( Module(
name, name,
MppModuleConfigurator, MppModuleConfigurator,
@@ -177,7 +191,7 @@ fun MultiplatformModule(name: String, targets: List<Module> = emptyList()) =
) )
@Suppress("FunctionName") @Suppress("FunctionName")
fun SingleplatformModule(name: String, sourcesets: List<Sourceset>) = fun SingleplatformModule(@NonNls name: String, sourcesets: List<Sourceset>) =
Module( Module(
name, name,
JvmSinglePlatformModuleConfigurator, JvmSinglePlatformModuleConfigurator,
@@ -1,18 +1,20 @@
package org.jetbrains.kotlin.tools.projectWizard.settings.version package org.jetbrains.kotlin.tools.projectWizard.settings.version
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
data class Version(override val text: String) : DisplayableSettingItem { data class Version(@NonNls override val text: String) : DisplayableSettingItem {
override fun toString(): String = text override fun toString(): String = text
companion object { companion object {
fun fromString(string: String) = Version(string) fun fromString(@NonNls string: String) = Version(string)
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 {
ParseError("Bad version format for setting `$path`") ParseError(KotlinNewProjectWizardBundle.message("version.error.bad.format", path))
}.get() }.get()
} }
} }
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.core.Writer import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
@@ -10,11 +11,15 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatf
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.runTaskIrs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.runTaskIrs
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.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class ConsoleJvmApplicationTemplate : Template() { class ConsoleJvmApplicationTemplate : Template() {
@NonNls
override val id: String = "consoleJvmApp" override val id: String = "consoleJvmApp"
override val title: String = "Console Application"
override val description: String = """Simple “Hello World!” Kotlin/JVM application that works in the console""" override val title: String = KotlinNewProjectWizardBundle.message("module.template.console.jvm.title")
override val description: String = KotlinNewProjectWizardBundle.message("module.template.console.jvm.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm) override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
override fun Writer.getIrsToAddToBuildFile( override fun Writer.getIrsToAddToBuildFile(
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import java.nio.file.Path import java.nio.file.Path
@@ -8,7 +9,7 @@ import java.nio.file.Paths
// Should be used to create any kind of files in the generated project // Should be used to create any kind of files in the generated project
// Except build files as they will be generated using IR // Except build files as they will be generated using IR
data class FileTemplateDescriptor(val templateId: String, val relativePath: Path) { data class FileTemplateDescriptor(@NonNls val templateId: String, val relativePath: Path) {
constructor(templateId: String) : this( constructor(templateId: String) : this(
templateId, templateId,
Paths.get(templateId).fileName.toString().removeSuffix(".vm").asPath() Paths.get(templateId).fileName.toString().removeSuffix(".vm").asPath()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.core.Writer import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList import org.jetbrains.kotlin.tools.projectWizard.core.buildList
@@ -22,11 +23,14 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositorie
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.InterceptionPoint import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.InterceptionPoint
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class KtorServerTemplate : Template() { class KtorServerTemplate : Template() {
override val title: String = "Ktor Server" override val title: String = KotlinNewProjectWizardBundle.message("module.template.ktor.server.title")
override val description: String = "Configurable Ktor web server for building web applications" override val description: String = KotlinNewProjectWizardBundle.message("module.template.ktor.server.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm) override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
@NonNls
override val id: String = "ktorServer" override val id: String = "ktorServer"
override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> =
@@ -55,7 +59,10 @@ class KtorServerTemplate : Template() {
FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main FileTemplateDescriptor("$id/server.kt.vm", "server.kt".asPath()) asSrcOf SourcesetType.main
) )
val serverEngine by enumSetting<KtorServerEngine>("Ktor Server Engine", GenerationPhase.PROJECT_GENERATION) val serverEngine by enumSetting<KtorServerEngine>(
KotlinNewProjectWizardBundle.message("module.template.ktor.server.setting.engine"),
GenerationPhase.PROJECT_GENERATION
)
val imports = InterceptionPoint("imports", emptyList<String>()) val imports = InterceptionPoint("imports", emptyList<String>())
val routes = InterceptionPoint("routes", emptyList<String>()) val routes = InterceptionPoint("routes", emptyList<String>())
@@ -65,7 +72,7 @@ class KtorServerTemplate : Template() {
override val settings: List<TemplateSetting<*, *>> = listOf(serverEngine) override val settings: List<TemplateSetting<*, *>> = listOf(serverEngine)
} }
private fun ktorArtifactDependency(name: String) = ArtifactBasedLibraryDependencyIR( private fun ktorArtifactDependency(@NonNls name: String) = ArtifactBasedLibraryDependencyIR(
MavenArtifact(Repositories.KTOR_BINTRAY, "io.ktor", name), MavenArtifact(Repositories.KTOR_BINTRAY, "io.ktor", name),
Version.fromString("1.2.6"), Version.fromString("1.2.6"),
DependencyType.MAIN DependencyType.MAIN
@@ -74,9 +81,18 @@ private fun ktorArtifactDependency(name: String) = ArtifactBasedLibraryDependenc
@Suppress("MemberVisibilityCanBePrivate") @Suppress("MemberVisibilityCanBePrivate")
enum class KtorServerEngine(val engineName: String, val dependencyName: String) : DisplayableSettingItem { enum class KtorServerEngine(val engineName: String, val dependencyName: String) : DisplayableSettingItem {
Netty("Netty", dependencyName = "ktor-server-netty"), Netty(
Tomcat("Tomcat", dependencyName = "ktor-server-tomcat"), KotlinNewProjectWizardBundle.message("module.template.ktor.server.setting.engine.netty"),
Jetty("Jetty", dependencyName = "ktor-server-jetty"); dependencyName = "ktor-server-netty"
),
Tomcat(
KotlinNewProjectWizardBundle.message("module.template.ktor.server.setting.engine.tomcat"),
dependencyName = "ktor-server-tomcat"
),
Jetty(
KotlinNewProjectWizardBundle.message("module.template.ktor.server.setting.engine.jetty"),
dependencyName = "ktor-server-jetty"
);
override val text: String override val text: String
get() = engineName.capitalize() get() = engineName.capitalize()
@@ -15,10 +15,12 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatf
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
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.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class NativeConsoleApplicationTemplate : Template() { class NativeConsoleApplicationTemplate : Template() {
override val title: String = "Native Application" override val title: String = KotlinNewProjectWizardBundle.message("module.template.native.console.title")
override val description: String = "Simple Kotlin/Native application for your operating system" override val description: String = KotlinNewProjectWizardBundle.message("module.template.native.console.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.native) override val moduleTypes: Set<ModuleType> = setOf(ModuleType.native)
override val id: String = "nativeConsoleApp" override val id: String = "nativeConsoleApp"
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
@@ -25,18 +27,25 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class SimpleJsClientTemplate : Template() { class SimpleJsClientTemplate : Template() {
override val title: String = "Frontend Application" override val title: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.title")
override val description: String = "Configurable Kotlin/JS frontend application" override val description: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.js) override val moduleTypes: Set<ModuleType> = setOf(ModuleType.js)
@NonNls
override val id: String = "simpleJsClient" override val id: String = "simpleJsClient"
override fun isApplicableTo(module: Module): Boolean = override fun isApplicableTo(module: Module): Boolean =
module.configurator == JsBrowserTargetConfigurator module.configurator == JsBrowserTargetConfigurator
|| module.configurator == JsSingleplatformModuleConfigurator || module.configurator == JsSingleplatformModuleConfigurator
val renderEngine by enumSetting<RenderEngine>("Rendering engine", GenerationPhase.PROJECT_GENERATION) { val renderEngine by enumSetting<RenderEngine>(
KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.engine"),
GenerationPhase.PROJECT_GENERATION
) {
defaultValue = value(RenderEngine.REACT_WITH_STYLED) defaultValue = value(RenderEngine.REACT_WITH_STYLED)
} }
@@ -45,12 +54,12 @@ class SimpleJsClientTemplate : Template() {
override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList { override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList {
if (module.originalModule.kind == ModuleKind.singleplatformJs) { if (module.originalModule.kind == ModuleKind.singleplatformJs) {
+WizardGradleRunConfiguration( +WizardGradleRunConfiguration(
"BrowserDevelopmentRun in continuous mode", KotlinNewProjectWizardBundle.message("module.template.js.simple.run.configuration.dev"),
"browserDevelopmentRun", "browserDevelopmentRun",
listOf("--continuous") listOf("--continuous")
) )
+WizardGradleRunConfiguration( +WizardGradleRunConfiguration(
"BrowserProductionRun in continuous mode", KotlinNewProjectWizardBundle.message("module.template.js.simple.run.configuration.prod"),
"browserProductionRun", "browserProductionRun",
listOf("--continuous") listOf("--continuous")
) )
@@ -221,8 +230,13 @@ class SimpleJsClientTemplate : Template() {
} }
companion object { companion object {
@NonNls
private const val JS_OUTPUT_FILE_NAME = "output.js" private const val JS_OUTPUT_FILE_NAME = "output.js"
@NonNls
private const val WEBPACK_TASK_CLASS = "KotlinWebpack" private const val WEBPACK_TASK_CLASS = "KotlinWebpack"
@NonNls
private const val WEBPACK_TASK_SUFFIX = "BrowserProductionWebpack" private const val WEBPACK_TASK_SUFFIX = "BrowserProductionWebpack"
} }
@@ -270,9 +284,9 @@ class SimpleJsClientTemplate : Template() {
) )
} }
enum class RenderEngine(override val text: String) : DisplayableSettingItem { enum class RenderEngine(@Nls override val text: String) : DisplayableSettingItem {
KOTLINX_HTML("Use statically typed Kotlinx.html DSL"), KOTLINX_HTML(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.kotlinx.html")),
REACT("Use Kotlin-wrapped React library"), REACT(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react")),
REACT_WITH_STYLED("Use Kotlin-wrapped React framework together with Styled Components"), REACT_WITH_STYLED(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react.styled"))
} }
} }
@@ -5,7 +5,9 @@
package org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors package org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors
data class InterceptionPoint<out T: Any>(val name: String, val initialValue: T) import org.jetbrains.annotations.NonNls
data class InterceptionPoint<out T: Any>(@NonNls val name: String, val initialValue: T)
data class InterceptionPointModifier<out T : Any>( data class InterceptionPointModifier<out T : Any>(
val point: InterceptionPoint<@UnsafeVariance T>, val point: InterceptionPoint<@UnsafeVariance T>,
@@ -1,25 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package tasks
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.ModuleIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.runTaskIrs
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
interface Task {
val name: String
fun createTaskIRs(moduleIR: ModuleIR, buildSystemType: BuildSystemType): List<BuildSystemIR>
}
class JvmRunTask(private val mainClass: String) : Task {
override val name: String = "Run task"
override fun createTaskIRs(moduleIR: ModuleIR, buildSystemType: BuildSystemType): List<BuildSystemIR> = buildList {
+runTaskIrs(mainClass)
}
}