From 5c8833f6085f9da3c355fd7a2c2cc3e572c6f4f0 Mon Sep 17 00:00:00 2001 From: Kirill Shmakov Date: Fri, 24 Jul 2020 14:11:47 +0300 Subject: [PATCH] Wizard: improve mobile app template --- .../tools/projectWizard/wizard/ui/ui.kt | 2 +- .../templates/mppCommon/Greeting.kt.vm | 9 ++++++ ...AndroidSinglePlatformModuleConfigurator.kt | 9 +++++- .../MppModuleConfigurator.kt | 16 +++++----- .../projectTemplates/ProjectTemplate.kt | 2 +- .../settings/buildsystem/ModuleDependency.kt | 30 ++++++++++++------- 6 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/mppCommon/Greeting.kt.vm diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt index 99203511073..18576f0f891 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt @@ -83,7 +83,7 @@ val ModuleSubType.icon: Icon ModuleSubType.jvm -> KotlinIcons.Wizard.JVM ModuleSubType.js -> KotlinIcons.Wizard.JS ModuleSubType.android, ModuleSubType.androidNativeArm32, ModuleSubType.androidNativeArm64 -> KotlinIcons.Wizard.ANDROID - ModuleSubType.iosArm32, ModuleSubType.iosArm64, ModuleSubType.iosX64 -> KotlinIcons.Wizard.IOS + ModuleSubType.iosArm32, ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios -> KotlinIcons.Wizard.IOS ModuleSubType.linuxArm32Hfp, ModuleSubType.linuxMips32, ModuleSubType.linuxMipsel32, ModuleSubType.linuxX64 -> KotlinIcons.Wizard.LINUX ModuleSubType.macosX64 -> KotlinIcons.Wizard.MAC_OS diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/mppCommon/Greeting.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/mppCommon/Greeting.kt.vm new file mode 100644 index 00000000000..e789bc5ee08 --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/mppCommon/Greeting.kt.vm @@ -0,0 +1,9 @@ +package ${package} + +#set( $TEMPLATE_BEGIN= '${' ) + +class Greeting { + fun greeting(): String { + return "Hello, ${TEMPLATE_BEGIN}Platform().platform}!" + } +} diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt index dccee843223..6e70e5b9199 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt @@ -96,8 +96,15 @@ object AndroidSinglePlatformModuleConfigurator : module: Module, modulePath: Path ): TaskResult = computeM { + val sharedModule = configurationData.allModules.firstOrNull { it.configurator == MppModuleConfigurator } + val javaPackage = module.javaPackage(configurationData.pomIr) - val settings = mapOf("package" to javaPackage.asCodePackage()) + val sharedPackage = sharedModule?.javaPackage(configurationData.pomIr) + + val settings = mapOf( + "package" to javaPackage.asCodePackage(), + "sharedPackage" to sharedPackage?.asCodePackage() + ) TemplatesPlugin.addFileTemplates.execute( listOf( FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.activityMainXml, modulePath, settings), diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/MppModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/MppModuleConfigurator.kt index 3505c724dd4..22dce1777eb 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/MppModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/MppModuleConfigurator.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.templates.FileDescriptor import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate -import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptorWithPath import org.jetbrains.kotlin.tools.projectWizard.templates.FileTextDescriptor import java.nio.file.Path @@ -93,6 +92,7 @@ object MppModuleConfigurator : ModuleConfigurator, FileTemplate( file.fileDescriptor, projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type), + mapOf("package" to file.javaPackage?.asCodePackage()) ) } TemplatesPlugin.fileTemplatesToRender.addValues(fileTemplates) @@ -168,7 +168,7 @@ class MppSources(val mppFiles: List, val simpleFiles: List fun getFilesFor(moduleSubType: ModuleSubType): List = simpleFiles.filter { moduleSubType in it.moduleSubTypes }.flatMap { it.files } - class Builder { + class Builder(val javaPackage: JavaPackage?) { private val mppFiles = mutableListOf() private val simpleFiles = mutableListOf() @@ -177,7 +177,7 @@ class MppSources(val mppFiles: List, val simpleFiles: List } fun filesFor(vararg moduleSubTypes: ModuleSubType, init: SimpleFiles.Builder.() -> Unit) { - simpleFiles += SimpleFiles.Builder(moduleSubTypes.toList()).apply(init).build() + simpleFiles += SimpleFiles.Builder(moduleSubTypes.toList(), javaPackage).apply(init).build() } fun build() = MppSources(mppFiles, simpleFiles) @@ -186,11 +186,13 @@ class MppSources(val mppFiles: List, val simpleFiles: List data class SimpleFiles(val moduleSubTypes: List, val files: List) { - class Builder(private val moduleSubTypes: List) { + class Builder(private val moduleSubTypes: List, val filesPackage: JavaPackage?) { private val files = mutableListOf() fun file(fileDescriptor: FileDescriptor, filename: String, type: SourcesetType, init: SimpleFile.Builder.() -> Unit = {}) { - files += SimpleFile.Builder(fileDescriptor, filename, type).apply(init).build() + files += SimpleFile.Builder(fileDescriptor, filename, type).apply(init).apply { + javaPackage = filesPackage + }.build() } fun build() = SimpleFiles(moduleSubTypes, files) @@ -208,8 +210,8 @@ data class SimpleFile(val fileDescriptor: FileDescriptor, val javaPackage: JavaP } -fun mppSources(init: MppSources.Builder.() -> Unit): MppSources = - MppSources.Builder().apply(init).build() +fun mppSources(javaPackage: JavaPackage, init: MppSources.Builder.() -> Unit): MppSources = + MppSources.Builder(javaPackage).apply(init).build() sealed class MppDeclaration { @Suppress("SpellCheckingInspection") diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index baa0b13927d..e0a744e78d3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -330,7 +330,6 @@ object MultiplatformMobileApplicationProjectTemplate : ProjectTemplate() { ) ) ) - +shared +Module( "iosApp", IOSSinglePlatformModuleConfigurator, @@ -347,6 +346,7 @@ object MultiplatformMobileApplicationProjectTemplate : ProjectTemplate() { subModules = emptyList(), dependencies = mutableListOf(ModuleReference.ByModule(shared)) ) + +shared // shared module must be the last so dependent modules could create actual files } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt index c5970ba1888..ed6d62c7013 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt @@ -19,6 +19,8 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConver import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin +import org.jetbrains.kotlin.tools.projectWizard.settings.JavaPackage +import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor import org.jetbrains.kotlin.tools.projectWizard.templates.asSrcOf @@ -77,10 +79,12 @@ sealed class ModuleDependencyType( from = AndroidSinglePlatformModuleConfigurator::class, to = MppModuleConfigurator::class ) { - override fun Writer.runArbitraryTaskBeforeIRsCreated( + override fun Writer.runArbitraryTask( from: Module, to: Module, - ): TaskResult = addExpectFilesForMppModuleForAndroidAndIos(to) + toModulePath: Path, + data: ModulesToIrConversionData + ): TaskResult = addExpectFilesForMppModuleForAndroidAndIos(to, data) } object IOSToMppSinglePlatformToMPP : ModuleDependencyType( @@ -96,6 +100,7 @@ sealed class ModuleDependencyType( toModulePath: Path, data: ModulesToIrConversionData ): TaskResult = compute { + addExpectFilesForMppModuleForAndroidAndIos(to, data) inContextOfModuleConfigurator(from) { IOSSinglePlatformModuleConfigurator.dependentModule.reference.update { IOSSinglePlatformModuleConfigurator.DependentModuleReference(to).asSuccess() @@ -104,11 +109,6 @@ sealed class ModuleDependencyType( addDummyFileIfNeeded(to, toModulePath).ensure() } - override fun Writer.runArbitraryTaskBeforeIRsCreated( - from: Module, - to: Module, - ): TaskResult = addExpectFilesForMppModuleForAndroidAndIos(to) - private fun Writer.addDummyFileIfNeeded( to: Module, toModulePath: Path, @@ -196,9 +196,13 @@ sealed class ModuleDependencyType( } } -private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module): TaskResult { - val expectFiles = mppSources { +private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module, data: ModulesToIrConversionData): TaskResult { + val javaPackage = mppModule.javaPackage(data.pomIr) + + val expectFiles = mppSources(javaPackage) { mppFile("Platform.kt") { + `package` = javaPackage.asCodePackage() + `class`("Platform") { expectBody = "val platform: String" actualFor( @@ -207,7 +211,7 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module) ) actualFor( - ModuleSubType.iosArm64, ModuleSubType.iosX64, + ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios, actualBody = """actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion""" ) { @@ -216,11 +220,15 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module) } } + filesFor(ModuleSubType.common) { + file(FileTemplateDescriptor("mppCommon/Greeting.kt.vm", relativePath = null), "Greeting.kt", SourcesetType.main) + } + filesFor(ModuleSubType.android) { file(FileTemplateDescriptor("android/androidTest.kt.vm", relativePath = null), "androidTest.kt", SourcesetType.test) } - filesFor(ModuleSubType.iosArm64, ModuleSubType.iosX64) { + filesFor(ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios) { file(FileTemplateDescriptor("ios/iosTest.kt.vm", relativePath = null), "iosTest.kt", SourcesetType.test) } }