Adapt AS wizard to changes in main wizard

This commit is contained in:
Kirill Shmakov
2020-07-27 12:25:06 +03:00
parent 5c8833f608
commit 96160cbb55
10 changed files with 72 additions and 40 deletions
@@ -19,5 +19,5 @@ pluginManagement {
rootProject.name = 'multiplatformMobileApplication'
include(':shared')
include(':androidApp')
include(':androidApp')
include(':shared')
@@ -19,5 +19,5 @@ pluginManagement {
rootProject.name = "multiplatformMobileApplication"
include(":shared")
include(":androidApp")
include(":androidApp")
include(":shared")
@@ -18,9 +18,9 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
#if( $sharedPackage )
#if( $sharedPackage )
val tv: TextView = findViewById(R.id.text_view)
tv.text = greet()
#end
#end
}
}
@@ -1,3 +1,5 @@
package ${package}
import org.junit.Assert.assertTrue
import org.junit.Test
@@ -1,3 +1,5 @@
package ${package}
import kotlin.test.Test
import kotlin.test.assertTrue
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.irsList
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
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.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories
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
@@ -96,7 +93,9 @@ object AndroidSinglePlatformModuleConfigurator :
module: Module,
modulePath: Path
): TaskResult<Unit> = computeM {
val sharedModule = configurationData.allModules.firstOrNull { it.configurator == MppModuleConfigurator }
val sharedModule = module.dependencies
.map { if (it is ModuleReference.ByModule) it.module else null }
.firstOrNull { it?.configurator == MppModuleConfigurator }
val javaPackage = module.javaPackage(configurationData.pomIr)
val sharedPackage = sharedModule?.javaPackage(configurationData.pomIr)
@@ -9,7 +9,10 @@ import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.properties.ModuleConfiguratorProperty
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
@@ -50,6 +53,13 @@ object MppModuleConfigurator : ModuleConfigurator,
override fun getConfiguratorProperties(): List<ModuleConfiguratorProperty<*>> =
listOf(mppSources)
val generateTests by booleanSetting("Generate Tests", GenerationPhase.PROJECT_GENERATION) {
defaultValue = value(false)
}
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> =
super.getConfiguratorSettings() + generateTests
override fun Writer.runArbitraryTask(
configurationData: ModulesToIrConversionData,
module: Module,
@@ -84,18 +94,20 @@ object MppModuleConfigurator : ModuleConfigurator,
modulePath: Path
): TaskResult<Unit> = inContextOfModuleConfigurator(module) {
val mppFiles = mppSources.reference.propertyValue
module.subModules.mapSequenceIgnore mapTargets@{ target ->
val filesWithPaths = module.subModules.flatMap { target ->
val moduleSubType = //TODO handle for non-simple target configurator
target.configurator.safeAs<SimpleTargetConfigurator>()?.moduleSubType ?: return@mapTargets UNIT_SUCCESS
val files = mppFiles.flatMap { it.getFilesFor(moduleSubType) }.distinctBy { it.uniqueIdentifier }
val fileTemplates = files.map { file ->
FileTemplate(
file.fileDescriptor,
projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type),
mapOf("package" to file.javaPackage?.asCodePackage())
)
}
TemplatesPlugin.fileTemplatesToRender.addValues(fileTemplates)
target.configurator.safeAs<SimpleTargetConfigurator>()?.moduleSubType ?: return@flatMap emptyList()
mppFiles
.flatMap { it.getFilesFor(moduleSubType) }
.distinctBy { it.uniqueIdentifier }
.map { file ->
val path = projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type)
file to path
}
}.distinctBy { (_, path) -> path }
filesWithPaths.mapSequenceIgnore { (file, path) ->
val fileTemplate = FileTemplate(file.fileDescriptor, path, mapOf("package" to file.javaPackage?.asCodePackage()))
TemplatesPlugin.fileTemplatesToRender.addValues(fileTemplate)
}
}
@@ -145,8 +157,7 @@ data class MppFile(
}
@ExpectFileDSL
class Builder(private val filename: String) {
var `package`: String? = null
class Builder(private val filename: String, val javaPackage: JavaPackage? = null) {
private val declarations = mutableListOf<MppDeclaration>()
fun function(signature: String, init: MppFunction.Builder.() -> Unit = {}) {
@@ -157,7 +168,7 @@ data class MppFile(
declarations += MppClass.Builder(name).apply(init).build()
}
fun build() = MppFile(filename, `package`?.let(::JavaPackage), declarations)
fun build() = MppFile(filename, javaPackage, declarations)
}
}
@@ -173,7 +184,7 @@ class MppSources(val mppFiles: List<MppFile>, val simpleFiles: List<SimpleFiles>
private val simpleFiles = mutableListOf<SimpleFiles>()
fun mppFile(filename: String, init: MppFile.Builder.() -> Unit) {
mppFiles += MppFile.Builder(filename).apply(init).build()
mppFiles += MppFile.Builder(filename, javaPackage).apply(init).build()
}
fun filesFor(vararg moduleSubTypes: ModuleSubType, init: SimpleFiles.Builder.() -> Unit) {
@@ -210,7 +221,7 @@ data class SimpleFile(val fileDescriptor: FileDescriptor, val javaPackage: JavaP
}
fun mppSources(javaPackage: JavaPackage, init: MppSources.Builder.() -> Unit): MppSources =
fun mppSources(javaPackage: JavaPackage? = null, init: MppSources.Builder.() -> Unit): MppSources =
MppSources.Builder(javaPackage).apply(init).build()
sealed class MppDeclaration {
@@ -1,3 +1,8 @@
/*
* 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.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
@@ -11,6 +16,7 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.inContextOfModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
@@ -129,13 +135,21 @@ class KotlinPlugin(context: Context) : Plugin(context) {
}
}
val createResourceDirectories by booleanSetting("Generate Resource Folders", GenerationPhase.PROJECT_GENERATION) {
defaultValue = value(true)
}
val createSourcesetDirectories by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runAfter(KotlinPlugin.createModules)
withAction {
fun Path.createKotlinAndResourceDirectories(moduleConfigurator: ModuleConfigurator) =
with(service<FileSystemWizardService>()) {
createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.kotlinDirectoryName) andThen
createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.resourcesDirectoryName)
if (createResourceDirectories.settingValue) {
createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.resourcesDirectoryName)
} else {
UNIT_SUCCESS
}
}
forEachModule { moduleIR ->
@@ -165,6 +179,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
listOf(
projectKind,
modules,
createResourceDirectories,
)
override val pipelineTasks: List<PipelineTask> =
@@ -201,8 +201,6 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module,
val expectFiles = mppSources(javaPackage) {
mppFile("Platform.kt") {
`package` = javaPackage.asCodePackage()
`class`("Platform") {
expectBody = "val platform: String"
actualFor(
@@ -213,7 +211,7 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module,
actualFor(
ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios,
actualBody =
"""actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion"""
"""actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion"""
) {
import("platform.UIKit.UIDevice")
}
@@ -224,13 +222,18 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module,
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)
inContextOfModuleConfigurator(mppModule) {
if (MppModuleConfigurator.generateTests.reference.settingValue) {
filesFor(ModuleSubType.android) {
file(FileTemplateDescriptor("android/androidTest.kt.vm", relativePath = null), "androidTest.kt", SourcesetType.test)
}
filesFor(ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios) {
file(FileTemplateDescriptor("ios/iosTest.kt.vm", relativePath = null), "iosTest.kt", SourcesetType.test)
}
}
}
filesFor(ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios) {
file(FileTemplateDescriptor("ios/iosTest.kt.vm", relativePath = null), "iosTest.kt", SourcesetType.test)
}
}
return inContextOfModuleConfigurator(mppModule) { MppModuleConfigurator.mppSources.reference.addValues(listOf(expectFiles)) }
}
@@ -18,7 +18,7 @@ class ExpectedFileTest {
function("f(x: Int): String")
function("y(x: Int): String")
}
}.first()
}.mppFiles.first()
val generatedFileText = file.printForModuleSubType(ModuleSubType.common)
val expectedFileText = """
expect fun f(x: Int): String
@@ -35,7 +35,7 @@ class ExpectedFileTest {
`class`("A")
`class`("B")
}
}.first()
}.mppFiles.first()
val generatedFileText = file.printForModuleSubType(ModuleSubType.common)
val expectedFileText = """
expected class A expected constructor()
@@ -58,7 +58,7 @@ class ExpectedFileTest {
default("TODO()")
}
}
}.first()
}.mppFiles.first()
run {
val generatedFileText = file.printForModuleSubType(ModuleSubType.jvm)
val expectedFileText = """
@@ -103,7 +103,7 @@ class ExpectedFileTest {
default("// nothing here")
}
}
}.first()
}.mppFiles.first()
run {
val generatedFileText = file.printForModuleSubType(ModuleSubType.jvm)
val expectedFileText = """