From 96160cbb556b252d496b643f40ad73930d094a8c Mon Sep 17 00:00:00 2001 From: Kirill Shmakov Date: Mon, 27 Jul 2020 12:25:06 +0300 Subject: [PATCH] Adapt AS wizard to changes in main wizard --- .../expected/settings.gradle | 4 +- .../expected/settings.gradle.kts | 4 +- .../templates/android/MainActivity.kt.vm | 4 +- .../templates/android/androidTest.kt.vm | 2 + .../projectWizard/templates/ios/iosTest.kt.vm | 2 + ...AndroidSinglePlatformModuleConfigurator.kt | 9 ++-- .../MppModuleConfigurator.kt | 43 ++++++++++++------- .../plugins/kotlin/KotlinPlugin.kt | 17 +++++++- .../settings/buildsystem/ModuleDependency.kt | 19 ++++---- .../projectWizard/core/ExpectedFileTest.kt | 8 ++-- 10 files changed, 72 insertions(+), 40 deletions(-) diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle index d45517c1c88..4d71cc619d4 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle @@ -19,5 +19,5 @@ pluginManagement { rootProject.name = 'multiplatformMobileApplication' -include(':shared') -include(':androidApp') \ No newline at end of file +include(':androidApp') +include(':shared') \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle.kts b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle.kts index d1bd724fe09..85cad029b85 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle.kts +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/testData/projectTemplatesBuildFileGeneration/multiplatformMobileApplication/expected/settings.gradle.kts @@ -19,5 +19,5 @@ pluginManagement { rootProject.name = "multiplatformMobileApplication" -include(":shared") -include(":androidApp") \ No newline at end of file +include(":androidApp") +include(":shared") \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/MainActivity.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/MainActivity.kt.vm index 8b0a86782ef..d831b3bda41 100644 --- a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/MainActivity.kt.vm +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/MainActivity.kt.vm @@ -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 } } diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/androidTest.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/androidTest.kt.vm index bbd9cad3872..b286fcae75a 100644 --- a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/androidTest.kt.vm +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/android/androidTest.kt.vm @@ -1,3 +1,5 @@ +package ${package} + import org.junit.Assert.assertTrue import org.junit.Test diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/iosTest.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/iosTest.kt.vm index 87975c8df49..ab383bc2ae5 100644 --- a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/iosTest.kt.vm +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/iosTest.kt.vm @@ -1,3 +1,5 @@ +package ${package} + import kotlin.test.Test import kotlin.test.assertTrue 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 6e70e5b9199..b3f83bf9371 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 @@ -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 = 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) 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 22dce1777eb..30a11db1ff3 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 @@ -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> = listOf(mppSources) + val generateTests by booleanSetting("Generate Tests", GenerationPhase.PROJECT_GENERATION) { + defaultValue = value(false) + } + + override fun getConfiguratorSettings(): List> = + super.getConfiguratorSettings() + generateTests + override fun Writer.runArbitraryTask( configurationData: ModulesToIrConversionData, module: Module, @@ -84,18 +94,20 @@ object MppModuleConfigurator : ModuleConfigurator, modulePath: Path ): TaskResult = 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()?.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()?.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() 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, val simpleFiles: List private val simpleFiles = mutableListOf() 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 { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt index 1caa8f34544..a550dd89231 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt @@ -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()) { 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 = 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 ed6d62c7013..4e80ed37b0f 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 @@ -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)) } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/core/ExpectedFileTest.kt b/libraries/tools/new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/core/ExpectedFileTest.kt index 2654b98016a..e531cc1137f 100644 --- a/libraries/tools/new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/core/ExpectedFileTest.kt +++ b/libraries/tools/new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/core/ExpectedFileTest.kt @@ -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 = """