summaryrefslogtreecommitdiff
path: root/project-wizard
diff options
context:
space:
mode:
authorIlya Kirillov <ilya.kirillov@jetbrains.com>2020-10-01 16:03:32 +0300
committerkotlin-ide-monorepo-bot <kotlin-ide-monorepo-bot-no-reply@jetbrains.com>2020-10-19 11:29:00 +0000
commitd1fe016887caa84ac5ab320592796f024835a7f2 (patch)
tree0b2dde10a8715a832d5663dbc4a3fb8cde271b93 /project-wizard
parent91f9c91d99fde4245cf5b284dcd86fa029af7394 (diff)
downloadintellij-kotlin-d1fe016887caa84ac5ab320592796f024835a7f2.tar.gz
Wizard: add compose desktop template
Original commit: db069c3264c0ba107864fb2c69624ec43325adc4 GitOrigin-RevId: 730073710b6febec43a8eef47e35f644a8051e65
Diffstat (limited to 'project-wizard')
-rw-r--r--project-wizard/cli/test/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java10
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle33
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle.kts30
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle10
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle.kts10
-rw-r--r--project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties8
-rw-r--r--project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeDesktopTemplate/main.kt20
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt1
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt2
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildSystemPluginIR.kt10
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt13
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt1
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt3
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ComposeTemplatesPlugin.kt26
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt32
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt8
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeJvmDesktopTemplate.kt61
17 files changed, 274 insertions, 4 deletions
diff --git a/project-wizard/cli/test/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java b/project-wizard/cli/test/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java
index fdedbc141b76..4b92d2361374 100644
--- a/project-wizard/cli/test/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java
+++ b/project-wizard/cli/test/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBuildFileGenerationTestGenerated.java
@@ -70,4 +70,14 @@ public class ProjectTemplateBuildFileGenerationTestGenerated extends AbstractPro
public void testNativeApplication() throws Exception {
runTest("testData/projectTemplatesBuildFileGeneration/nativeApplication/");
}
+
+ @TestMetadata("сomposeMultiplatformApplication")
+ public void testComposeMultiplatformApplication() throws Exception {
+ runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/");
+ }
+
+ @TestMetadata("composeDesktopApplication")
+ public void testComposeDesktopApplication() throws Exception {
+ runTest("libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/");
+ }
}
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle
new file mode 100644
index 000000000000..405a4056ad24
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle
@@ -0,0 +1,33 @@
+import org.jetbrains.compose.compose
+
+plugins {
+ id 'org.jetbrains.kotlin.jvm' version 'KOTLIN_VERSION'
+ id 'org.jetbrains.compose' version '0.1.0-build63'
+ id 'application'
+}
+
+group = 'me.user'
+version = '1.0-SNAPSHOT'
+
+repositories {
+ jcenter()
+ mavenCentral()
+ maven { url 'KOTLIN_REPO' }
+ maven { url 'https://maven.pkg.jetbrains.space/public/p/compose/dev' }
+}
+
+dependencies {
+ implementation compose.desktop.all
+}
+
+compileKotlin {
+ kotlinOptions.jvmTarget = '1.8'
+}
+
+compileTestKotlin {
+ kotlinOptions.jvmTarget = '1.8'
+}
+
+application {
+ mainClassName = 'MainKt'
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle.kts
new file mode 100644
index 000000000000..0389195322d7
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/build.gradle.kts
@@ -0,0 +1,30 @@
+import org.jetbrains.compose.compose
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ kotlin("jvm") version "KOTLIN_VERSION"
+ id("org.jetbrains.compose") version "0.1.0-build63"
+ application
+}
+
+group = "me.user"
+version = "1.0-SNAPSHOT"
+
+repositories {
+ jcenter()
+ mavenCentral()
+ maven { url = uri("KOTLIN_REPO") }
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
+}
+
+dependencies {
+ implementation(compose.desktop.all)
+}
+
+tasks.withType<KotlinCompile>() {
+ kotlinOptions.jvmTarget = "1.8"
+}
+
+application {
+ mainClassName = "MainKt"
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle
new file mode 100644
index 000000000000..64e250c0e625
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle
@@ -0,0 +1,10 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ mavenCentral()
+ maven { url 'KOTLIN_REPO' }
+ maven { url 'https://maven.pkg.jetbrains.space/public/p/compose/dev' }
+ }
+
+}
+rootProject.name = 'composeDesktopApplication' \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle.kts
new file mode 100644
index 000000000000..0e1e742260ba
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeDesktopApplication/settings.gradle.kts
@@ -0,0 +1,10 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ mavenCentral()
+ maven { url = uri("KOTLIN_REPO") }
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
+ }
+
+}
+rootProject.name = "composeDesktopApplication" \ No newline at end of file
diff --git a/project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties b/project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties
index d38fa0eb3e48..7a54394c76a0 100644
--- a/project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties
+++ b/project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties
@@ -39,6 +39,7 @@ project.kind.android=Android
project.kind.kotlin.js=Kotlin/JS
project.kind.multiplatform=Multiplatform
project.kind.singleplatform=JVM
+project.kind.compose=JetBrains Compose
project=Project
@@ -147,9 +148,16 @@ project.template.mpp.mobile.lib.title=Mobile Library
project.template.mpp.mobile.lib.description=Library that supports sharing code between iOS and Android.
+project.template.compose.desktop.title=Desktop
+project.template.compose.desktop.description=A Compose application targeting the desktop JVM platform (Windows, Linux, macOS)
+
+
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.compose.desktop.title=Compose Desktop Application
+module.template.compose.desktop.description=A Compose application targeting the desktop JVM platform
+
module.template.mpp.mobile.title=Mobile Application
module.template.mpp.mobile.description=Mobile applications for iOS and Android with Kotlin Multiplatform Mobile, which supports sharing common code between platforms.
diff --git a/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeDesktopTemplate/main.kt b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeDesktopTemplate/main.kt
new file mode 100644
index 000000000000..4642415a5033
--- /dev/null
+++ b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeDesktopTemplate/main.kt
@@ -0,0 +1,20 @@
+import androidx.compose.desktop.Window
+import androidx.compose.foundation.Text
+import androidx.compose.material.Button
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+
+fun main() = Window {
+ var text by remember { mutableStateOf("Hello, World!") }
+
+ MaterialTheme {
+ Button(onClick = {
+ text = "Hello, Desktop!"
+ }) {
+ Text(text)
+ }
+ }
+} \ No newline at end of file
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt
index d40d30f43c7d..daae1de58d88 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt
@@ -14,6 +14,7 @@ object Versions {
val KTOR = version("1.4.0")
val JUNIT = version("4.13")
val JUNIT5 = version("5.6.0")
+ val JETBRAINS_COMPOSE = version("0.1.0-build63")
object ANDROID {
val ANDROID_MATERIAL = version("1.2.1")
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt
index 6331efdb7e7f..ae5343cc522b 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt
@@ -17,7 +17,7 @@ import java.nio.file.Path
interface FileIR : BuildSystemIR, IrsOwner
-data class BuildFileIR(
+data class BuildFileIR constructor(
val name: String,
val directoryPath: Path,
val modules: ModulesStructureIR,
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildSystemPluginIR.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildSystemPluginIR.kt
index e988eb83f0ec..0c7eea1ca39e 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildSystemPluginIR.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildSystemPluginIR.kt
@@ -32,9 +32,17 @@ data class ApplicationPluginIR(val mainClass: String) : DefaultBuildSystemPlugin
}
}
-data class GradleOnlyPluginByNameIR(@NonNls val pluginId: String, override val priority: Int? = null) : BuildSystemPluginIR, GradleIR {
+data class GradleOnlyPluginByNameIR(
+ @NonNls val pluginId: String,
+ val version: Version? = null,
+ override val priority: Int? = null,
+) : BuildSystemPluginIR, GradleIR {
override fun GradlePrinter.renderGradle() {
call("id") { +pluginId.quotified }
+ version?.let { version ->
+ +" version "
+ +version.text.quotified
+ }
}
}
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt
index 6d4d12713091..29698bf7745b 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/DependencyIR.kt
@@ -168,6 +168,19 @@ data class KotlinArbitraryDependencyIR(
override fun withDependencyType(type: DependencyType): KotlinArbitraryDependencyIR = copy(dependencyType = type)
}
+data class CustomGradleDependencyDependencyIR(
+ val dependency: String,
+ override val dependencyType: DependencyType
+) : DependencyIR, GradleIR {
+ override fun withDependencyType(type: DependencyType): CustomGradleDependencyDependencyIR = copy(dependencyType = type)
+
+ override fun GradlePrinter.renderGradle() {
+ call(dependencyType.getGradleName()) {
+ +dependency
+ }
+ }
+}
+
enum class StdlibType(val artifact: String) {
StdlibJdk7("stdlib-jdk7"),
StdlibJdk8("stdlib-jdk8"),
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt
index b4f3c584bb20..9dcf07de2fd8 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt
@@ -33,6 +33,7 @@ object Plugins {
ReactJsTemplatesPlugin(context),
SimpleNodeJsTemplatesPlugin(context),
NativeConsoleApplicationTemplatePlugin(context),
+ ComposeTemplatesPlugin(context),
MobileMppTemplatePlugin(context),
)
}
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt
index 8c3d44f37889..ed9e01e81a43 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt
@@ -198,7 +198,8 @@ enum class ProjectKind(override val text: String) : DisplayableSettingItem {
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"))
+ Js(KotlinNewProjectWizardBundle.message("project.kind.kotlin.js")),
+ COMPOSE(KotlinNewProjectWizardBundle.message("project.kind.compose"))
}
fun List<Module>.withAllSubModules(includeSourcesets: Boolean = false): List<Module> = buildList {
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ComposeTemplatesPlugin.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ComposeTemplatesPlugin.kt
new file mode 100644
index 000000000000..fce25b9a4a36
--- /dev/null
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ComposeTemplatesPlugin.kt
@@ -0,0 +1,26 @@
+package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
+
+import org.jetbrains.kotlin.tools.projectWizard.core.Context
+import org.jetbrains.kotlin.tools.projectWizard.core.PluginSettingsOwner
+import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
+import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
+import org.jetbrains.kotlin.tools.projectWizard.templates.compose.ComposeJvmDesktopTemplate
+
+class ComposeTemplatesPlugin(context: Context) : TemplatePlugin(context) {
+ override val path = pluginPath
+
+ override val pipelineTasks: List<PipelineTask> = super.pipelineTasks +
+ listOf(
+ addTemplate,
+ )
+
+ companion object : PluginSettingsOwner() {
+ override val pluginPath = "template.compose"
+
+ val addTemplate by pipelineTask(GenerationPhase.PREPARE) {
+ withAction {
+ TemplatesPlugin.addTemplate.execute(ComposeJvmDesktopTemplate())
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt
index e5a4a756c677..eeddd63453b4 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.templates.*
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JvmSinglePlatformModuleConfigurator
+import org.jetbrains.kotlin.tools.projectWizard.templates.compose.ComposeJvmDesktopTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.mpp.MobileMppTemplate
sealed class ProjectTemplate : DisplayableSettingItem {
@@ -80,7 +82,8 @@ sealed class ProjectTemplate : DisplayableSettingItem {
FrontendApplicationProjectTemplate,
ReactApplicationProjectTemplate,
FullStackWebApplicationProjectTemplate,
- NodeJsApplicationProjectTemplate
+ NodeJsApplicationProjectTemplate,
+ ComposeDesktopApplicationProjectTemplate,
)
fun byId(id: String): ProjectTemplate? = ALL.firstOrNull {
@@ -443,4 +446,31 @@ object NodeJsApplicationProjectTemplate : ProjectTemplate() {
)
)
)
+}
+
+object ComposeDesktopApplicationProjectTemplate : ProjectTemplate() {
+ override val title = KotlinNewProjectWizardBundle.message("project.template.compose.desktop.title")
+ override val description = KotlinNewProjectWizardBundle.message("project.template.compose.desktop.description")
+ override val id = "composeDesktopApplication"
+
+ @NonNls
+ override val suggestedProjectName = "myComposeDesktopApplication"
+ override val projectKind = ProjectKind.COMPOSE
+
+ override val setsPluginSettings: List<SettingWithValue<*, *>>
+ get() = listOf(
+ KotlinPlugin.modules.reference withValue listOf(
+ Module(
+ "compose",
+ JvmSinglePlatformModuleConfigurator,
+ template = ComposeJvmDesktopTemplate(),
+ sourcesets = SourcesetType.ALL.map { type ->
+ Sourceset(type, dependencies = emptyList())
+ },
+ subModules = emptyList()
+ ).withConfiguratorSettings(JvmSinglePlatformModuleConfigurator) {
+ ModuleConfiguratorWithTests.testFramework withValue KotlinTestFramework.NONE
+ }
+ )
+ )
} \ No newline at end of file
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt
index bf142e57574c..5b8402e427dd 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt
@@ -37,10 +37,18 @@ data class BintrayRepository(val repository: String, val base: String = "https:/
get() = "bintray." + repository.replace('/', '.')
}
+data class JetBrainsSpace(val repository: String) : CustomMavenRepository {
+ override val url: String = "https://maven.pkg.jetbrains.space/public/p/$repository"
+
+ override val idForMaven: String
+ get() = "jetbrains." + repository.replace('/', '.')
+}
+
object Repositories {
val KTOR_BINTRAY = BintrayRepository("kotlin/ktor")
val KOTLINX = BintrayRepository("kotlin/kotlinx")
val KOTLIN_JS_WRAPPERS_BINTRAY = BintrayRepository("kotlin/kotlin-js-wrappers")
val KOTLIN_EAP_BINTRAY = BintrayRepository("kotlin/kotlin-eap")
val KOTLIN_DEV_BINTRAY = BintrayRepository("kotlin/kotlin-dev")
+ val JETBRAINS_COMPOSE_DEV = JetBrainsSpace("compose/dev")
}
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeJvmDesktopTemplate.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeJvmDesktopTemplate.kt
new file mode 100644
index 000000000000..bdc8382747e1
--- /dev/null
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeJvmDesktopTemplate.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010-2020 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 org.jetbrains.kotlin.tools.projectWizard.templates.compose
+
+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.ir.buildsystem.*
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleImportIR
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.irsList
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.addWithJavaIntoJvmTarget
+import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
+import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
+import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
+import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptorWithPath
+import org.jetbrains.kotlin.tools.projectWizard.templates.Template
+import org.jetbrains.kotlin.tools.projectWizard.templates.asSrcOf
+
+class ComposeJvmDesktopTemplate : Template() {
+ @NonNls
+ override val id: String = "composeDesktopTemplate"
+
+ override val title: String = KotlinNewProjectWizardBundle.message("module.template.compose.desktop.title")
+ override val description: String = KotlinNewProjectWizardBundle.message("module.template.compose.desktop.description")
+
+ override val moduleTypes: Set<ModuleType> = setOf(ModuleType.jvm)
+
+ override fun Writer.getIrsToAddToBuildFile(
+ module: ModuleIR
+ ) = irsList {
+ +RepositoryIR(Repositories.JETBRAINS_COMPOSE_DEV)
+ +RepositoryIR(DefaultRepository.JCENTER)
+ +GradleOnlyPluginByNameIR("org.jetbrains.compose", version = Versions.JETBRAINS_COMPOSE)
+ +runTaskIrs("MainKt")
+
+ +GradleImportIR("org.jetbrains.compose.compose")
+ }
+
+ override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = listOf(
+ CustomGradleDependencyDependencyIR("compose.desktop.all", dependencyType = DependencyType.MAIN)
+ )
+
+ override fun Writer.runArbitratyTask(module: ModuleIR): TaskResult<Unit> =
+ BuildSystemPlugin.pluginRepositoreis.addValues(Repositories.JETBRAINS_COMPOSE_DEV)
+
+ override fun updateTargetIr(module: ModuleIR, targetConfigurationIR: TargetConfigurationIR): TargetConfigurationIR =
+ targetConfigurationIR.addWithJavaIntoJvmTarget()
+
+ override fun Reader.getFileTemplates(module: ModuleIR) =
+ buildList<FileTemplateDescriptorWithPath> {
+ +(FileTemplateDescriptor("$id/main.kt", "main.kt".asPath()) asSrcOf SourcesetType.main)
+ }
+}