From 6a9a97006b66c7d344ff2c52594861670e34e7cf Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 27 Apr 2020 17:42:29 +0300 Subject: [PATCH] Wizard: fix not created by default xcode framework in shared module the runForXcode task is not generating xcode framework if there is no source files in shared module --- .../projectWizard/templates/ios/dummyFile.kt | 2 + .../NativeTargetConfigurator.kt | 5 +++ .../plugins/kotlin/ModulesToIRsConverter.kt | 9 ++++- .../settings/buildsystem/ModuleDependency.kt | 40 +++++++++++++++---- .../settings/buildsystem/Sourceset.kt | 3 ++ 5 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/dummyFile.kt diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/dummyFile.kt b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/dummyFile.kt new file mode 100644 index 00000000000..24262b15c3d --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/ios/dummyFile.kt @@ -0,0 +1,2 @@ +// This file is needed because the packForXcode task requires the source code to be present to generate the XCode framework. +// Feel free to remove this file as soon as you have created some code in this source set. \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt index 9c26ffbc6ad..f4e6d57d56f 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/NativeTargetConfigurator.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module interface NativeTargetConfigurator : TargetConfigurator { val isDesktopTarget: Boolean + val isIosTarget: Boolean } class RealNativeTargetConfigurator private constructor( @@ -25,6 +26,9 @@ class RealNativeTargetConfigurator private constructor( override val isDesktopTarget: Boolean get() = moduleSubType.isNativeDesktop + override val isIosTarget: Boolean + get() = moduleSubType.isIOS + override fun createInnerTargetIrs(reader: Reader, module: Module): List = if (moduleSubType.isIOS) irsList { "binaries" { "framework" { @@ -45,6 +49,7 @@ class RealNativeTargetConfigurator private constructor( object NativeForCurrentSystemTarget : NativeTargetConfigurator, SingleCoexistenceTargetConfigurator { override val moduleType = ModuleType.native override val isDesktopTarget: Boolean = true + override val isIosTarget: Boolean = false @NonNls override val id = "nativeForCurrentSystem" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt index 24ac0d87f79..e912d3877e3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt @@ -124,7 +124,14 @@ class ModulesToIRsConverter( with(dependencyType) { @Suppress("DEPRECATION") - with(unsafeSettingWriter) { runArbitraryTask(module, to, data).ensure() } + with(unsafeSettingWriter) { + runArbitraryTask( + module, + to, + to.path.considerSingleRootModuleMode(data.isSingleRootModuleMode).asPath(), + data + ).ensure() + } irsToAddToModules.getOrPut(to) { mutableListOf() } += createToIRs(module, to, data).get() createDependencyIrs(module, to, data) } 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 524a78467c7..015dad88713 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 @@ -17,7 +17,11 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.isIOS import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter -import kotlin.collections.buildList +import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath +import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin +import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate +import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor +import java.nio.file.Path import kotlin.reflect.KClass sealed class ModuleDependencyType( @@ -25,7 +29,11 @@ sealed class ModuleDependencyType( val to: KClass ) { fun accepts(from: Module, to: Module) = - this.from.isInstance(from.configurator) && this.to.isInstance(to.configurator) + this.from.isInstance(from.configurator) + && this.to.isInstance(to.configurator) + && additionalAcceptanceChecker(from, to) + + open fun additionalAcceptanceChecker(from: Module, to: Module) = true open fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): List { val path = to.path @@ -42,7 +50,12 @@ sealed class ModuleDependencyType( }.asSingletonList() } - open fun SettingsWriter.runArbitraryTask(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult = + open fun SettingsWriter.runArbitraryTask( + from: Module, + to: Module, + toModulePath: Path, + data: ModulesToIrConversionData + ): TaskResult = UNIT_SUCCESS open fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult> = @@ -68,18 +81,31 @@ sealed class ModuleDependencyType( override fun SettingsWriter.runArbitraryTask( from: Module, to: Module, + toModulePath: Path, data: ModulesToIrConversionData ): TaskResult = withSettingsOf(from) { IOSSinglePlatformModuleConfigurator.dependentModule.reference .setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to)) - UNIT_SUCCESS + val dummyFilePath = Defaults.SRC_DIR / "${to.iosTargetSafe()!!.name}Main" / to.configurator.kotlinDirectoryName / "dummyFile.kt" + TemplatesPlugin::addFileTemplate.execute( + FileTemplate( + FileTemplateDescriptor("ios/dummyFile.kt", dummyFilePath), + projectPath / toModulePath + ) + ) + } + + override fun additionalAcceptanceChecker(from: Module, to: Module): Boolean = + to.iosTargetSafe() != null + + private fun Module.iosTargetSafe(): Module? = subModules.firstOrNull { module -> + module.configurator.safeAs()?.isIosTarget == true } @OptIn(ExperimentalStdlibApi::class) override fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult> { - val iosTargetName = to.subModules.firstOrNull { module -> - module.configurator.safeAs()?.moduleSubType?.isIOS == true - }?.name ?: return Failure(InvalidModuleDependencyError(from, to, "Module ${to.name} should contain at least one iOS target")) + val iosTargetName = to.iosTargetSafe()?.name + ?: return Failure(InvalidModuleDependencyError(from, to, "Module ${to.name} should contain at least one iOS target")) return irsList { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt index 50333392ec2..311e2761532 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt @@ -9,11 +9,14 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem +import java.nio.file.Paths inline class ModulePath(val parts: List) { constructor(path: String) : this(path.trim().split('.')) fun asString(separator: String = ".") = parts.joinToString(separator) + fun asPath() = Paths.get(parts.first(), *parts.subList(1, parts.size).toTypedArray()) + override fun toString(): String = asString() companion object {