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.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.submodules=This will also remove all submodules.
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.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.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.util.BaseListPopupStep
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.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.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.icon
import javax.swing.Icon
@@ -4,6 +4,7 @@ import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.ActionToolbarPosition
import com.intellij.openapi.ui.Messages
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.IOSSinglePlatformModuleConfigurator
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.ModuleKind
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.ui.createPanelWithPopupHandler
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
@@ -58,7 +58,7 @@ class ModulesEditorToolbarDecorator(
null -> true
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.singleplatformJvm -> KotlinNewProjectWizardBundle.message("module.kind.module")
ModuleKind.singleplatformJs -> KotlinNewProjectWizardBundle.message("module.kind.js.module")
@@ -66,9 +66,12 @@ class ModulesEditorToolbarDecorator(
ModuleKind.target -> ""
null -> ""
}
text = KotlinNewProjectWizardUIBundle.message("editor.modules.add", moduleKindTextToAdd)
}
event.presentation.isEnabled
}
setRemoveAction {
val moduleKindText = selectedModuleKindText ?: KotlinNewProjectWizardBundle.message("module.kind.module")
if (Messages.showOkCancelDialog(
@@ -8,7 +8,7 @@ dependencies {
compileOnly(project(":kotlin-reflect-api"))
//needed only for message bundles
implementation(intellijCoreDep())
implementation(intellijDep()) { includeJars("util") }
testImplementation(project(":kotlin-test:kotlin-test-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
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
interface WizardRunConfiguration {
@get:Nls
val configurationName: String
}
data class WizardGradleRunConfiguration(
override val configurationName: String,
val taskName: String,
@Nls override val configurationName: String,
@NonNls val taskName: String,
val parameters: List<String>
) : 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.
*/
package org.jetbrains.kotlin.tools.projectWizard.wizard
package org.jetbrains.kotlin.tools.projectWizard
import org.jetbrains.annotations.NonNls
import org.jetbrains.annotations.PropertyKey
import org.jetbrains.kotlin.util.AbstractKotlinBundle
import com.intellij.AbstractBundle
@NonNls
private const val BUNDLE = "messages.KotlinNewProjectWizardBundle"
object KotlinNewProjectWizardBundle : AbstractKotlinBundle(BUNDLE) {
object KotlinNewProjectWizardBundle : AbstractBundle(BUNDLE) {
@JvmStatic
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
import org.jetbrains.annotations.NonNls
interface EntitiesOwnerDescriptor {
@get:NonNls
val id: String
}
@@ -1,5 +1,6 @@
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.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.templates.Template
@@ -22,7 +23,7 @@ fun ParsingState.withSettings(newSettings: List<Pair<SettingReference<*, *>, Any
typealias ParsingContext = ComputeContext<ParsingState>
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>() {
@@ -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) }
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()
}
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"
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) }
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>()
.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")
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()
inline fun <reified V : Any, R : Any> Map<*, *>.parseValue(
context: ParsingContext,
path: String,
name: String,
@NonNls path: String,
@NonNls name: String,
crossinline parser: suspend ParsingContext.(V) -> TaskResult<R>
) = with(context) {
computeM {
@@ -124,16 +125,16 @@ inline fun <reified V : Any, R : Any> Map<*, *>.parseValue(
}
inline fun <reified T : Any> Map<*, *>.parseValue(
path: String,
name: String,
@NonNls path: String,
@NonNls name: String,
klass: KClass<T>
) = get(path).parseAs("$path.$name", klass)
fun <R : Any> Map<*, *>.parseValue(
context: ParsingContext,
path: String,
name: String,
@NonNls path: String,
@NonNls name: String,
parser: Parser<R>,
defaultValue: (() -> R)? = null
) = with(context) {
@@ -147,7 +148,7 @@ fun <R : Any> Map<*, *>.parseValue(
inline fun <reified V : Any, R : Any> Any?.parseAs(
context: ParsingContext,
path: String,
@NonNls path: String,
crossinline parser: suspend ParsingContext.(V) -> TaskResult<R>
) = with(context) {
computeM {
@@ -1,5 +1,7 @@
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.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
@@ -25,7 +27,9 @@ fun <V> inValidatorContext(validator: Reader.(V) -> SettingValidator<V>) =
object StringValidators {
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
}
@@ -34,10 +38,10 @@ object StringValidators {
val allowedExtraSymbolsStringified = allowedExtraSymbols
.takeIf { it.isNotEmpty() }
?.joinToString(separator = ", ") { char -> "'$char'" }
?.let { chars -> ", and symbols: $chars" }
?.let { chars -> KotlinNewProjectWizardBundle.message("validation.identifier.additional.symbols", chars) }
.orEmpty()
ValidationResult.ValidationError(
"${name.capitalize()} should consist only of letters, digits$allowedExtraSymbolsStringified"
KotlinNewProjectWizardBundle.message("validation.identifier", name.capitalize(), allowedExtraSymbolsStringified)
)
} else ValidationResult.OK
}
@@ -54,7 +58,7 @@ sealed class 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
}
@@ -66,7 +70,7 @@ sealed class ValidationResult {
}
companion object {
fun create(condition: Boolean, message: String) =
fun create(condition: Boolean, @Nls message: String) =
if (condition) OK else ValidationError(message)
inline fun create(condition: Boolean, message: () -> String) =
@@ -1,6 +1,7 @@
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.phases.GenerationPhase
import kotlin.reflect.KProperty1
@@ -47,6 +48,7 @@ data class PipelineTask(
var isAvailable: Checker = ALWAYS_AVAILABLE_CHECKER
@Nls
var title: String? = null
fun withAction(action: Writer.() -> TaskResult<Unit>) {
@@ -5,6 +5,7 @@
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.core.Plugin
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>> {
@get:NonNls
abstract val path: String
abstract val type: KClass<out T>
@@ -5,6 +5,7 @@
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.entity.*
@@ -198,7 +199,12 @@ object PathSettingType : SettingType<Path>() {
init {
validate { pathValue ->
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
}
}
@@ -206,7 +212,9 @@ object PathSettingType : SettingType<Path>() {
fun shouldExists() = validate { pathValue ->
if (isUnitTestMode) return@validate ValidationResult.OK
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
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.*
fun ParsingContext.parseSettingsMap(
@@ -18,7 +19,7 @@ fun ParsingContext.parseSettingsMap(
setting.type.parse(this, settingValue, setting.path).map { listOf(settingReference to it) }
}
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())
}
@@ -1,9 +1,13 @@
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 org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
abstract class Error {
@get:Nls
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 ParseError(override val message: String) : Error()
data class ParseError(@Nls override val message: String) : Error()
data class TemplateNotFoundError(val id: String) : Error() {
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() {
override val message: String
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" }
}
}
data class CircularTaskDependencyError(val taskName: String) : Error() {
data class CircularTaskDependencyError(@NonNls val taskName: String) : Error() {
@get:NonNls
override val message: String
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() {
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() {
@@ -56,9 +61,9 @@ data class ValidationError(val validationMessage: String) : Error() {
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
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
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.annotations.NonNls
import java.io.IOException
import java.nio.file.Path
import java.nio.file.Paths
@@ -26,19 +27,19 @@ inline infix fun <A : Any> ((A) -> A?).andThenNullable(crossinline then: (A) ->
@Suppress("NOTHING_TO_INLINE")
inline fun <T> idFunction(): (T) -> T = { it }
operator fun Path.div(other: String): Path =
operator fun Path.div(@NonNls other: String): Path =
resolve(other)
operator fun Path.div(other: Path): Path =
resolve(other.toString())
operator fun String.div(other: Path): Path =
operator fun @receiver:NonNls String.div(other: Path): Path =
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)
fun String.asPath(): Path = Paths.get(this)
fun @receiver:NonNls String.asPath(): Path = Paths.get(this)
fun <T : Any> safe(operation: () -> T): TaskResult<T> =
try {
@@ -1,5 +1,6 @@
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.ir.buildsystem.gradle.GradleIR
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() {
call("id") { +pluginId.quotified }
}
@@ -1,5 +1,6 @@
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.FreeIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
@@ -22,7 +23,7 @@ data class RawGradleIR(
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 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() {
when (dsl) {
GradlePrinter.GradleDsl.KOTLIN -> {
@@ -51,7 +52,7 @@ class CreateGradleValueIR(val name: String, val body: GradleIR) : GradleIR {
}
data class GradleCallIr(
val name: String,
@NonNls val name: String,
val parameters: List<BuildSystemIR> = emptyList(),
val isConstructorCall: Boolean = false,
) : GradleIR {
@@ -70,7 +71,7 @@ data class GradleCallIr(
}
data class GradleNewInstanceCall(
val name: String,
@NonNls val name: String,
val parameters: List<BuildSystemIR> = emptyList()
) : GradleIR {
override fun GradlePrinter.renderGradle() {
@@ -85,7 +86,7 @@ data class GradleNewInstanceCall(
data class GradleSectionIR(
val name: String,
@NonNls val name: String,
val body: BodyIR
) : GradleIR, FreeIR {
constructor(name: String, bodyBuilder: MutableList<BuildSystemIR>.() -> Unit) : this(
@@ -101,7 +102,7 @@ data class GradleSectionIR(
}
data class GradleAssignmentIR(
val target: String,
@NonNls val target: String,
val assignee: BuildSystemIR
) : GradleIR, FreeIR {
override fun GradlePrinter.renderGradle() {
@@ -111,7 +112,7 @@ data class GradleAssignmentIR(
}
data class GradleStringConstIR(
val text: String
@NonNls val text: String
) : GradleIR {
override fun GradlePrinter.renderGradle() {
+text.quotified
@@ -119,9 +120,9 @@ data class GradleStringConstIR(
}
data class CompilationAccessIr(
val targetName: String,
val compilationName: String,
val property: String?
@NonNls val targetName: String,
@NonNls val compilationName: String,
@NonNls val property: String?
) : GradleIR {
override fun GradlePrinter.renderGradle() {
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() {
qualifier.render(this)
when (dsl) {
@@ -1,5 +1,6 @@
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.FreeIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
@@ -26,7 +27,7 @@ data class GradleByNameTaskAccessIR(
}
data class GradleByClassTasksAccessIR(
val taskClass: String
@NonNls val taskClass: String
) : GradleTaskAccessIR {
override fun GradlePrinter.renderGradle() {
when (dsl) {
@@ -6,11 +6,12 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
data class SettingsGradleFileIR(
val projectName: String,
@NonNls val projectName: String,
val subProjects: List<String>,
override val irs: PersistentList<BuildSystemIR>
) : FileIR, GradleIR {
@@ -5,6 +5,7 @@
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.RepositoryWrapper
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
@@ -31,8 +32,8 @@ data class PluginRepositoryMavenIR(
}
data class MavenPropertyIR(
val name: String,
val value: String
@NonNls val name: String,
@NonNls val value: String
) : MavenIR {
override fun MavenPrinter.renderMaven() {
singleLineNode(name) { +value }
@@ -5,10 +5,11 @@
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.ir.buildsystem.gradle.*
fun runTaskIrs(mainClass: String, classPath: BuildSystemIR? = null) = buildList<BuildSystemIR> {
fun runTaskIrs(@NonNls mainClass: String, classPath: BuildSystemIR? = null) = buildList<BuildSystemIR> {
+ApplicationPluginIR(mainClass)
+GradleSectionIR("application", buildBody {
@@ -1,5 +1,6 @@
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.version.Version
@@ -7,12 +8,12 @@ sealed class LibraryArtifact
data class MavenArtifact(
val repository: Repository,
val groupId: String,
val artifactId: String
@NonNls val groupId: String,
@NonNls val artifactId: String
) : LibraryArtifact()
data class NpmArtifact(
val name: String
@NonNls val name: String
) : LibraryArtifact()
@@ -6,6 +6,8 @@
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.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
@@ -41,8 +43,6 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
override val moduleType: ModuleType
get() = ModuleType.android
override val greyText: String
get() = "Requires Android SDK"
override fun getPluginSettings(): List<PluginSettingReference<Any, SettingType<Any>>> =
listOf(AndroidPlugin::androidSdkPath.reference)
@@ -128,6 +128,8 @@ object AndroidTargetConfigurator : TargetConfigurator,
override val moduleSubType = ModuleSubType.android
override val moduleType = ModuleType.android
override val text = KotlinNewProjectWizardBundle.message("module.configurator.android")
override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin =
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 {
APPLICATION("Android Application", "com.android.application"),
LIBRARY("Android Library", "com.android.library")
enum class AndroidGradlePlugin(override val text: String, @NonNls val pluginName: String) : DisplayableSettingItem {
APPLICATION(
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
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.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
@@ -19,9 +20,11 @@ object AndroidSinglePlatformModuleConfigurator :
SinglePlatformModuleConfigurator,
AndroidModuleConfigurator {
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformAndroid
@NonNls
override val id = "android"
@NonNls
override val suggestedModuleName = "android"
override val text = "Android"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.android")
override val requiresRootBuildFile: Boolean = true
@@ -5,6 +5,8 @@
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.phases.GenerationPhase
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
object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, ModuleConfiguratorSettings() {
@NonNls
override val id = "IOS Module"
@NonNls
override val suggestedModuleName = "ios"
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 requiresRootBuildFile: Boolean = true
@@ -74,6 +82,7 @@ object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, M
.asPath()
)
@NonNls
private const val DEFAULT_APP_NAME = "appName"
val dependentModule by valueSetting<DependentModuleReference>(
@@ -6,6 +6,8 @@
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.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -22,9 +24,13 @@ interface JSConfigurator : ModuleConfiguratorWithModuleType {
object JsSingleplatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests, SinglePlatformModuleConfigurator {
override val moduleKind = ModuleKind.singleplatformJs
@NonNls
override val suggestedModuleName = "js"
@NonNls
override val id = "jsSinglepaltform"
override val text = "JS for Browser"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.js")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
@@ -199,8 +199,6 @@ fun Module.getConfiguratorSettings() = buildList<SettingReference<*, *>> {
interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor {
val moduleKind: ModuleKind
override val text: String
get() = id
val suggestedModuleName: String? get() = null
val canContainSubModules: Boolean get() = false
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSettingReference
@@ -24,7 +26,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings {
companion object : ModuleConfiguratorSettings() {
val testFramework by enumSetting<KotlinTestFramework>(
"Test Framework",
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework"),
neededAtPhase = GenerationPhase.PROJECT_GENERATION
) {
filter = filter@{ reference, kotlinTestFramework ->
@@ -67,9 +69,29 @@ enum class KotlinTestFramework(
val moduleType: ModuleType,
val dependencyNames: List<String>
) : DisplayableSettingItem {
JUNIT4("JUnit 4 Test Framework", ModuleType.jvm, listOf("test-junit")),
JUNIT5("JUnit 5 Test Framework", ModuleType.jvm, listOf("test-junit5")),
TEST_NG("Test NG Test Framework", ModuleType.jvm, listOf("test-testng")),
JS("JavaScript Test Framework", ModuleType.js, listOf("test-js")),
COMMON("Common Test Framework", ModuleType.common, listOf("test-common", "test-annotations-common")),
JUNIT4(
KotlinNewProjectWizardBundle.message("module.configurator.tests.setting.framework.junit4"),
ModuleType.jvm,
listOf("test-junit")
),
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
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.buildList
@@ -20,6 +22,8 @@ interface NativeTargetConfigurator : TargetConfigurator
class RealNativeTargetConfigurator private constructor(
override val moduleSubType: ModuleSubType
) : NativeTargetConfigurator, SimpleTargetConfigurator {
override val text: String = moduleSubType.name.capitalize()
override fun createInnerTargetIrs(reader: Reader, module: Module): List<BuildSystemIR> = if (moduleSubType.isIOS) {
listOf(
GradleSectionIR("binaries") {
@@ -43,8 +47,11 @@ class RealNativeTargetConfigurator private constructor(
object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenceTargetConfigurator {
override val moduleType = ModuleType.native
@NonNls
override val id = "nativeForCurrentSystem"
override val text = "Your system"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.native.for.current.system")
override fun Reader.createTargetIrs(
@@ -1,5 +1,6 @@
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.ModuleType
@@ -15,7 +16,7 @@ object TargetConfigurationGroups {
object NATIVE {
val LINUX = FinalTargetConfiguratorGroup(
"Linux",
KotlinNewProjectWizardBundle.message("module.configuration.group.linux"),
ModuleType.native,
listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.linuxX64),
@@ -26,7 +27,7 @@ object TargetConfigurationGroups {
)
val WINDOWS = FinalTargetConfiguratorGroup(
"Windows (MinGW)",
KotlinNewProjectWizardBundle.message("module.configuration.group.windows.mingw"),
ModuleType.native,
listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.mingwX64),
@@ -35,7 +36,7 @@ object TargetConfigurationGroups {
)
val MAC = FinalTargetConfiguratorGroup(
"macOS",
KotlinNewProjectWizardBundle.message("module.configuration.group.macos"),
ModuleType.native,
listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.macosX64)
@@ -43,7 +44,7 @@ object TargetConfigurationGroups {
)
val IOS = FinalTargetConfiguratorGroup(
"iOS",
KotlinNewProjectWizardBundle.message("module.configuration.group.ios"),
ModuleType.native,
listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.iosArm32),
@@ -53,7 +54,7 @@ object TargetConfigurationGroups {
)
val ANDROID_NATIVE = FinalTargetConfiguratorGroup(
"Android Native",
KotlinNewProjectWizardBundle.message("module.configuration.group.android.native"),
ModuleType.native,
listOf(
RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.androidNativeArm64),
@@ -1,6 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
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.buildList
@@ -41,7 +43,6 @@ interface SimpleTargetConfigurator : TargetConfigurator {
val moduleSubType: ModuleSubType
override val moduleType get() = moduleSubType.moduleType
override val id get() = "${moduleSubType.name}Target"
override val text get() = moduleSubType.name.capitalize()
override val suggestedModuleName: String? get() = moduleSubType.name
@@ -66,10 +67,15 @@ private fun Module.createTargetAccessIr(moduleSubType: ModuleSubType) =
interface JsTargetConfigurator : JSConfigurator, TargetConfigurator, SingleCoexistenceTargetConfigurator
object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWithTests {
@NonNls
override val id = "jsBrowser"
override val text = "Browser"
@NonNls
override val suggestedModuleName = "browser"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.js.browser")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JS
override fun Reader.createTargetIrs(
@@ -87,10 +93,14 @@ object JsBrowserTargetConfigurator : JsTargetConfigurator, ModuleConfiguratorWit
}
object JsNodeTargetConfigurator : JsTargetConfigurator {
@NonNls
override val id = "jsNode"
override val text = "Node.js"
@NonNls
override val suggestedModuleName = "nodeJs"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.js.node")
override fun Reader.createTargetIrs(
module: Module
@@ -108,6 +118,7 @@ object JsNodeTargetConfigurator : JsTargetConfigurator {
object CommonTargetConfigurator : TargetConfiguratorWithTests(), SimpleTargetConfigurator, SingleCoexistenceTargetConfigurator {
override val moduleSubType = ModuleSubType.common
override val text: String = KotlinNewProjectWizardBundle.message("module.configurator.common")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.COMMON
}
@@ -117,8 +128,7 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
SimpleTargetConfigurator {
override val moduleSubType = ModuleSubType.jvm
override val text: String
get() = "JVM"
override val text: String = KotlinNewProjectWizardBundle.message("module.configurator.jvm")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
@@ -149,7 +159,10 @@ object JvmTargetConfigurator : JvmModuleConfigurator,
Settings.javaSupport
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)
}
}
@@ -1,5 +1,6 @@
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.settings.DisplayableSettingItem
@@ -9,22 +10,22 @@ interface DisplayableTargetConfiguratorGroup : TargetConfiguratorGroup, Displaya
val moduleType: ModuleType
}
interface TargetConfiguratorGroupWithSubItems: TargetConfiguratorGroup {
interface TargetConfiguratorGroupWithSubItems : TargetConfiguratorGroup {
val subItems: List<DisplayableSettingItem>
}
data class StepTargetConfiguratorGroup(
override val text: String,
@Nls override val text: String,
override val moduleType: ModuleType,
override val subItems: List<DisplayableSettingItem>
): DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
) : DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
data class FinalTargetConfiguratorGroup(
override val text: String,
@Nls override val text: String,
override val moduleType: ModuleType,
override val subItems: List<DisplayableSettingItem>
): DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
) : DisplayableTargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
data class FirstStepTargetConfiguratorGroup(
override val subItems: List<DisplayableSettingItem>
): TargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
) : TargetConfiguratorGroup, TargetConfiguratorGroupWithSubItems
@@ -1,6 +1,8 @@
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.buildList
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 {
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)
}
}
@@ -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_8("1.8"),
JVM_9("9"),
@@ -54,9 +59,13 @@ val ModuleConfigurator.moduleType: ModuleType?
object MppModuleConfigurator : ModuleConfigurator {
override val moduleKind = ModuleKind.multiplatform
@NonNls
override val suggestedModuleName = "shared"
@NonNls
override val id = "multiplatform"
override val text = "Multiplatform"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.mpp")
override val canContainSubModules = true
override fun createKotlinPluginIR(configurationData: ModulesToIrConversionData, module: Module): KotlinBuildSystemPluginIR? =
@@ -76,8 +85,10 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
ModuleConfiguratorWithModuleType {
override val moduleType get() = ModuleType.jvm
override val moduleKind: ModuleKind get() = ModuleKind.singleplatformJvm
override val suggestedModuleName = "jvm"
override val id = "JVM Module"
@NonNls override val suggestedModuleName = "jvm"
@NonNls override val id = "JVM Module"
override val text = KotlinNewProjectWizardBundle.message("module.configurator.jvm")
override fun defaultTestFramework(): KotlinTestFramework = KotlinTestFramework.JUNIT4
@@ -120,9 +131,6 @@ object JvmSinglePlatformModuleConfigurator : JvmModuleConfigurator,
}
val ModuleType.defaultTarget
get() = when (this) {
ModuleType.jvm -> JvmTargetConfigurator
@@ -5,6 +5,7 @@
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.Plugin
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) {
val androidSdkPath by pathSetting(
"Android SDK Path",
KotlinNewProjectWizardBundle.message("plugin.android.setting.sdk"),
neededAtPhase = GenerationPhase.PROJECT_GENERATION
) {
isSavable = true
@@ -1,7 +1,7 @@
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.entity.StringValidators
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
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("."))
}
val name by stringSetting("Name", GenerationPhase.FIRST_STEP) {
val name by stringSetting(
KotlinNewProjectWizardBundle.message("plugin.structure.setting.name"),
GenerationPhase.FIRST_STEP
) {
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
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()
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()
validate(StringValidators.shouldBeValidIdentifier("Version", setOf('_', '-', '.')))
validate(StringValidators.shouldBeValidIdentifier(title, setOf('_', '-', '.')))
defaultValue = value("1.0-SNAPSHOT")
}
@@ -1,6 +1,9 @@
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.entity.ValidationResult
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
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
filter = { _, type ->
val service = service<BuildSystemAvailabilityWizardService>()
@@ -33,8 +39,15 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) {
if (!buildSystemType.isGradle
&& KotlinPlugin::projectKind.reference.notRequiredSettingValue != ProjectKind.Singleplatform
) {
val projectKind = KotlinPlugin::projectKind.reference.notRequiredSettingValue?.text?.capitalize() ?: "Project"
ValidationResult.ValidationError("$projectKind cannot be generated using ${buildSystemType.text}")
val projectKind = KotlinPlugin::projectKind.reference.notRequiredSettingValue?.text?.capitalize()
?: KotlinNewProjectWizardBundle.message("project")
ValidationResult.ValidationError(
KotlinNewProjectWizardBundle.message(
"plugin.buildsystem.setting.type.error.wrong.project.kind",
projectKind,
buildSystemType.text
)
)
} else ValidationResult.OK
}
}
@@ -106,14 +119,14 @@ data class BuildSystemData(
data class BuildFileData(
val createPrinter: () -> BuildFilePrinter,
val buildFileName: String
@NonNls val buildFileName: String
)
enum class BuildSystemType(override val text: String) : DisplayableSettingItem {
GradleKotlinDsl("Gradle Kotlin"),
GradleGroovyDsl("Gradle Groovy"),
Jps("IntelliJ"),
Maven("Maven")
enum class BuildSystemType(@Nls override val text: String) : DisplayableSettingItem {
GradleKotlinDsl(KotlinNewProjectWizardBundle.message("buildsystem.type.gradle.kotlin")),
GradleGroovyDsl(KotlinNewProjectWizardBundle.message("buildsystem.type.gradle.groovy")),
Jps(KotlinNewProjectWizardBundle.message("buildsystem.type.intellij")),
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
class JpsPlugin(context: Context) : BuildSystemPlugin(context) {
override val title: String = "IDEA"
val addBuildSystemData by addBuildSystemData(
BuildSystemData(
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
class MavenPlugin(context: Context) : BuildSystemPlugin(context) {
override val title: String = "Maven"
private val isMaven = checker {
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
class GroovyDslPlugin(context: Context) : GradlePlugin(context) {
override val title: String = "Gradle (Groovy DSL)"
val addBuildSystemData by addBuildSystemData(
BuildSystemData(
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
class KotlinDslPlugin(context: Context) : GradlePlugin(context) {
override val title: String = "Gradle (Kotlin DSL)"
val addBuildSystemData by addBuildSystemData(
BuildSystemData(
type = BuildSystemType.GradleKotlinDsl,
@@ -1,5 +1,6 @@
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.core.*
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 initKotlinVersions by pipelineTask(GenerationPhase.PREPARE_GENERATION) {
title = "Downloading list of Kotlin versions"
title = KotlinNewProjectWizardBundle.message("plugin.kotlin.downloading.kotlin.versions")
withAction {
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() =
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 ->
val allModules = value.withAllSubModules()
val duplicatedModules = allModules.findDuplicatesByName()
if (duplicatedModules.isEmpty()) ValidationResult.OK
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()
if (duplicatedModules.isEmpty()) ValidationResult.OK
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()
}
@@ -119,9 +135,6 @@ class KotlinPlugin(context: Context) : Plugin(context) {
companion object {
// TODO update default versions
private val DEFAULT_VERSION = Version.fromString("1.3.61")
private val moduleDependenciesValidator = settingValidator<List<Module>> { modules ->
val allModules = modules.withAllSubModules(includeSourcesets = true).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.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()
}
@@ -139,10 +158,10 @@ class KotlinPlugin(context: Context) : Plugin(context) {
}
enum class ProjectKind(override val text: String) : DisplayableSettingItem {
Singleplatform("Singleplatform project"),
Multiplatform("Multiplatform project"),
Android("Android project"),
Js("Kotlin/JS project")
Singleplatform(KotlinNewProjectWizardBundle.message("project.kind.singleplatform")),
Multiplatform(KotlinNewProjectWizardBundle.message("project.kind.multiplatform")),
Android(KotlinNewProjectWizardBundle.message("project.kind.android")),
Js(KotlinNewProjectWizardBundle.message("project.kind.kotlin.js"))
}
fun List<Module>.withAllSubModules(includeSourcesets: Boolean = false): List<Module> = buildList {
@@ -1,17 +1,18 @@
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 java.util.*
//TODO maybe split into interfaces like it made with module configurators
@Suppress("EnumEntryName")
enum class ModuleType(val projectTypeName: String) {
jvm("Kotlin/JVM"),
js("Kotlin/JS"),
native("Kotlin/Native"),
common("Common"),
android("Android"),
// ios("iOS")
jvm(KotlinNewProjectWizardBundle.message("module.type.jvm")),
js(KotlinNewProjectWizardBundle.message("module.type.js")),
native(KotlinNewProjectWizardBundle.message("module.type.native")),
common(KotlinNewProjectWizardBundle.message("module.type.common")),
android(KotlinNewProjectWizardBundle.message("module.type.android")),
// ios(KotlinNewProjectWizardBundle.message("module.type.ios"))
;
@@ -1,5 +1,6 @@
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.render
@@ -25,7 +26,7 @@ abstract class BuildFilePrinter {
builder.append(this)
}
operator fun String.unaryPlus() {
operator fun @receiver:NonNls String.unaryPlus() {
builder.append(this)
}
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.printer
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
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'"
}
fun call(name: String, forceBrackets: Boolean = false, body: () -> Unit) {
fun call(@NonNls name: String, forceBrackets: Boolean = false, body: () -> Unit) {
+name
when {
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
+" "
inBrackets {
@@ -49,7 +50,7 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
}
fun <I : BuildSystemIR> sectionCall(
name: String,
@NonNls name: String,
irs: List<I>,
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 -> {
+"$target = "
assignee()
@@ -69,13 +70,13 @@ class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFil
GradleDsl.GROOVY -> call(target, forceBrackets = false, body = assignee)
}
fun assignment(target: String, assignee: () -> Unit) {
fun assignment(@NonNls target: String, assignee: () -> Unit) {
+"$target = "
assignee()
}
inline fun getting(name: String, prefix: String?, body: () -> Unit = {}) {
inline fun getting(@NonNls name: String, @NonNls prefix: String?, body: () -> Unit = {}) {
when (dsl) {
GradleDsl.GROOVY -> {
prefix?.let { +it; +"." }
@@ -1,12 +1,13 @@
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.render
class
MavenPrinter(override val indent: Int = 4) : BuildFilePrinter() {
fun node(
name: String,
@NonNls name: String,
attributes: List<Pair<String, String>> = emptyList(),
singleLine: Boolean = false,
body: () -> Unit
@@ -44,7 +45,7 @@ MavenPrinter(override val indent: Int = 4) : BuildFilePrinter() {
get() = "\"$this\""
fun singleLineNode(
name: String,
@NonNls name: String,
attributes: List<Pair<String, String>> = emptyList(),
body: () -> Unit
) = node(name, attributes, singleLine = true, body = body)
@@ -1,5 +1,7 @@
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.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
@@ -133,8 +135,10 @@ private fun ModuleType.createDefaultTarget(
) = MultiplatformTargetModule(name, defaultTarget, createDefaultSourcesets())
object EmptySingleplatformProjectTemplate : ProjectTemplate() {
override val title = "Backend Application"
override val description = "Create a backend application with Kotlin/JVM."
override val title = KotlinNewProjectWizardBundle.message("project.template.empty.singleplatform.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.empty.singleplatform.description")
@NonNls
override val suggestedProjectName = "myKotlinJvmProject"
override val projectKind = ProjectKind.Singleplatform
@@ -147,8 +151,10 @@ object EmptySingleplatformProjectTemplate : ProjectTemplate() {
}
object EmptyMultiplatformProjectTemplate : ProjectTemplate() {
override val title = "Multiplatform Application"
override val description = "Create applications for different platforms that support sharing common code."
override val title = KotlinNewProjectWizardBundle.message("project.template.empty.mpp.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.empty.mpp.description")
@NonNls
override val suggestedProjectName = "myKotlinMultiplatformProject"
override val projectKind = ProjectKind.Multiplatform
@@ -161,8 +167,10 @@ object EmptyMultiplatformProjectTemplate : ProjectTemplate() {
}
object JvmConsoleApplication : ProjectTemplate() {
override val title = "Console Application"
override val description = "Create a console application with Kotlin/JVM. Use it for prototyping or testing purposes."
override val title = KotlinNewProjectWizardBundle.message("project.template.empty.jvm.console.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.empty.jvm.console.description")
@NonNls
override val suggestedProjectName = "myConsoleApplication"
override val projectKind = ProjectKind.Singleplatform
@@ -180,8 +188,10 @@ object JvmConsoleApplication : ProjectTemplate() {
}
object MultiplatformLibrary : ProjectTemplate() {
override val title = "Multiplatform Library"
override val description = "Create a library for sharing common code among different platforms."
override val title = KotlinNewProjectWizardBundle.message("project.template.mpp.lib.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.mpp.lib.description")
@NonNls
override val suggestedProjectName = "myMultiplatformLibrary"
override val projectKind = ProjectKind.Multiplatform
@@ -202,9 +212,10 @@ object MultiplatformLibrary : ProjectTemplate() {
}
object JvmServerJsClient : ProjectTemplate() {
override val title: String = "Full-Stack Web Application"
override val description: String = "" +
"Create a fully-functional web application using Kotlin/JS for the frontend and Kotlin/JVM for the backend."
override val title: String = KotlinNewProjectWizardBundle.message("project.template.full.stack.title")
override val description: String = KotlinNewProjectWizardBundle.message("project.template.full.stack.description")
@NonNls
override val suggestedProjectName: String = "myFullStackApplication"
override val projectKind: ProjectKind = ProjectKind.Multiplatform
override val setsPluginSettings: List<SettingWithValue<*, *>> = listOf(
@@ -227,9 +238,10 @@ object JvmServerJsClient : ProjectTemplate() {
}
object NativeConsoleApplication : ProjectTemplate() {
override val title = "Native Application"
override val description =
"Create an application with Kotlin/Native that works as a standalone application under a specific platform."
override val title = KotlinNewProjectWizardBundle.message("project.template.native.console.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.native.console.description")
@NonNls
override val suggestedProjectName = "myNativeConsoleApp"
override val projectKind = ProjectKind.Multiplatform
@@ -252,8 +264,10 @@ object NativeConsoleApplication : ProjectTemplate() {
}
object JsBrowserApplication : ProjectTemplate() {
override val title = "Frontend Application"
override val description = "Create a frontend application with Kotlin/JS if you already have a backend."
override val title = KotlinNewProjectWizardBundle.message("project.template.frontend.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.frontend.description")
@NonNls
override val suggestedProjectName = "myKotlinJsApplication"
override val projectKind = ProjectKind.Js
@@ -274,10 +288,10 @@ object JsBrowserApplication : 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 =
"Create mobile applications for iOS and Android with Kotlin Multiplatform Mobile, which supports sharing common code between platforms."
@NonNls
override val suggestedProjectName = "myIOSApplication"
override val projectKind = ProjectKind.Multiplatform
@@ -325,8 +339,10 @@ object MPPMobileApplication : ProjectTemplate() {
}
object MultiplatformMobileLibrary : ProjectTemplate() {
override val title = "Multiplatform Mobile Library"
override val description = "Create a library that supports sharing code between iOS and Android."
override val title = KotlinNewProjectWizardBundle.message("project.template.mpp.mobile.lib.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.mpp.mobile.lib.description")
@NonNls
override val suggestedProjectName = "myMppMobileLibrary"
override val projectKind = ProjectKind.Multiplatform
@@ -1,7 +1,12 @@
package org.jetbrains.kotlin.tools.projectWizard.settings
import org.jetbrains.annotations.Nls
interface DisplayableSettingItem {
@get:Nls
val text: String
@get:Nls
val greyText: String?
get() = null
}
@@ -1,9 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator
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.entity.*
@@ -29,7 +31,7 @@ enum class ModuleKind : DisplayableSettingItem {
// TODO separate to classes
class Module(
var name: String,
@NonNls var name: String,
val configurator: ModuleConfigurator,
var template: Template?,
val sourcesets: List<Sourceset>,
@@ -62,12 +64,12 @@ class Module(
override val text: String get() = name
override val greyText: String?
get() = when {
kind == ModuleKind.target -> "${configurator.text} Target"
configurator == MppModuleConfigurator -> "MPP Module"
configurator == AndroidSinglePlatformModuleConfigurator -> "Android Module"
configurator == IOSSinglePlatformModuleConfigurator -> "IOS Module"
configurator == JsSingleplatformModuleConfigurator -> "JS Module"
else -> "Module"
kind == ModuleKind.target -> configurator.text + KotlinNewProjectWizardBundle.message("module.kind.target")
configurator == MppModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.mpp.module")
configurator == AndroidSinglePlatformModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.android.module")
configurator == IOSSinglePlatformModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.ios.module")
configurator == JsSingleplatformModuleConfigurator -> KotlinNewProjectWizardBundle.message("module.kind.js.module")
else -> KotlinNewProjectWizardBundle.message("module.kind.module")
}
fun SettingsWriter.initDefaultValuesForSettings() {
@@ -101,10 +103,12 @@ class 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 ->
StringValidators.shouldBeValidIdentifier("Module name `${module.name}`", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)
.validate(this, module.name)
StringValidators.shouldBeValidIdentifier(
KotlinNewProjectWizardBundle.message("module.name", module.name),
ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES
).validate(this, module.name)
}
val moduleConfiguratorValidator = settingValidator<Module> { module ->
@@ -117,7 +121,12 @@ class Module(
}
val value = reference?.notRequiredSettingValue
?: 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)
}.fold()
}
@@ -129,7 +138,12 @@ class Module(
template.settings.map { setting ->
val value = setting.reference.notRequiredSettingValue
?: 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)
}.fold()
}
@@ -157,7 +171,7 @@ val Module.isRootModule
get() = parent == null
@Suppress("FunctionName")
fun MultiplatformTargetModule(name: String, configurator: ModuleConfigurator, sourcesets: List<Sourceset>) =
fun MultiplatformTargetModule(@NonNls name: String, configurator: ModuleConfigurator, sourcesets: List<Sourceset>) =
Module(
name,
configurator,
@@ -167,7 +181,7 @@ fun MultiplatformTargetModule(name: String, configurator: ModuleConfigurator, so
)
@Suppress("FunctionName")
fun MultiplatformModule(name: String, targets: List<Module> = emptyList()) =
fun MultiplatformModule(@NonNls name: String, targets: List<Module> = emptyList()) =
Module(
name,
MppModuleConfigurator,
@@ -177,7 +191,7 @@ fun MultiplatformModule(name: String, targets: List<Module> = emptyList()) =
)
@Suppress("FunctionName")
fun SingleplatformModule(name: String, sourcesets: List<Sourceset>) =
fun SingleplatformModule(@NonNls name: String, sourcesets: List<Sourceset>) =
Module(
name,
JvmSinglePlatformModuleConfigurator,
@@ -1,18 +1,20 @@
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.settings.DisplayableSettingItem
data class Version(override val text: String) : DisplayableSettingItem {
data class Version(@NonNls override val text: String) : DisplayableSettingItem {
override fun toString(): String = text
companion object {
fun fromString(string: String) = Version(string)
fun fromString(@NonNls string: String) = Version(string)
val parser: Parser<Version> = valueParser { value, path ->
val (stringVersion) = value.parseAs<String>(path)
safe { fromString(stringVersion) }.mapFailure {
ParseError("Bad version format for setting `$path`")
ParseError(KotlinNewProjectWizardBundle.message("version.error.bad.format", path))
}.get()
}
}
@@ -1,5 +1,6 @@
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.asPath
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.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class ConsoleJvmApplicationTemplate : Template() {
@NonNls
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 fun Writer.getIrsToAddToBuildFile(
@@ -1,5 +1,6 @@
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.settings.buildsystem.SourcesetType
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
// 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(
templateId,
Paths.get(templateId).fileName.toString().removeSuffix(".vm").asPath()
@@ -6,6 +6,7 @@
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.asPath
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.version.Version
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.InterceptionPoint
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class KtorServerTemplate : Template() {
override val title: String = "Ktor Server"
override val description: String = "Configurable Ktor web server for building web applications"
override val title: String = KotlinNewProjectWizardBundle.message("module.template.ktor.server.title")
override val description: String = KotlinNewProjectWizardBundle.message("module.template.ktor.server.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
@NonNls
override val id: String = "ktorServer"
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
)
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 routes = InterceptionPoint("routes", emptyList<String>())
@@ -65,7 +72,7 @@ class KtorServerTemplate : Template() {
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),
Version.fromString("1.2.6"),
DependencyType.MAIN
@@ -74,9 +81,18 @@ private fun ktorArtifactDependency(name: String) = ArtifactBasedLibraryDependenc
@Suppress("MemberVisibilityCanBePrivate")
enum class KtorServerEngine(val engineName: String, val dependencyName: String) : DisplayableSettingItem {
Netty("Netty", dependencyName = "ktor-server-netty"),
Tomcat("Tomcat", dependencyName = "ktor-server-tomcat"),
Jetty("Jetty", dependencyName = "ktor-server-jetty");
Netty(
KotlinNewProjectWizardBundle.message("module.template.ktor.server.setting.engine.netty"),
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
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.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class NativeConsoleApplicationTemplate : Template() {
override val title: String = "Native Application"
override val description: String = "Simple Kotlin/Native application for your operating system"
override val title: String = KotlinNewProjectWizardBundle.message("module.template.native.console.title")
override val description: String = KotlinNewProjectWizardBundle.message("module.template.native.console.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.native)
override val id: String = "nativeConsoleApp"
@@ -6,6 +6,8 @@
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.WizardRunConfiguration
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.transformers.interceptors.TemplateInterceptor
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
class SimpleJsClientTemplate : Template() {
override val title: String = "Frontend Application"
override val description: String = "Configurable Kotlin/JS frontend application"
override val title: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.title")
override val description: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.js)
@NonNls
override val id: String = "simpleJsClient"
override fun isApplicableTo(module: Module): Boolean =
module.configurator == JsBrowserTargetConfigurator
|| 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)
}
@@ -45,12 +54,12 @@ class SimpleJsClientTemplate : Template() {
override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList {
if (module.originalModule.kind == ModuleKind.singleplatformJs) {
+WizardGradleRunConfiguration(
"BrowserDevelopmentRun in continuous mode",
KotlinNewProjectWizardBundle.message("module.template.js.simple.run.configuration.dev"),
"browserDevelopmentRun",
listOf("--continuous")
)
+WizardGradleRunConfiguration(
"BrowserProductionRun in continuous mode",
KotlinNewProjectWizardBundle.message("module.template.js.simple.run.configuration.prod"),
"browserProductionRun",
listOf("--continuous")
)
@@ -221,8 +230,13 @@ class SimpleJsClientTemplate : Template() {
}
companion object {
@NonNls
private const val JS_OUTPUT_FILE_NAME = "output.js"
@NonNls
private const val WEBPACK_TASK_CLASS = "KotlinWebpack"
@NonNls
private const val WEBPACK_TASK_SUFFIX = "BrowserProductionWebpack"
}
@@ -270,9 +284,9 @@ class SimpleJsClientTemplate : Template() {
)
}
enum class RenderEngine(override val text: String) : DisplayableSettingItem {
KOTLINX_HTML("Use statically typed Kotlinx.html DSL"),
REACT("Use Kotlin-wrapped React library"),
REACT_WITH_STYLED("Use Kotlin-wrapped React framework together with Styled Components"),
enum class RenderEngine(@Nls override val text: String) : DisplayableSettingItem {
KOTLINX_HTML(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.kotlinx.html")),
REACT(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react")),
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
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>(
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)
}
}