Wizard: improve mobile app template

This commit is contained in:
Kirill Shmakov
2020-07-24 14:11:47 +03:00
parent 63fa6674a3
commit 5c8833f608
6 changed files with 47 additions and 21 deletions
@@ -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
@@ -0,0 +1,9 @@
package ${package}
#set( $TEMPLATE_BEGIN= '${' )
class Greeting {
fun greeting(): String {
return "Hello, ${TEMPLATE_BEGIN}Platform().platform}!"
}
}
@@ -96,8 +96,15 @@ object AndroidSinglePlatformModuleConfigurator :
module: Module,
modulePath: Path
): TaskResult<Unit> = 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),
@@ -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<MppFile>, val simpleFiles: List<SimpleFiles>
fun getFilesFor(moduleSubType: ModuleSubType): List<SimpleFile> =
simpleFiles.filter { moduleSubType in it.moduleSubTypes }.flatMap { it.files }
class Builder {
class Builder(val javaPackage: JavaPackage?) {
private val mppFiles = mutableListOf<MppFile>()
private val simpleFiles = mutableListOf<SimpleFiles>()
@@ -177,7 +177,7 @@ class MppSources(val mppFiles: List<MppFile>, val simpleFiles: List<SimpleFiles>
}
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<MppFile>, val simpleFiles: List<SimpleFiles>
data class SimpleFiles(val moduleSubTypes: List<ModuleSubType>, val files: List<SimpleFile>) {
class Builder(private val moduleSubTypes: List<ModuleSubType>) {
class Builder(private val moduleSubTypes: List<ModuleSubType>, val filesPackage: JavaPackage?) {
private val files = mutableListOf<SimpleFile>()
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")
@@ -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
}
}
@@ -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<Unit> = addExpectFilesForMppModuleForAndroidAndIos(to)
toModulePath: Path,
data: ModulesToIrConversionData
): TaskResult<Unit> = addExpectFilesForMppModuleForAndroidAndIos(to, data)
}
object IOSToMppSinglePlatformToMPP : ModuleDependencyType(
@@ -96,6 +100,7 @@ sealed class ModuleDependencyType(
toModulePath: Path,
data: ModulesToIrConversionData
): TaskResult<Unit> = 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<Unit> = addExpectFilesForMppModuleForAndroidAndIos(to)
private fun Writer.addDummyFileIfNeeded(
to: Module,
toModulePath: Path,
@@ -196,9 +196,13 @@ sealed class ModuleDependencyType(
}
}
private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module): TaskResult<Unit> {
val expectFiles = mppSources {
private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module, data: ModulesToIrConversionData): TaskResult<Unit> {
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)
}
}