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' rootProject.name = 'multiplatformMobileApplication'
include(':shared')
include(':androidApp') include(':androidApp')
include(':shared')
@@ -19,5 +19,5 @@ pluginManagement {
rootProject.name = "multiplatformMobileApplication" rootProject.name = "multiplatformMobileApplication"
include(":shared")
include(":androidApp") include(":androidApp")
include(":shared")
@@ -18,9 +18,9 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
#if( $sharedPackage ) #if( $sharedPackage )
val tv: TextView = findViewById(R.id.text_view) val tv: TextView = findViewById(R.id.text_view)
tv.text = greet() tv.text = greet()
#end #end
} }
} }
@@ -1,3 +1,5 @@
package ${package}
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
@@ -1,3 +1,5 @@
package ${package}
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertTrue 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.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
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.buildsystem.DefaultRepository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
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.javaPackage import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
@@ -96,7 +93,9 @@ 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 sharedModule = module.dependencies
.map { if (it is ModuleReference.ByModule) it.module else null }
.firstOrNull { it?.configurator == MppModuleConfigurator }
val javaPackage = module.javaPackage(configurationData.pomIr) val javaPackage = module.javaPackage(configurationData.pomIr)
val sharedPackage = sharedModule?.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.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.core.* 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.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.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.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath
@@ -50,6 +53,13 @@ object MppModuleConfigurator : ModuleConfigurator,
override fun getConfiguratorProperties(): List<ModuleConfiguratorProperty<*>> = override fun getConfiguratorProperties(): List<ModuleConfiguratorProperty<*>> =
listOf(mppSources) 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( override fun Writer.runArbitraryTask(
configurationData: ModulesToIrConversionData, configurationData: ModulesToIrConversionData,
module: Module, module: Module,
@@ -84,18 +94,20 @@ object MppModuleConfigurator : ModuleConfigurator,
modulePath: Path modulePath: Path
): TaskResult<Unit> = inContextOfModuleConfigurator(module) { ): TaskResult<Unit> = inContextOfModuleConfigurator(module) {
val mppFiles = mppSources.reference.propertyValue 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 val moduleSubType = //TODO handle for non-simple target configurator
target.configurator.safeAs<SimpleTargetConfigurator>()?.moduleSubType ?: return@mapTargets UNIT_SUCCESS target.configurator.safeAs<SimpleTargetConfigurator>()?.moduleSubType ?: return@flatMap emptyList()
val files = mppFiles.flatMap { it.getFilesFor(moduleSubType) }.distinctBy { it.uniqueIdentifier } mppFiles
val fileTemplates = files.map { file -> .flatMap { it.getFilesFor(moduleSubType) }
FileTemplate( .distinctBy { it.uniqueIdentifier }
file.fileDescriptor, .map { file ->
projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type), val path = projectPath / pathForFileInTarget(modulePath, module, file.javaPackage, file.filename, target, file.type)
mapOf("package" to file.javaPackage?.asCodePackage()) file to path
) }
} }.distinctBy { (_, path) -> path }
TemplatesPlugin.fileTemplatesToRender.addValues(fileTemplates) 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 @ExpectFileDSL
class Builder(private val filename: String) { class Builder(private val filename: String, val javaPackage: JavaPackage? = null) {
var `package`: String? = null
private val declarations = mutableListOf<MppDeclaration>() private val declarations = mutableListOf<MppDeclaration>()
fun function(signature: String, init: MppFunction.Builder.() -> Unit = {}) { fun function(signature: String, init: MppFunction.Builder.() -> Unit = {}) {
@@ -157,7 +168,7 @@ data class MppFile(
declarations += MppClass.Builder(name).apply(init).build() 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>() private val simpleFiles = mutableListOf<SimpleFiles>()
fun mppFile(filename: String, init: MppFile.Builder.() -> Unit) { 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) { 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() MppSources.Builder(javaPackage).apply(init).build()
sealed class MppDeclaration { 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 package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle 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.RepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator 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.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin 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) { val createSourcesetDirectories by pipelineTask(GenerationPhase.PROJECT_GENERATION) {
runAfter(KotlinPlugin.createModules) runAfter(KotlinPlugin.createModules)
withAction { withAction {
fun Path.createKotlinAndResourceDirectories(moduleConfigurator: ModuleConfigurator) = fun Path.createKotlinAndResourceDirectories(moduleConfigurator: ModuleConfigurator) =
with(service<FileSystemWizardService>()) { with(service<FileSystemWizardService>()) {
createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.kotlinDirectoryName) andThen createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.kotlinDirectoryName) andThen
createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.resourcesDirectoryName) if (createResourceDirectories.settingValue) {
createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.resourcesDirectoryName)
} else {
UNIT_SUCCESS
}
} }
forEachModule { moduleIR -> forEachModule { moduleIR ->
@@ -165,6 +179,7 @@ class KotlinPlugin(context: Context) : Plugin(context) {
listOf( listOf(
projectKind, projectKind,
modules, modules,
createResourceDirectories,
) )
override val pipelineTasks: List<PipelineTask> = override val pipelineTasks: List<PipelineTask> =
@@ -201,8 +201,6 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module,
val expectFiles = mppSources(javaPackage) { 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(
@@ -213,7 +211,7 @@ private fun Writer.addExpectFilesForMppModuleForAndroidAndIos(mppModule: Module,
actualFor( actualFor(
ModuleSubType.iosArm64, ModuleSubType.iosX64, ModuleSubType.ios, 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"""
) { ) {
import("platform.UIKit.UIDevice") 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) file(FileTemplateDescriptor("mppCommon/Greeting.kt.vm", relativePath = null), "Greeting.kt", SourcesetType.main)
} }
filesFor(ModuleSubType.android) { inContextOfModuleConfigurator(mppModule) {
file(FileTemplateDescriptor("android/androidTest.kt.vm", relativePath = null), "androidTest.kt", SourcesetType.test) 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)) } return inContextOfModuleConfigurator(mppModule) { MppModuleConfigurator.mppSources.reference.addValues(listOf(expectFiles)) }
} }
@@ -18,7 +18,7 @@ class ExpectedFileTest {
function("f(x: Int): String") function("f(x: Int): String")
function("y(x: Int): String") function("y(x: Int): String")
} }
}.first() }.mppFiles.first()
val generatedFileText = file.printForModuleSubType(ModuleSubType.common) val generatedFileText = file.printForModuleSubType(ModuleSubType.common)
val expectedFileText = """ val expectedFileText = """
expect fun f(x: Int): String expect fun f(x: Int): String
@@ -35,7 +35,7 @@ class ExpectedFileTest {
`class`("A") `class`("A")
`class`("B") `class`("B")
} }
}.first() }.mppFiles.first()
val generatedFileText = file.printForModuleSubType(ModuleSubType.common) val generatedFileText = file.printForModuleSubType(ModuleSubType.common)
val expectedFileText = """ val expectedFileText = """
expected class A expected constructor() expected class A expected constructor()
@@ -58,7 +58,7 @@ class ExpectedFileTest {
default("TODO()") default("TODO()")
} }
} }
}.first() }.mppFiles.first()
run { run {
val generatedFileText = file.printForModuleSubType(ModuleSubType.jvm) val generatedFileText = file.printForModuleSubType(ModuleSubType.jvm)
val expectedFileText = """ val expectedFileText = """
@@ -103,7 +103,7 @@ class ExpectedFileTest {
default("// nothing here") default("// nothing here")
} }
} }
}.first() }.mppFiles.first()
run { run {
val generatedFileText = file.printForModuleSubType(ModuleSubType.jvm) val generatedFileText = file.printForModuleSubType(ModuleSubType.jvm)
val expectedFileText = """ val expectedFileText = """