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
This commit is contained in:
Ilya Kirillov
2020-04-27 17:42:29 +03:00
parent 47125553cb
commit 6a9a97006b
5 changed files with 51 additions and 8 deletions
@@ -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.
@@ -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<BuildSystemIR> = 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"
@@ -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)
}
@@ -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<out ModuleConfigurator>
) {
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<BuildSystemIR> {
val path = to.path
@@ -42,7 +50,12 @@ sealed class ModuleDependencyType(
}.asSingletonList()
}
open fun SettingsWriter.runArbitraryTask(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<Unit> =
open fun SettingsWriter.runArbitraryTask(
from: Module,
to: Module,
toModulePath: Path,
data: ModulesToIrConversionData
): TaskResult<Unit> =
UNIT_SUCCESS
open fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<List<BuildSystemIR>> =
@@ -68,18 +81,31 @@ sealed class ModuleDependencyType(
override fun SettingsWriter.runArbitraryTask(
from: Module,
to: Module,
toModulePath: Path,
data: ModulesToIrConversionData
): TaskResult<Unit> = 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<NativeTargetConfigurator>()?.isIosTarget == true
}
@OptIn(ExperimentalStdlibApi::class)
override fun Reader.createToIRs(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult<List<BuildSystemIR>> {
val iosTargetName = to.subModules.firstOrNull { module ->
module.configurator.safeAs<SimpleTargetConfigurator>()?.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 {
@@ -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<String>) {
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 {