Wizard: improve mobile app template
This commit is contained in:
+1
-1
@@ -83,7 +83,7 @@ val ModuleSubType.icon: Icon
|
|||||||
ModuleSubType.jvm -> KotlinIcons.Wizard.JVM
|
ModuleSubType.jvm -> KotlinIcons.Wizard.JVM
|
||||||
ModuleSubType.js -> KotlinIcons.Wizard.JS
|
ModuleSubType.js -> KotlinIcons.Wizard.JS
|
||||||
ModuleSubType.android, ModuleSubType.androidNativeArm32, ModuleSubType.androidNativeArm64 -> KotlinIcons.Wizard.ANDROID
|
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 ->
|
ModuleSubType.linuxArm32Hfp, ModuleSubType.linuxMips32, ModuleSubType.linuxMipsel32, ModuleSubType.linuxX64 ->
|
||||||
KotlinIcons.Wizard.LINUX
|
KotlinIcons.Wizard.LINUX
|
||||||
ModuleSubType.macosX64 -> KotlinIcons.Wizard.MAC_OS
|
ModuleSubType.macosX64 -> KotlinIcons.Wizard.MAC_OS
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
package ${package}
|
||||||
|
|
||||||
|
#set( $TEMPLATE_BEGIN= '${' )
|
||||||
|
|
||||||
|
class Greeting {
|
||||||
|
fun greeting(): String {
|
||||||
|
return "Hello, ${TEMPLATE_BEGIN}Platform().platform}!"
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-1
@@ -96,8 +96,15 @@ object AndroidSinglePlatformModuleConfigurator :
|
|||||||
module: Module,
|
module: Module,
|
||||||
modulePath: Path
|
modulePath: Path
|
||||||
): TaskResult<Unit> = computeM {
|
): TaskResult<Unit> = computeM {
|
||||||
|
val sharedModule = configurationData.allModules.firstOrNull { it.configurator == MppModuleConfigurator }
|
||||||
|
|
||||||
val javaPackage = module.javaPackage(configurationData.pomIr)
|
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(
|
TemplatesPlugin.addFileTemplates.execute(
|
||||||
listOf(
|
listOf(
|
||||||
FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.activityMainXml, modulePath, settings),
|
FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.activityMainXml, modulePath, settings),
|
||||||
|
|||||||
+9
-7
@@ -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.settings.buildsystem.SourcesetType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.templates.FileDescriptor
|
import org.jetbrains.kotlin.tools.projectWizard.templates.FileDescriptor
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
|
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 org.jetbrains.kotlin.tools.projectWizard.templates.FileTextDescriptor
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
|
|
||||||
@@ -93,6 +92,7 @@ object MppModuleConfigurator : ModuleConfigurator,
|
|||||||
FileTemplate(
|
FileTemplate(
|
||||||
file.fileDescriptor,
|
file.fileDescriptor,
|
||||||
projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type),
|
projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type),
|
||||||
|
mapOf("package" to file.javaPackage?.asCodePackage())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
TemplatesPlugin.fileTemplatesToRender.addValues(fileTemplates)
|
TemplatesPlugin.fileTemplatesToRender.addValues(fileTemplates)
|
||||||
@@ -168,7 +168,7 @@ class MppSources(val mppFiles: List<MppFile>, val simpleFiles: List<SimpleFiles>
|
|||||||
fun getFilesFor(moduleSubType: ModuleSubType): List<SimpleFile> =
|
fun getFilesFor(moduleSubType: ModuleSubType): List<SimpleFile> =
|
||||||
simpleFiles.filter { moduleSubType in it.moduleSubTypes }.flatMap { it.files }
|
simpleFiles.filter { moduleSubType in it.moduleSubTypes }.flatMap { it.files }
|
||||||
|
|
||||||
class Builder {
|
class Builder(val javaPackage: JavaPackage?) {
|
||||||
private val mppFiles = mutableListOf<MppFile>()
|
private val mppFiles = mutableListOf<MppFile>()
|
||||||
private val simpleFiles = mutableListOf<SimpleFiles>()
|
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) {
|
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)
|
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>) {
|
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>()
|
private val files = mutableListOf<SimpleFile>()
|
||||||
|
|
||||||
fun file(fileDescriptor: FileDescriptor, filename: String, type: SourcesetType, init: SimpleFile.Builder.() -> Unit = {}) {
|
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)
|
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 =
|
fun mppSources(javaPackage: JavaPackage, init: MppSources.Builder.() -> Unit): MppSources =
|
||||||
MppSources.Builder().apply(init).build()
|
MppSources.Builder(javaPackage).apply(init).build()
|
||||||
|
|
||||||
sealed class MppDeclaration {
|
sealed class MppDeclaration {
|
||||||
@Suppress("SpellCheckingInspection")
|
@Suppress("SpellCheckingInspection")
|
||||||
|
|||||||
+1
-1
@@ -330,7 +330,6 @@ object MultiplatformMobileApplicationProjectTemplate : ProjectTemplate() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
+shared
|
|
||||||
+Module(
|
+Module(
|
||||||
"iosApp",
|
"iosApp",
|
||||||
IOSSinglePlatformModuleConfigurator,
|
IOSSinglePlatformModuleConfigurator,
|
||||||
@@ -347,6 +346,7 @@ object MultiplatformMobileApplicationProjectTemplate : ProjectTemplate() {
|
|||||||
subModules = emptyList(),
|
subModules = emptyList(),
|
||||||
dependencies = mutableListOf(ModuleReference.ByModule(shared))
|
dependencies = mutableListOf(ModuleReference.ByModule(shared))
|
||||||
)
|
)
|
||||||
|
+shared // shared module must be the last so dependent modules could create actual files
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-11
@@ -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.printer.GradlePrinter
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
|
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.FileTemplate
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
|
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.templates.asSrcOf
|
import org.jetbrains.kotlin.tools.projectWizard.templates.asSrcOf
|
||||||
@@ -77,10 +79,12 @@ sealed class ModuleDependencyType(
|
|||||||
from = AndroidSinglePlatformModuleConfigurator::class,
|
from = AndroidSinglePlatformModuleConfigurator::class,
|
||||||
to = MppModuleConfigurator::class
|
to = MppModuleConfigurator::class
|
||||||
) {
|
) {
|
||||||
override fun Writer.runArbitraryTaskBeforeIRsCreated(
|
override fun Writer.runArbitraryTask(
|
||||||
from: Module,
|
from: Module,
|
||||||
to: Module,
|
to: Module,
|
||||||
): TaskResult<Unit> = addExpectFilesForMppModuleForAndroidAndIos(to)
|
toModulePath: Path,
|
||||||
|
data: ModulesToIrConversionData
|
||||||
|
): TaskResult<Unit> = addExpectFilesForMppModuleForAndroidAndIos(to, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
object IOSToMppSinglePlatformToMPP : ModuleDependencyType(
|
object IOSToMppSinglePlatformToMPP : ModuleDependencyType(
|
||||||
@@ -96,6 +100,7 @@ sealed class ModuleDependencyType(
|
|||||||
toModulePath: Path,
|
toModulePath: Path,
|
||||||
data: ModulesToIrConversionData
|
data: ModulesToIrConversionData
|
||||||
): TaskResult<Unit> = compute {
|
): TaskResult<Unit> = compute {
|
||||||
|
addExpectFilesForMppModuleForAndroidAndIos(to, data)
|
||||||
inContextOfModuleConfigurator(from) {
|
inContextOfModuleConfigurator(from) {
|
||||||
IOSSinglePlatformModuleConfigurator.dependentModule.reference.update {
|
IOSSinglePlatformModuleConfigurator.dependentModule.reference.update {
|
||||||
IOSSinglePlatformModuleConfigurator.DependentModuleReference(to).asSuccess()
|
IOSSinglePlatformModuleConfigurator.DependentModuleReference(to).asSuccess()
|
||||||
@@ -104,11 +109,6 @@ sealed class ModuleDependencyType(
|
|||||||
addDummyFileIfNeeded(to, toModulePath).ensure()
|
addDummyFileIfNeeded(to, toModulePath).ensure()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun Writer.runArbitraryTaskBeforeIRsCreated(
|
|
||||||
from: Module,
|
|
||||||
to: Module,
|
|
||||||
): TaskResult<Unit> = addExpectFilesForMppModuleForAndroidAndIos(to)
|
|
||||||
|
|
||||||
private fun Writer.addDummyFileIfNeeded(
|
private fun Writer.addDummyFileIfNeeded(
|
||||||
to: Module,
|
to: Module,
|
||||||
toModulePath: Path,
|
toModulePath: Path,
|
||||||
@@ -196,9 +196,13 @@ sealed class ModuleDependencyType(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module): TaskResult<Unit> {
|
private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module, data: ModulesToIrConversionData): TaskResult<Unit> {
|
||||||
val expectFiles = mppSources {
|
val javaPackage = mppModule.javaPackage(data.pomIr)
|
||||||
|
|
||||||
|
val expectFiles = mppSources(javaPackage) {
|
||||||
mppFile("Platform.kt") {
|
mppFile("Platform.kt") {
|
||||||
|
`package` = javaPackage.asCodePackage()
|
||||||
|
|
||||||
`class`("Platform") {
|
`class`("Platform") {
|
||||||
expectBody = "val platform: String"
|
expectBody = "val platform: String"
|
||||||
actualFor(
|
actualFor(
|
||||||
@@ -207,7 +211,7 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module)
|
|||||||
)
|
)
|
||||||
|
|
||||||
actualFor(
|
actualFor(
|
||||||
ModuleSubType.iosArm64, ModuleSubType.iosX64,
|
ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios,
|
||||||
actualBody =
|
actualBody =
|
||||||
"""actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion"""
|
"""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) {
|
filesFor(ModuleSubType.android) {
|
||||||
file(FileTemplateDescriptor("android/androidTest.kt.vm", relativePath = null), "androidTest.kt", SourcesetType.test)
|
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)
|
file(FileTemplateDescriptor("ios/iosTest.kt.vm", relativePath = null), "iosTest.kt", SourcesetType.test)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user