summaryrefslogtreecommitdiff
path: root/project-wizard
diff options
context:
space:
mode:
authorIlya Kirillov <ilya.kirillov@jetbrains.com>2020-10-09 21:35:59 +0300
committerkotlin-ide-monorepo-bot <kotlin-ide-monorepo-bot-no-reply@jetbrains.com>2020-10-19 11:29:00 +0000
commita9e07b37fd9642ee6ab50f659fa6895a90ccda41 (patch)
tree65bb203a27339f18d25306b24dbce5baa3170655 /project-wizard
parent9229dc1834ec9c046b3470aa55939a00b292ca5c (diff)
downloadintellij-kotlin-a9e07b37fd9642ee6ab50f659fa6895a90ccda41.tar.gz
Wizard: introduce Compose MPP template
Original commit: 1cc007fcbf4f666268c3c2ab3ba1f186b743609e GitOrigin-RevId: cf96de382b0e5f4340f4e1f4a73347a87ec4a392
Diffstat (limited to 'project-wizard')
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle32
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle.kts32
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle24
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle.kts24
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle60
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle.kts52
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle27
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle.kts24
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle17
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle.kts17
-rw-r--r--project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/settings.yaml2
-rw-r--r--project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties13
-rw-r--r--project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/AndroidManifest.xml.vm14
-rw-r--r--project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/MainActivity.kt.vm20
-rw-r--r--project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/App.kt.vm21
-rw-r--r--project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/main.kt.vm11
-rw-r--r--project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/desktopMain.kt/App.kt.vm18
-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/core/Context.kt4
-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/DependencyIR.kt26
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt1
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt25
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt37
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt2
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt2
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt8
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ComposeTemplatesPlugin.kt6
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt4
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt66
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/JavaPackage.kt10
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt9
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeAndroidTemplate.kt105
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeJvmDesktopTemplate.kt39
-rw-r--r--project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeMppModuleTemplate.kt93
-rw-r--r--project-wizard/idea/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt1
36 files changed, 783 insertions, 66 deletions
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle
new file mode 100644
index 000000000000..e2468990db78
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle
@@ -0,0 +1,32 @@
+plugins {
+ id 'org.jetbrains.compose' version '0.1.0-build63'
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+}
+
+group = 'me.user'
+version = '1.0-SNAPSHOT'
+
+repositories {
+ google()
+}
+
+dependencies {
+ implementation project(':common')
+}
+
+android {
+ compileSdkVersion 29
+ defaultConfig {
+ applicationId 'me.user.android'
+ minSdkVersion 24
+ targetSdkVersion 29
+ versionCode 1
+ versionName '1.0'
+ }
+ buildTypes {
+ 'release' {
+ minifyEnabled false
+ }
+ }
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle.kts
new file mode 100644
index 000000000000..1941da42f101
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/android/build.gradle.kts
@@ -0,0 +1,32 @@
+plugins {
+ id("org.jetbrains.compose") version "0.1.0-build63"
+ id("com.android.application")
+ kotlin("android")
+}
+
+group = "me.user"
+version = "1.0-SNAPSHOT"
+
+repositories {
+ google()
+}
+
+dependencies {
+ implementation(project(":common"))
+}
+
+android {
+ compileSdkVersion(29)
+ defaultConfig {
+ applicationId = "me.user.android"
+ minSdkVersion(24)
+ targetSdkVersion(29)
+ versionCode = 1
+ versionName = "1.0"
+ }
+ buildTypes {
+ getByName("release") {
+ isMinifyEnabled = false
+ }
+ }
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle
new file mode 100644
index 000000000000..8b5b36103c72
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle
@@ -0,0 +1,24 @@
+buildscript {
+ repositories {
+ gradlePluginPortal()
+ jcenter()
+ google()
+ maven { url 'KOTLIN_REPO' }
+ }
+ dependencies {
+ classpath('org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION')
+ classpath('com.android.tools.build:gradle:4.0.1')
+ }
+}
+
+group = 'me.user'
+version = '1.0-SNAPSHOT'
+
+allprojects {
+ repositories {
+ jcenter()
+ mavenCentral()
+ maven { url 'KOTLIN_REPO' }
+ maven { url 'https://maven.pkg.jetbrains.space/public/p/compose/dev' }
+ }
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle.kts
new file mode 100644
index 000000000000..c3ba83a4f12f
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/build.gradle.kts
@@ -0,0 +1,24 @@
+buildscript {
+ repositories {
+ gradlePluginPortal()
+ jcenter()
+ google()
+ maven { url = uri("KOTLIN_REPO") }
+ }
+ dependencies {
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION")
+ classpath("com.android.tools.build:gradle:4.0.1")
+ }
+}
+
+group = "me.user"
+version = "1.0-SNAPSHOT"
+
+allprojects {
+ repositories {
+ jcenter()
+ mavenCentral()
+ maven { url = uri("KOTLIN_REPO") }
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
+ }
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle
new file mode 100644
index 000000000000..80ee132e68fb
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle
@@ -0,0 +1,60 @@
+import org.jetbrains.compose.compose
+
+plugins {
+ id 'org.jetbrains.kotlin.multiplatform'
+ id 'org.jetbrains.compose' version '0.1.0-build63'
+ id 'com.android.library'
+ id 'kotlin-android-extensions'
+}
+
+group = 'me.user'
+version = '1.0-SNAPSHOT'
+
+repositories {
+ google()
+}
+
+kotlin {
+ android()
+ jvm('desktop') {
+ compilations.all {
+ kotlinOptions.jvmTarget = '1.8'
+ }
+ }
+ sourceSets {
+ commonMain {
+ dependencies {
+ api compose.runtime
+ api compose.foundation
+ api compose.material
+ }
+ }
+ commonTest {
+
+ }
+ androidMain {
+ dependencies {
+ api 'androidx.appcompat:appcompat:1.2.0'
+ api 'androidx.core:core-ktx:1.3.1'
+ }
+ }
+ androidTest {
+
+ }
+ desktopMain {
+
+ }
+ desktopTest {
+
+ }
+ }
+}
+
+android {
+ compileSdkVersion 29
+ sourceSets.main.manifest.srcFile('src/androidMain/AndroidManifest.xml')
+ defaultConfig {
+ minSdkVersion 24
+ targetSdkVersion 29
+ }
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle.kts
new file mode 100644
index 000000000000..6788f15043a4
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/common/build.gradle.kts
@@ -0,0 +1,52 @@
+import org.jetbrains.compose.compose
+
+plugins {
+ kotlin("multiplatform")
+ id("org.jetbrains.compose") version "0.1.0-build63"
+ id("com.android.library")
+ id("kotlin-android-extensions")
+}
+
+group = "me.user"
+version = "1.0-SNAPSHOT"
+
+repositories {
+ google()
+}
+
+kotlin {
+ android()
+ jvm("desktop") {
+ compilations.all {
+ kotlinOptions.jvmTarget = "1.8"
+ }
+ }
+ sourceSets {
+ val commonMain by getting {
+ dependencies {
+ api(compose.runtime)
+ api(compose.foundation)
+ api(compose.material)
+ }
+ }
+ val commonTest by getting
+ val androidMain by getting {
+ dependencies {
+ api("androidx.appcompat:appcompat:1.2.0")
+ api("androidx.core:core-ktx:1.3.1")
+ }
+ }
+ val androidTest by getting
+ val desktopMain by getting
+ val desktopTest by getting
+ }
+}
+
+android {
+ compileSdkVersion(29)
+ sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
+ defaultConfig {
+ minSdkVersion(24)
+ targetSdkVersion(29)
+ }
+} \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle
new file mode 100644
index 000000000000..1e8b9ba295f7
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle
@@ -0,0 +1,27 @@
+import org.jetbrains.compose.compose
+
+plugins {
+ id 'org.jetbrains.kotlin.jvm'
+ id 'org.jetbrains.compose' version '0.1.0-build63'
+ id 'application'
+}
+
+group = 'me.user'
+version = '1.0-SNAPSHOT'
+
+dependencies {
+ implementation project(':common')
+ 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/composeMultiplatformApplication/expected/desktop/build.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle.kts
new file mode 100644
index 000000000000..7477099ec0bd
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/desktop/build.gradle.kts
@@ -0,0 +1,24 @@
+import org.jetbrains.compose.compose
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.compose") version "0.1.0-build63"
+ application
+}
+
+group = "me.user"
+version = "1.0-SNAPSHOT"
+
+dependencies {
+ implementation(project(":common"))
+ 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/composeMultiplatformApplication/expected/settings.gradle b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle
new file mode 100644
index 000000000000..1cdcf40cf0aa
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle
@@ -0,0 +1,17 @@
+pluginManagement {
+ repositories {
+ google()
+ jcenter()
+ gradlePluginPortal()
+ mavenCentral()
+ maven { url 'KOTLIN_REPO' }
+ maven { url 'https://maven.pkg.jetbrains.space/public/p/compose/dev' }
+ }
+
+}
+rootProject.name = 'composeMultiplatformApplication'
+
+
+include(':android')
+include(':desktop')
+include(':common') \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle.kts b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle.kts
new file mode 100644
index 000000000000..de38ca7437b1
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/expected/settings.gradle.kts
@@ -0,0 +1,17 @@
+pluginManagement {
+ repositories {
+ google()
+ jcenter()
+ gradlePluginPortal()
+ mavenCentral()
+ maven { url = uri("KOTLIN_REPO") }
+ maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
+ }
+
+}
+rootProject.name = "composeMultiplatformApplication"
+
+
+include(":android")
+include(":desktop")
+include(":common") \ No newline at end of file
diff --git a/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/settings.yaml b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/settings.yaml
new file mode 100644
index 000000000000..e21db7a9cb71
--- /dev/null
+++ b/project-wizard/cli/testData/projectTemplatesBuildFileGeneration/composeMultiplatformApplication/settings.yaml
@@ -0,0 +1,2 @@
+android:
+ androidSdkPath: android.sdk \ 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 7a54394c76a0..f9c1aff0b124 100644
--- a/project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties
+++ b/project-wizard/core/resources/messages/KotlinNewProjectWizardBundle.properties
@@ -151,17 +151,24 @@ project.template.mpp.mobile.lib.description=Library that supports sharing code b
project.template.compose.desktop.title=Desktop
project.template.compose.desktop.description=A Compose application targeting the desktop JVM platform (Windows, Linux, macOS)
+project.template.compose.multiplatform.title=Multiplatform
+project.template.compose.multiplatform.description=Multiplatform (JVM/Windows, JVM/Linux, JVM/MacOS, Android) Compose project with shared code in common modules
+
+
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.
+module.template.compose.desktop.title=Compose Desktop Application
+module.template.compose.desktop.description=A Compose application targeting the desktop JVM platform
+
+module.template.compose.mpp.title=Compose MPP Module
+module.template.compose.mpp.description=Compose MPP Module
+
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
diff --git a/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/AndroidManifest.xml.vm b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/AndroidManifest.xml.vm
new file mode 100644
index 000000000000..c9c1588e1823
--- /dev/null
+++ b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/AndroidManifest.xml.vm
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="${package}">
+ <application
+ android:allowBackup="false"
+ android:supportsRtl="true"
+ android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+ <activity android:name=".MainActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ </application>
+</manifest> \ No newline at end of file
diff --git a/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/MainActivity.kt.vm b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/MainActivity.kt.vm
new file mode 100644
index 000000000000..8531f2f352d8
--- /dev/null
+++ b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeAndroid/MainActivity.kt.vm
@@ -0,0 +1,20 @@
+#if ($package)
+package ${package}
+#end
+#if ($sharedPackage)
+import ${sharedPackage}.App
+#end
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.compose.ui.platform.setContent
+
+class MainActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+#if ($sharedPackage)
+ setContent {
+ App()
+ }
+#end
+ }
+} \ No newline at end of file
diff --git a/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/App.kt.vm b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/App.kt.vm
new file mode 100644
index 000000000000..7e7394a4e096
--- /dev/null
+++ b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/App.kt.vm
@@ -0,0 +1,21 @@
+#if ($package)
+package ${package}
+#end
+#set( $dollar = "${" )
+import androidx.compose.foundation.Text
+import androidx.compose.material.Button
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.*
+
+@Composable
+fun App() {
+ var text by remember { mutableStateOf("Hello, World!") }
+
+ MaterialTheme {
+ Button(onClick = {
+ text = "Hello, ${dollar}getPlatformName()}"
+ }) {
+ Text(text)
+ }
+ }
+}
diff --git a/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/main.kt.vm b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/main.kt.vm
new file mode 100644
index 000000000000..42e36b3d3ece
--- /dev/null
+++ b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/composeMpp/main.kt.vm
@@ -0,0 +1,11 @@
+#if ($package)
+package ${package}
+#end
+#if ($sharedPackage)
+import ${sharedPackage}.App
+#end
+import androidx.compose.desktop.Window
+
+fun main() = Window {
+ App()
+} \ No newline at end of file
diff --git a/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/desktopMain.kt/App.kt.vm b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/desktopMain.kt/App.kt.vm
new file mode 100644
index 000000000000..30bde2e3fc95
--- /dev/null
+++ b/project-wizard/core/resources/org/jetbrains/kotlin/tools/projectWizard/templates/desktopMain.kt/App.kt.vm
@@ -0,0 +1,18 @@
+#set( $dollar = "${" )
+import androidx.compose.foundation.Text
+import androidx.compose.material.Button
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.*
+
+@Composable
+fun App() {
+ var text by remember { mutableStateOf("Hello, World!") }
+
+ MaterialTheme {
+ Button(onClick = {
+ text = "Hello, ${dollar}getPlatformName()}"
+ }) {
+ Text(text)
+ }
+ }
+}
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 daae1de58d88..3e9880179c4e 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
@@ -20,6 +20,7 @@ object Versions {
val ANDROID_MATERIAL = version("1.2.1")
val ANDROIDX_APPCOMPAT = version("1.2.0")
val ANDROIDX_CONSTRAINTLAYOUT = version("2.0.2")
+ val ANDROIDX_KTX = version("1.3.1")
}
object KOTLINX {
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt
index eb25c8bfae15..6339094317a4 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizard
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.allIRModules
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.path
+import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.allModulesPaths
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleReference
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.path
@@ -243,13 +245,13 @@ fun Reader.getUnspecifiedSettings(phases: Set<GenerationPhase>): List<AnySetting
val provided = pluginSettings.map(PluginSetting<*, *>::path).toSet()
return required.filterNot { it.path in provided }
}
+
fun Reader.moduleByReference(reference: ModuleReference): Module = when (reference) {
is ModuleReference.ByModule -> reference.module
is ModuleReference.ByPath -> allIRModules.first { it.originalModule.path == reference.path }.originalModule
}
-
typealias Reader = Context.Reader
typealias Writer = Context.Writer
typealias SettingsWriter = Context.SettingsWriter \ No newline at end of file
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 ae5343cc522b..1bfa1ae9e0f5 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
@@ -181,8 +181,6 @@ fun MultiplatformModulesStructureIR.updateSourceSets(
return copy(modules = newModules)
}
-
-
data class SingleplatformModulesStructureWithSingleModuleIR(
val module: SingleplatformModuleIR,
override val irs: PersistentList<BuildSystemIR>
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 29698bf7745b..28778ca8691b 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
@@ -27,7 +27,7 @@ data class ModuleDependencyIR(
override fun withDependencyType(type: DependencyType): DependencyIR = copy(dependencyType = type)
override fun BuildFilePrinter.render() = when (this) {
- is GradlePrinter -> call(dependencyType.getGradleName()) {
+ is GradlePrinter -> call(dependencyType.getGradleName(DependencyKind.implementation)) {
call("project", forceBrackets = true) {
+path.parts.joinToString(separator = "") { ":$it" }.quotified
}
@@ -64,20 +64,22 @@ fun SourcesetType.toDependencyType() = when (this) {
SourcesetType.test -> DependencyType.TEST
}
-fun DependencyType.getGradleName(type: String = "implementation") = when (this) {
- DependencyType.MAIN -> type
- DependencyType.TEST -> "test${type.capitalize(Locale.US)}"
+fun DependencyType.getGradleName(kind: DependencyKind) = when (this) {
+ DependencyType.MAIN -> kind.text
+ DependencyType.TEST -> "test${kind.text.capitalize(Locale.US)}"
}
data class ArtifactBasedLibraryDependencyIR(
override val artifact: LibraryArtifact,
override val version: Version,
override val dependencyType: DependencyType,
- val dependencyKind: String = "implementation"
+ val dependencyKind: DependencyKind = DependencyKind.implementation
) : LibraryDependencyIR {
override fun withDependencyType(type: DependencyType): ArtifactBasedLibraryDependencyIR =
copy(dependencyType = type)
+ fun withDependencyKind(kind: DependencyKind): ArtifactBasedLibraryDependencyIR = copy(dependencyKind = kind)
+
override fun BuildFilePrinter.render() = when (this) {
is GradlePrinter -> call(dependencyType.getGradleName(dependencyKind)) {
with(artifact) {
@@ -126,7 +128,7 @@ abstract class KotlinLibraryDependencyIR(
override fun BuildFilePrinter.render() {
when (this) {
- is GradlePrinter -> call(dependencyType.getGradleName()) {
+ is GradlePrinter -> call(dependencyType.getGradleName(DependencyKind.implementation)) {
if (GradlePrinter.GradleDsl.KOTLIN == dsl || isInMppModule) {
+"kotlin("
+artifactName.quotified
@@ -170,17 +172,25 @@ data class KotlinArbitraryDependencyIR(
data class CustomGradleDependencyDependencyIR(
val dependency: String,
- override val dependencyType: DependencyType
+ override val dependencyType: DependencyType,
+ val dependencyKind: DependencyKind
) : DependencyIR, GradleIR {
override fun withDependencyType(type: DependencyType): CustomGradleDependencyDependencyIR = copy(dependencyType = type)
override fun GradlePrinter.renderGradle() {
- call(dependencyType.getGradleName()) {
+ call(dependencyType.getGradleName(dependencyKind)) {
+dependency
}
}
}
+enum class DependencyKind(val text: String) {
+ implementation("implementation"),
+ api("api"),
+ runtimeOnly("runtimeOnly"),
+ compileOnly("compileOnly")
+}
+
enum class StdlibType(val artifact: String) {
StdlibJdk7("stdlib-jdk7"),
StdlibJdk8("stdlib-jdk8"),
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt
index 9042294791b3..82319f33f497 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt
@@ -21,7 +21,6 @@ inline fun <I : IrsOwner> I.withoutIrs(filterNot: (BuildSystemIR) -> Boolean): I
withReplacedIrs(irs = this.irs.filterNot(filterNot).toPersistentList()) as I
-
inline fun <reified I : BuildSystemIR> IrsOwner.irsOfType(): List<I> =
irs.filterIsInstance<I>().let { irs ->
if (irs.all { it is BuildSystemIRWithPriority })
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt
index cc7b7d26c909..a712d114aaa6 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt
@@ -84,14 +84,9 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
reader: Reader,
configurationData: ModulesToIrConversionData,
module: Module
- ): List<BuildSystemIR> =
- buildList {
- +ArtifactBasedLibraryDependencyIR(
- MavenArtifact(DefaultRepository.GOOGLE, "com.google.android.material", "material"),
- version = Versions.ANDROID.ANDROID_MATERIAL,
- dependencyType = DependencyType.MAIN
- )
- }
+ ): List<BuildSystemIR> = buildList {
+ +DEPENDENCIES.MATERIAL
+ }
override fun createStdlibType(configurationData: ModulesToIrConversionData, module: Module): StdlibType? =
@@ -119,6 +114,15 @@ interface AndroidModuleConfigurator : ModuleConfigurator,
)
}
+ object DEPENDENCIES {
+ const val KOTLIN_ANDROID_EXTENSIONS_NAME = "kotlin-android-extensions"
+ val MATERIAL = ArtifactBasedLibraryDependencyIR(
+ MavenArtifact(DefaultRepository.GOOGLE, "com.google.android.material", "material"),
+ version = Versions.ANDROID.ANDROID_MATERIAL,
+ dependencyType = DependencyType.MAIN
+ )
+ }
+
companion object {
fun createRepositories(kotlinVersion: WizardKotlinVersion) = buildList<Repository> {
+DefaultRepository.GRADLE_PLUGIN_PORTAL
@@ -185,11 +189,6 @@ object AndroidTargetConfigurator : TargetConfigurator,
buildList {
+super<ModuleConfiguratorWithTests>.createModuleIRs(reader, configurationData, module)
+super<AndroidModuleConfigurator>.createModuleIRs(reader, configurationData, module)
- +ArtifactBasedLibraryDependencyIR(
- MavenArtifact(DefaultRepository.MAVEN_CENTRAL, "junit", "junit"),
- version = Versions.JUNIT,
- dependencyType = DependencyType.TEST
- )
}
override fun createBuildFileIRs(reader: Reader, configurationData: ModulesToIrConversionData, module: Module): List<BuildSystemIR> =
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt
index a9de5fb3cdd8..7d37156c6c39 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt
@@ -10,6 +10,7 @@ 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.properties.ModuleConfiguratorProperty
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.AndroidConfigIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptDependencyIR
@@ -22,7 +23,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConver
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
-import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import java.nio.file.Path
@@ -85,24 +85,15 @@ object AndroidSinglePlatformModuleConfigurator :
priority = 2
)
+
override fun createModuleIRs(
reader: Reader,
configurationData: ModulesToIrConversionData,
module: Module
- ) = buildList<BuildSystemIR> {
+ ): List<BuildSystemIR> = buildList {
+super<AndroidModuleConfigurator>.createModuleIRs(reader, configurationData, module)
-
- +ArtifactBasedLibraryDependencyIR(
- MavenArtifact(DefaultRepository.GOOGLE, "androidx.appcompat", "appcompat"),
- version = Versions.ANDROID.ANDROIDX_APPCOMPAT,
- dependencyType = DependencyType.MAIN
- )
-
- +ArtifactBasedLibraryDependencyIR(
- MavenArtifact(DefaultRepository.GOOGLE, "androidx.constraintlayout", "constraintlayout"),
- version = Versions.ANDROID.ANDROIDX_CONSTRAINTLAYOUT,
- dependencyType = DependencyType.MAIN
- )
+ +DEPENDENCIES.APP_COMPAT
+ +DEPENDENCIES.CONSTRAINT_LAYOUT
}
override fun Writer.runArbitraryTask(
@@ -121,6 +112,7 @@ object AndroidSinglePlatformModuleConfigurator :
"package" to javaPackage.asCodePackage(),
"sharedPackage" to sharedPackage?.asCodePackage()
)
+
TemplatesPlugin.addFileTemplates.execute(
listOf(
FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.activityMainXml, modulePath, settings),
@@ -135,4 +127,19 @@ object AndroidSinglePlatformModuleConfigurator :
override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin =
AndroidGradlePlugin.APPLICATION
-}
+
+
+ object DEPENDENCIES {
+ val CONSTRAINT_LAYOUT = ArtifactBasedLibraryDependencyIR(
+ MavenArtifact(DefaultRepository.GOOGLE, "androidx.constraintlayout", "constraintlayout"),
+ version = Versions.ANDROID.ANDROIDX_CONSTRAINTLAYOUT,
+ dependencyType = DependencyType.MAIN
+ )
+
+ val APP_COMPAT = ArtifactBasedLibraryDependencyIR(
+ MavenArtifact(DefaultRepository.GOOGLE, "androidx.appcompat", "appcompat"),
+ version = Versions.ANDROID.ANDROIDX_APPCOMPAT,
+ dependencyType = DependencyType.MAIN
+ )
+ }
+} \ No newline at end of file
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt
index aac4866630c6..3eea14167996 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt
@@ -129,7 +129,7 @@ enum class KotlinTestFramework(
MavenArtifact(DefaultRepository.MAVEN_CENTRAL, "org.junit.jupiter", "junit-jupiter-engine"),
version = Versions.JUNIT5,
dependencyType = DependencyType.TEST,
- dependencyKind = "runtimeOnly"
+ dependencyKind = DependencyKind.runtimeOnly
),
)
),
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt
index da2f89a17e48..1ea827782eff 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt
@@ -108,7 +108,7 @@ val Reader.projectName
get() = StructurePlugin.name.settingValue
-fun Writer.pomIR() = PomIR(
+fun Reader.pomIR() = PomIR(
artifactId = StructurePlugin.artifactId.settingValue,
groupId = StructurePlugin.groupId.settingValue,
version = Version.fromString(StructurePlugin.version.settingValue)
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt
index 45c2da8c5216..41822a3126c6 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt
@@ -285,6 +285,9 @@ class ModulesToIRsConverter(
): TaskResult<Unit> = with(module.configurator) {
compute {
rootBuildFileIrs += createRootBuildFileIrs(data)
+ module.template?.let { template ->
+ rootBuildFileIrs += with(template) { createRootBuildFileIrs() }
+ }
runArbitraryTask(data, module, modulePath).ensure()
TemplatesPlugin.addFileTemplates.execute(createTemplates(data, module, modulePath)).ensure()
if (this@with is GradleModuleConfigurator) {
@@ -321,5 +324,8 @@ class ModulesToIRsConverter(
}
addIfNotNull(kotlinPlugin)
+with(module.configurator) { createBuildFileIRs(this@createBuildFileIRs, data, module) }
+ .let {
+ module.template?.run { updateBuildFileIRs(it) } ?: it
+ }
}
-}
+} \ No newline at end of file
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
index fce25b9a4a36..7509e808911c 100644
--- 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
@@ -2,9 +2,11 @@ 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.andThen
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
+import org.jetbrains.kotlin.tools.projectWizard.templates.compose.ComposeMppModuleTemplate
class ComposeTemplatesPlugin(context: Context) : TemplatePlugin(context) {
override val path = pluginPath
@@ -19,7 +21,9 @@ class ComposeTemplatesPlugin(context: Context) : TemplatePlugin(context) {
val addTemplate by pipelineTask(GenerationPhase.PREPARE) {
withAction {
- TemplatesPlugin.addTemplate.execute(ComposeJvmDesktopTemplate())
+ TemplatesPlugin.addTemplate.execute(ComposeJvmDesktopTemplate()) andThen
+ TemplatesPlugin.addTemplate.execute(ComposeJvmDesktopTemplate()) andThen
+ TemplatesPlugin.addTemplate.execute(ComposeMppModuleTemplate())
}
}
}
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt
index 48d90350cf4e..531d88be318c 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt
@@ -139,12 +139,12 @@ class TemplatesPlugin(context: Context) : Plugin(context) {
putAll(interceptionPointSettings.mapKeys { it.key.name })
putAll(defaultSettings(module))
}
- return with(template) { getFileTemplates(module) }.mapNotNull { (fileTemplateDescriptor, filePath) ->
+ return with(template) { getFileTemplates(module) }.mapNotNull { (fileTemplateDescriptor, filePath, settings) ->
val path = generatePathForFileTemplate(module, filePath) ?: return@mapNotNull null
val fileTemplate = FileTemplate(
fileTemplateDescriptor,
module.path / path,
- allSettings
+ allSettings + settings
)
with(templateEngine) { writeTemplate(fileTemplate) }
}.sequenceIgnore()
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 eeddd63453b4..8e4f45b9f947 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
@@ -18,7 +18,9 @@ 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.ComposeAndroidTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.compose.ComposeJvmDesktopTemplate
+import org.jetbrains.kotlin.tools.projectWizard.templates.compose.ComposeMppModuleTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.mpp.MobileMppTemplate
sealed class ProjectTemplate : DisplayableSettingItem {
@@ -84,6 +86,7 @@ sealed class ProjectTemplate : DisplayableSettingItem {
FullStackWebApplicationProjectTemplate,
NodeJsApplicationProjectTemplate,
ComposeDesktopApplicationProjectTemplate,
+ ComposeMultiplatformApplicationProjectTemplate,
)
fun byId(id: String): ProjectTemplate? = ALL.firstOrNull {
@@ -473,4 +476,67 @@ object ComposeDesktopApplicationProjectTemplate : ProjectTemplate() {
}
)
)
+}
+
+object ComposeMultiplatformApplicationProjectTemplate : ProjectTemplate() {
+ override val title = KotlinNewProjectWizardBundle.message("project.template.compose.multiplatform.title")
+ override val description = KotlinNewProjectWizardBundle.message("project.template.compose.multiplatform.description")
+ override val id = "composeMultiplatformApplication"
+
+ @NonNls
+ override val suggestedProjectName = "myComposeMultiplatformApplication"
+ override val projectKind = ProjectKind.COMPOSE
+
+ override val setsModules: List<Module>
+ get() = buildList {
+ val common = MultiplatformModule(
+ "common",
+ template = ComposeMppModuleTemplate(),
+ listOf(
+ ModuleType.common.createDefaultTarget().withConfiguratorSettings(CommonTargetConfigurator) {
+ ModuleConfiguratorWithTests.testFramework withValue KotlinTestFramework.NONE
+ },
+ Module(
+ "android",
+ AndroidTargetConfigurator,
+ template = null,
+ sourcesets = createDefaultSourcesets(),
+ subModules = emptyList()
+ ).withConfiguratorSettings(AndroidTargetConfigurator) {
+ configurator.androidPlugin withValue AndroidGradlePlugin.LIBRARY
+ ModuleConfiguratorWithTests.testFramework withValue KotlinTestFramework.NONE
+ },
+ Module(
+ "desktop",
+ JvmTargetConfigurator,
+ template = null,
+ sourcesets = createDefaultSourcesets(),
+ subModules = emptyList()
+ ).withConfiguratorSettings(JvmTargetConfigurator) {
+ ModuleConfiguratorWithTests.testFramework withValue KotlinTestFramework.NONE
+ }
+ )
+ )
+ +Module(
+ "android",
+ AndroidSinglePlatformModuleConfigurator,
+ template = ComposeAndroidTemplate(),
+ sourcesets = createDefaultSourcesets(),
+ subModules = emptyList(),
+ dependencies = mutableListOf(ModuleReference.ByModule(common))
+ ).withConfiguratorSettings(AndroidSinglePlatformModuleConfigurator) {
+ ModuleConfiguratorWithTests.testFramework withValue KotlinTestFramework.NONE
+ }
+ +Module(
+ "desktop",
+ JvmSinglePlatformModuleConfigurator,
+ template = ComposeJvmDesktopTemplate(),
+ sourcesets = createDefaultSourcesets(),
+ subModules = emptyList(),
+ dependencies = mutableListOf(ModuleReference.ByModule(common))
+ ).withConfiguratorSettings(JvmSinglePlatformModuleConfigurator) {
+ ModuleConfiguratorWithTests.testFramework withValue KotlinTestFramework.NONE
+ }
+ +common
+ }
} \ No newline at end of file
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/JavaPackage.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/JavaPackage.kt
index 055353132635..96910806e90a 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/JavaPackage.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/settings/JavaPackage.kt
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.settings
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.PomIR
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.TargetConfigurator
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import java.nio.file.Paths
@@ -20,5 +21,10 @@ class JavaPackage(val parts: List<String>) {
}
}
-fun Module.javaPackage(pomIr: PomIR) =
- JavaPackage.fromCodeRepresentation(pomIr.groupId, name) \ No newline at end of file
+fun Module.javaPackage(pomIr: PomIR): JavaPackage {
+ val moduleName = when (configurator) {
+ is TargetConfigurator -> parent!!.name
+ else -> name
+ }
+ return JavaPackage.fromCodeRepresentation(pomIr.groupId, moduleName)
+} \ No newline at end of file
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt
index 84cc0b39b65d..0847388c602f 100644
--- a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt
@@ -28,7 +28,11 @@ sealed class FilePath {
data class SrcFilePath(override val sourcesetType: SourcesetType) : FilePath()
data class ResourcesFilePath(override val sourcesetType: SourcesetType) : FilePath()
-data class FileTemplateDescriptorWithPath(val descriptor: FileDescriptor, val path: FilePath)
+data class FileTemplateDescriptorWithPath(
+ val descriptor: FileDescriptor,
+ val path: FilePath,
+ val data: Map<String, Any> = emptyMap(),
+)
infix fun FileDescriptor.asResourceOf(sourcesetType: SourcesetType) =
FileTemplateDescriptorWithPath(this, ResourcesFilePath(sourcesetType))
@@ -36,6 +40,9 @@ infix fun FileDescriptor.asResourceOf(sourcesetType: SourcesetType) =
infix fun FileDescriptor.asSrcOf(sourcesetType: SourcesetType) =
FileTemplateDescriptorWithPath(this, SrcFilePath(sourcesetType))
+infix fun FileTemplateDescriptorWithPath.withSettings(setting: Pair<String, String>) =
+ copy(data = data + setting)
+
data class FileTemplate(
val descriptor: FileDescriptor,
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeAndroidTemplate.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeAndroidTemplate.kt
new file mode 100644
index 000000000000..88dc5409602f
--- /dev/null
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeAndroidTemplate.kt
@@ -0,0 +1,105 @@
+/*
+ * 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 kotlinx.collections.immutable.toPersistentList
+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.moduleConfigurators.AndroidModuleConfigurator
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.inContextOfModuleConfigurator
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType
+import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
+import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
+import org.jetbrains.kotlin.tools.projectWizard.plugins.pomIR
+import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
+import org.jetbrains.kotlin.tools.projectWizard.settings.JavaPackage
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
+import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
+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 ComposeAndroidTemplate : Template() {
+ @NonNls
+ override val id: String = "composeAndroid"
+
+ override val title: String = KotlinNewProjectWizardBundle.message("module.template.compose.desktop.title")
+ override val description: String = KotlinNewProjectWizardBundle.message("module.template.compose.desktop.description")
+
+
+ override fun isSupportedByModuleType(module: Module): Boolean =
+ module.configurator.moduleType == ModuleType.android
+
+ override fun isApplicableTo(reader: Reader, module: Module): Boolean =
+ module.kind == ModuleKind.singleplatformAndroid
+
+ override fun Writer.getIrsToAddToBuildFile(
+ module: ModuleIR
+ ) = irsList {
+ +GradleOnlyPluginByNameIR("org.jetbrains.compose", version = Versions.JETBRAINS_COMPOSE)
+ +RepositoryIR(Repositories.JETBRAINS_COMPOSE_DEV)
+ +RepositoryIR(DefaultRepository.JCENTER)
+ +RepositoryIR(DefaultRepository.GOOGLE)
+ }
+
+ override fun Reader.updateBuildFileIRs(irs: List<BuildSystemIR>): List<BuildSystemIR> = irs.filterNot {
+ it.safeAs<GradleOnlyPluginByNameIR>()?.pluginId == AndroidModuleConfigurator.DEPENDENCIES.KOTLIN_ANDROID_EXTENSIONS_NAME
+ }
+
+
+ override fun Reader.updateModuleIR(module: ModuleIR): ModuleIR {
+ val irs = module.irs.filterNot { ir ->
+ ir == AndroidSinglePlatformModuleConfigurator.DEPENDENCIES.APP_COMPAT
+ || ir == AndroidSinglePlatformModuleConfigurator.DEPENDENCIES.CONSTRAINT_LAYOUT
+ || ir == AndroidModuleConfigurator.DEPENDENCIES.MATERIAL
+ }
+ return module.withReplacedIrs(irs.toPersistentList())
+ }
+
+ override fun Writer.runArbitratyTask(module: ModuleIR): TaskResult<Unit> = compute {
+ BuildSystemPlugin.pluginRepositoreis.addValues(Repositories.JETBRAINS_COMPOSE_DEV).ensure()
+
+ //TODO hacky!
+ TemplatesPlugin.fileTemplatesToRender.update { templates ->
+ templates.mapNotNull { template ->
+ val descriptor = template.descriptor as? FileTemplateDescriptor
+ when {
+ descriptor == AndroidModuleConfigurator.FileTemplateDescriptors.activityMainXml
+ || descriptor == AndroidModuleConfigurator.FileTemplateDescriptors.colorsXml
+ || descriptor == AndroidModuleConfigurator.FileTemplateDescriptors.stylesXml -> null
+ descriptor?.templateId == "android/MainActivity.kt.vm" -> {
+ template.copy(descriptor = mainActivityKt(module.originalModule.javaPackage(pomIR())))
+ }
+ descriptor?.templateId == "android/AndroidManifest.xml.vm" -> {
+ template.copy(descriptor = Descriptors.manifestXml)
+ }
+ else -> template
+ }
+ }.asSuccess()
+ }
+ }
+
+ private fun mainActivityKt(javaPackage: JavaPackage) = FileTemplateDescriptor(
+ "composeAndroid/MainActivity.kt.vm",
+ "src" / "main" / "java" / javaPackage.asPath() / "MainActivity.kt"
+ )
+
+ object Descriptors {
+ val manifestXml = FileTemplateDescriptor(
+ templateId = "composeAndroid/AndroidManifest.xml.vm",
+ relativePath = "src" / "main" / "AndroidManifest.xml",
+ )
+ }
+}
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
index bdc8382747e1..7a8a7bf83012 100644
--- 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
@@ -14,15 +14,16 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleImpo
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.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.inContextOfModuleConfigurator
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType
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
+import org.jetbrains.kotlin.tools.projectWizard.plugins.pomIR
+import org.jetbrains.kotlin.tools.projectWizard.settings.JavaPackage
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
+import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
+import org.jetbrains.kotlin.tools.projectWizard.templates.*
class ComposeJvmDesktopTemplate : Template() {
@NonNls
@@ -31,7 +32,11 @@ class ComposeJvmDesktopTemplate : Template() {
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 isSupportedByModuleType(module: Module): Boolean =
+ module.configurator.moduleType == ModuleType.jvm
+
+ override fun isApplicableTo(reader: Reader, module: Module): Boolean =
+ module.kind == ModuleKind.singleplatformJvm
override fun Writer.getIrsToAddToBuildFile(
module: ModuleIR
@@ -45,17 +50,23 @@ class ComposeJvmDesktopTemplate : Template() {
}
override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = listOf(
- CustomGradleDependencyDependencyIR("compose.desktop.all", dependencyType = DependencyType.MAIN)
+ CustomGradleDependencyDependencyIR("compose.desktop.all", dependencyType = DependencyType.MAIN, DependencyKind.implementation)
)
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> {
+ override fun Reader.getFileTemplates(module: ModuleIR) = buildList<FileTemplateDescriptorWithPath> {
+ val dependsOnMppModule: Module? =
+ module.originalModule.dependencies.map { moduleByReference(it) }.firstOrNull { it.template is ComposeMppModuleTemplate }
+ if (dependsOnMppModule == null) {
+(FileTemplateDescriptor("$id/main.kt", "main.kt".asPath()) asSrcOf SourcesetType.main)
+ } else {
+ val javaPackage = dependsOnMppModule.javaPackage(pomIR()).asCodePackage()
+ +(FileTemplateDescriptor("composeMpp/main.kt.vm", "main.kt".asPath())
+ asSrcOf SourcesetType.main
+ withSettings ("sharedPackage" to javaPackage)
+ )
}
+ }
}
diff --git a/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeMppModuleTemplate.kt b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeMppModuleTemplate.kt
new file mode 100644
index 000000000000..df641a103c5f
--- /dev/null
+++ b/project-wizard/core/src/org/jetbrains/kotlin/tools/projectWizard/templates/compose/ComposeMppModuleTemplate.kt
@@ -0,0 +1,93 @@
+/*
+ * 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.core.safeAs
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptDependencyIR
+import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptRepositoryIR
+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.library.MavenArtifact
+import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
+import org.jetbrains.kotlin.tools.projectWizard.mpp.applyMppStructure
+import org.jetbrains.kotlin.tools.projectWizard.mpp.mppSources
+import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
+import org.jetbrains.kotlin.tools.projectWizard.plugins.pomIR
+import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
+import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
+import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
+import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
+import org.jetbrains.kotlin.tools.projectWizard.templates.Template
+
+class ComposeMppModuleTemplate : Template() {
+ @NonNls
+ override val id: String = "composeMppModule"
+
+ override val title: String = KotlinNewProjectWizardBundle.message("module.template.compose.mpp.title")
+ override val description: String = KotlinNewProjectWizardBundle.message("module.template.compose.mpp.description")
+
+ override fun isSupportedByModuleType(module: Module): Boolean =
+ module.configurator == MppModuleConfigurator
+
+ override fun Writer.getIrsToAddToBuildFile(module: ModuleIR): List<BuildSystemIR> = irsList {
+ +GradleImportIR("org.jetbrains.compose.compose")
+ +GradleOnlyPluginByNameIR("org.jetbrains.compose", version = Versions.JETBRAINS_COMPOSE)
+ +RepositoryIR(Repositories.JETBRAINS_COMPOSE_DEV)
+ +RepositoryIR(DefaultRepository.JCENTER)
+ +RepositoryIR(DefaultRepository.GOOGLE)
+ }
+
+ override fun Reader.updateBuildFileIRs(irs: List<BuildSystemIR>): List<BuildSystemIR> = irs.filterNot {
+ it.safeAs<GradleOnlyPluginByNameIR>()?.pluginId == AndroidModuleConfigurator.DEPENDENCIES.KOTLIN_ANDROID_EXTENSIONS_NAME
+ }
+
+ override fun Reader.updateModuleIR(module: ModuleIR): ModuleIR = when (module.originalModule.configurator) {
+ CommonTargetConfigurator -> module.withIrs(
+ CustomGradleDependencyDependencyIR("compose.runtime", DependencyType.MAIN, DependencyKind.api),
+ CustomGradleDependencyDependencyIR("compose.foundation", DependencyType.MAIN, DependencyKind.api),
+ CustomGradleDependencyDependencyIR("compose.material", DependencyType.MAIN, DependencyKind.api),
+ )
+ AndroidTargetConfigurator -> module.withIrs(
+ AndroidSinglePlatformModuleConfigurator.DEPENDENCIES.APP_COMPAT.withDependencyKind(DependencyKind.api),
+ DEPENDENCIES.ANDROID_KTX.withDependencyKind(DependencyKind.api)
+ ).withoutIrs { it == AndroidModuleConfigurator.DEPENDENCIES.MATERIAL }
+ else -> module
+ }
+
+ override fun Writer.runArbitratyTask(module: ModuleIR): TaskResult<Unit> = inContextOfModuleConfigurator(module.originalModule) {
+ val javaPackage = module.originalModule.javaPackage(pomIR())
+ val mpp = mppSources(javaPackage) {
+ mppFile("platform.kt") {
+ function("getPlatformName(): String") {
+ actualFor(ModuleSubType.jvm, actualBody = """return "Desktop" """)
+ actualFor(ModuleSubType.android, actualBody = """return "Android" """)
+ default("""return "Platform" """)
+ }
+ }
+ filesFor(ModuleSubType.common) {
+ file(FileTemplateDescriptor("composeMpp/App.kt.vm", relativePath = null), "App.kt", SourcesetType.main)
+ }
+ }
+ applyMppStructure(mpp, module.originalModule, module.path)
+ }
+
+ object DEPENDENCIES {
+ val ANDROID_KTX = ArtifactBasedLibraryDependencyIR(
+ MavenArtifact(DefaultRepository.GOOGLE, "androidx.core", "core-ktx"),
+ version = Versions.ANDROID.ANDROIDX_KTX,
+ dependencyType = DependencyType.MAIN
+ )
+ }
+} \ No newline at end of file
diff --git a/project-wizard/idea/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt b/project-wizard/idea/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt
index 1d1925819517..6c3a8bf717eb 100644
--- a/project-wizard/idea/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt
+++ b/project-wizard/idea/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt
@@ -94,6 +94,7 @@ private val ProjectTemplate.icon: Icon
MultiplatformMobileLibraryProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE_LIBRARY
NodeJsApplicationProjectTemplate -> KotlinIcons.Wizard.NODE_JS
ComposeDesktopApplicationProjectTemplate -> KotlinIcons.Wizard.COMPOSE
+ ComposeMultiplatformApplicationProjectTemplate -> KotlinIcons.Wizard.COMPOSE
}
class TemplateDescriptionComponent : Component() {