diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/CreateModuleOrTargetPopup.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/CreateModuleOrTargetPopup.kt index 179c55a8469..e02e5353371 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/CreateModuleOrTargetPopup.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/CreateModuleOrTargetPopup.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind -import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.htmlText +import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.fullTextHtml import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.icon import javax.swing.Icon @@ -46,7 +46,7 @@ class CreateModuleOrTargetPopup private constructor( } ) { override fun getIconFor(value: ModuleConfigurator): Icon = value.icon - override fun getTextFor(value: ModuleConfigurator): String = value.htmlText + override fun getTextFor(value: ModuleConfigurator): String = value.fullTextHtml override fun onChosen(selectedValue: ModuleConfigurator?, finalChoice: Boolean): PopupStep<*>? = when (selectedValue) { @@ -71,7 +71,7 @@ class CreateModuleOrTargetPopup private constructor( else -> null } - override fun getTextFor(value: DisplayableSettingItem): String = value.htmlText + override fun getTextFor(value: DisplayableSettingItem): String = value.fullTextHtml override fun onChosen(selectedValue: DisplayableSettingItem?, finalChoice: Boolean): PopupStep<*>? { when { diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt index 93d04259db3..45abb58aa6f 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/ui.kt @@ -77,20 +77,6 @@ fun ValidationResult.ValidationError.asHtml() = when (messages.size) { } } -val DisplayableSettingItem.htmlText - get() = (text + greyText?.let { " ($greyText)" }.orEmpty()).asHtml() - -fun splitterFor( - vararg components: JComponent, - vertical: Boolean = false -) = components.reduce { left, right -> - JBSplitter(vertical, 1f / components.size).apply { - firstComponent = left - secondComponent = right - dividerWidth = 1 - } -} - val ModuleType.icon: Icon get() = when (this) { ModuleType.jvm -> KotlinIcons.SMALL_LOGO diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt index 98c965af0ef..541b5b66ddd 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt @@ -196,6 +196,10 @@ class Context private constructor( } open inner class Writer : Reader() { + @Deprecated("Allows to get SettingsWriter where it is not supposed to be") + val unsafeSettingWriter: SettingsWriter + get() = settingWritingContext + val eventManager: EventManager get() = settingContext.eventManager @@ -235,7 +239,7 @@ class Context private constructor( setValue(defaultValue) } } - + @JvmName("writeSettings") inline operator fun invoke(writer: SettingsWriter.() -> T): T = writer() } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt index aecfb9c6ad1..2e0d1a049fe 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt @@ -25,6 +25,14 @@ abstract class Parser { abstract fun ParsingContext.parse(value: Any?, path: String): TaskResult } +fun alwaysFailingParser(errorMessage: String) = object : Parser() { + override fun ParsingContext.parse(value: Any?, path: String): TaskResult = + Failure(object : Error() { + override val message: String get() = errorMessage + }) +} + + fun Parser.parse(context: ParsingContext, value: Any?, path: String) = with(context) { parse(value, path) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt index 54368e9b6f4..bd17c6c2206 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt @@ -126,7 +126,7 @@ object AndroidTargetConfigurator : TargetConfigurator, SingleCoexistenceTargetConfigurator, ModuleConfiguratorSettings() { override val moduleSubType = ModuleSubType.android - override val moduleType = ModuleType.jvm + override val moduleType = ModuleType.android override fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin = withSettingsOf(module) { androidPlugin.reference.settingValue } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt index 8c6a63204c6..e3e0999a946 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt @@ -6,17 +6,16 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators import org.jetbrains.kotlin.tools.projectWizard.core.* - +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase 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.Module -import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor +import java.io.File import java.nio.file.Path -object IOSSinglePlatformModuleConfigurator : - SinglePlatformModuleConfigurator { +object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, ModuleConfiguratorSettings() { override val id = "IOS Module" override val suggestedModuleName = "ios" override val moduleKind: ModuleKind = ModuleKind.singleplatformJvm @@ -25,20 +24,16 @@ object IOSSinglePlatformModuleConfigurator : override val needCreateBuildFile: Boolean = false override val requiresRootBuildFile: Boolean = true - override fun Writer.runArbitraryTask( + override fun Reader.createTemplates( configurationData: ModulesToIrConversionData, module: Module, modulePath: Path - ): TaskResult { - val settings = mapOf( - "moduleName" to module.name, - "sharedModuleName" to "SHARED", - "pathToSharedModule" to "../SHARED" - ) + ): List { + val settings = createTemplatesSettingValues(module, configurationData) fun fileTemplate(path: Path) = FileTemplate(descriptor(path, module.name), modulePath, settings) - return TemplatesPlugin::addFileTemplates.execute(buildList { + return buildList { +fileTemplate("$DEFAULT_APP_NAME.xcodeproj" / "project.pbxproj") +fileTemplate(DEFAULT_APP_NAME / "AppDelegate.swift") @@ -56,7 +51,27 @@ object IOSSinglePlatformModuleConfigurator : +fileTemplate("${DEFAULT_APP_NAME}UITests" / "Info.plist") +fileTemplate("${DEFAULT_APP_NAME}UITests" / "${DEFAULT_APP_NAME}UITests.swift") - }) + } + } + + private fun Reader.createTemplatesSettingValues( + module: Module, + configurationData: ModulesToIrConversionData + ): Map { + val dependentModule = withSettingsOf(module) { + dependentModule.reference.notRequiredSettingValue?.module + } + val dependentModulePath = dependentModule + ?.path + ?.considerSingleRootModuleMode(configurationData.isSingleRootModuleMode) + ?.asString(separator = File.separator) + ?.asPath() + + return mapOf( + "moduleName" to module.name, + "sharedModuleName" to dependentModule?.name, + "pathToSharedModule" to dependentModulePath + ) } private fun descriptor(path: Path, moduleName: String) = @@ -66,4 +81,18 @@ object IOSSinglePlatformModuleConfigurator : ) private const val DEFAULT_APP_NAME = "moduleName" + + val dependentModule by valueSetting( + "", + GenerationPhase.PROJECT_GENERATION, + alwaysFailingParser("Dependent module setting should not be parsed") + ) { + defaultValue = value(DependentModuleReference.EMPTY) + } + + data class DependentModuleReference(val module: Module?) { + companion object { + val EMPTY = DependentModuleReference(module = null) + } + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt index 04d0bac7e92..b94b727b4aa 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt @@ -15,19 +15,21 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.correspondingStdl import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem 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.ModulePath import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version +import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate import java.nio.file.Path import kotlin.properties.ReadOnlyProperty -sealed class ModuleCondifuratorSettingsEnvironment { - abstract val > ModuleConfiguratorSetting.reference: ModuleConfiguratorSettingReference +interface ModuleConfiguratorSettingsEnvironment { + val > ModuleConfiguratorSetting.reference: ModuleConfiguratorSettingReference } class ModuleBasedConfiguratorSettingsEnvironment( private val configurator: ModuleConfigurator, private val module: Module -) : ModuleCondifuratorSettingsEnvironment() { +) : ModuleConfiguratorSettingsEnvironment { override val > ModuleConfiguratorSetting.reference: ModuleConfiguratorSettingReference get() = ModuleBasedConfiguratorSettingReference(configurator, module, this) } @@ -35,7 +37,7 @@ class ModuleBasedConfiguratorSettingsEnvironment( class IdBasedConfiguratorSettingsEnvironment( private val configurator: ModuleConfigurator, private val moduleId: Identificator -) : ModuleCondifuratorSettingsEnvironment() { +) : ModuleConfiguratorSettingsEnvironment { override val > ModuleConfiguratorSetting.reference: ModuleConfiguratorSettingReference get() = IdBasedConfiguratorSettingReference(configurator, moduleId, this) } @@ -43,13 +45,13 @@ class IdBasedConfiguratorSettingsEnvironment( fun withSettingsOf( moduleId: Identificator, configurator: ModuleConfigurator, - function: ModuleCondifuratorSettingsEnvironment.() -> T + function: ModuleConfiguratorSettingsEnvironment.() -> T ): T = function(IdBasedConfiguratorSettingsEnvironment(configurator, moduleId)) fun withSettingsOf( module: Module, configurator: ModuleConfigurator = module.configurator, - function: ModuleCondifuratorSettingsEnvironment.() -> T + function: ModuleConfiguratorSettingsEnvironment.() -> T ): T = function(ModuleBasedConfiguratorSettingsEnvironment(configurator, module)) @@ -231,6 +233,12 @@ interface ModuleConfigurator : DisplayableSettingItem, EntitiesOwnerDescriptor { modulePath: Path ): TaskResult = UNIT_SUCCESS + fun Reader.createTemplates( + configurationData: ModulesToIrConversionData, + module: Module, + modulePath: Path + ): List = emptyList() + companion object { val ALL = buildList { +RealNativeTargetConfigurator.configurators 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 e2be5d66578..1156feeb002 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 @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle.GradlePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle +import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import java.nio.file.Path @@ -106,8 +107,13 @@ class ModulesToIRsConverter( val to = data.moduleByPath.getValue(dependency.path) val (dependencyType) = ModuleDependencyType.getPossibleDependencyType(module, to) .toResult { InvalidModuleDependencyError(module, to) } - dependencyType.createDependencyIrs(module, to, data) - }.sequence() + + with(dependencyType) { + @Suppress("DEPRECATION") + with(unsafeSettingWriter) { runArbitraryTask(module, to, data).ensure() } + createDependencyIrs(module, to, data) + } + }.sequence().map { it.flatten() } mutateProjectStructureByModuleConfigurator(module, modulePath) val buildFileIR = run { if (!configurator.needCreateBuildFile) return@run null @@ -237,6 +243,7 @@ class ModulesToIRsConverter( compute { rootBuildFileIrs += createRootBuildFileIrs(data) runArbitraryTask(data, module, modulePath).ensure() + TemplatesPlugin::addFileTemplates.execute(createTemplates(data, module, modulePath)).ensure() if (this@with is GradleModuleConfigurator) { GradlePlugin::settingsGradleFileIRs.addValues(createSettingsGradleIRs(module)).ensure() } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index 51de97e7947..ffd0b8dcc52 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -23,18 +23,22 @@ sealed class ProjectTemplate : DisplayableSettingItem { private val setsDefaultValues: List> get() = listOf(KotlinPlugin::projectKind.reference withValue projectKind) - protected abstract val setsPluginSettings: List> + protected open val setsPluginSettings: List> = emptyList() + protected open val setsModules: List = emptyList() private val setsAdditionalSettingValues = mutableListOf>() val setsValues: List> get() = buildList { + setsModules.takeIf { it.isNotEmpty() }?.let { modules -> + +(KotlinPlugin::modules withValue modules) + } +setsDefaultValues +setsPluginSettings +setsAdditionalSettingValues } - fun Module.withTemplate( + protected fun Module.withTemplate( template: T, createSettings: TemplateSettingsBuilder.() -> Unit = {} ) = apply { @@ -45,6 +49,17 @@ sealed class ProjectTemplate : DisplayableSettingItem { } } + protected fun Module.withConfiguratorSettings( + configurator: C, + createSettings: ConfiguratorSettingsBuilder.() -> Unit = {} + ) = apply { + assert(this.configurator === configurator) + with(ConfiguratorSettingsBuilder(this, configurator)) { + createSettings() + setsAdditionalSettingValues += setsSettings + } + } + companion object { val ALL = listOf( @@ -55,6 +70,7 @@ sealed class ProjectTemplate : DisplayableSettingItem { MultiplatformLibrary, AndroidApplication, IOSApplication, + MPPMobileApplication, MultiplatformMobileLibrary, NativeConsoleApplication, JsBrowserApplication @@ -77,6 +93,23 @@ class TemplateSettingsBuilder( infix fun > TemplateSetting.withValue(value: V) { settings += SettingWithValue(reference, value) } +} + +class ConfiguratorSettingsBuilder( + val module: Module, + val configurator: C +) : ModuleConfiguratorSettingsEnvironment by ModuleBasedConfiguratorSettingsEnvironment(configurator, module) { + init { + assert(module.configurator === configurator) + } + + private val settings = mutableListOf>() + val setsSettings: List> + get() = settings + + infix fun > ModuleConfiguratorSetting.withValue(value: V) { + settings += SettingWithValue(reference, value) + } } @@ -89,7 +122,7 @@ inline infix fun > PluginSettingPropertyRefe value: V ): SettingWithValue = reference.withValue(value) -private fun ModuleType.createDefaultSourcesets() = +private fun createDefaultSourcesets() = SourcesetType.values().map { sourcesetType -> Sourceset( sourcesetType, @@ -110,7 +143,7 @@ object EmptySingleplatformProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( KotlinPlugin::modules withValue listOf( - SingleplatformModule("mainModule", ModuleType.jvm.createDefaultSourcesets()) + SingleplatformModule("mainModule", createDefaultSourcesets()) ) ) } @@ -140,7 +173,7 @@ object JvmConsoleApplication : ProjectTemplate() { KotlinPlugin::modules withValue listOf( SingleplatformModule( "consoleApp", - ModuleType.jvm.createDefaultSourcesets() + createDefaultSourcesets() ).apply { withTemplate(ConsoleJvmApplicationTemplate()) } @@ -173,7 +206,7 @@ object MultiplatformLibrary : ProjectTemplate() { object JvmServerJsClient : ProjectTemplate() { override val title: String = "Full-Stack Web Application" override val description: String = "" + - "Create a fully-functional web application using Kotlin/JS for the frontend and Kotlin/JVM for the backend" + "Create a fully-functional web application using Kotlin/JS for the frontend and Kotlin/JVM for the backend." override val suggestedProjectName: String = "myFullStackApplication" override val projectKind: ProjectKind = ProjectKind.Multiplatform override val setsPluginSettings: List> = listOf( @@ -288,6 +321,57 @@ object IOSApplication : ProjectTemplate() { ) } +object MPPMobileApplication : ProjectTemplate() { + override val title = "Multiplatform Mobile Application" + + override val description = + "Create mobile applications for iOS and Android with Kotlin Multiplatform Mobile, which supports sharing common code between platforms." + override val suggestedProjectName = "myIOSApplication" + override val projectKind = ProjectKind.Multiplatform + + override val setsModules: List = buildList { + val shared = MultiplatformModule( + "shared", + listOf( + ModuleType.common.createDefaultTarget(), + Module( + "android", + AndroidTargetConfigurator, + null, + sourcesets = createDefaultSourcesets(), + subModules = emptyList() + ).withConfiguratorSettings(AndroidTargetConfigurator) { + configurator.androidPlugin withValue AndroidGradlePlugin.APPLICATION + }, + Module( + "ios", + RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.iosX64), + null, + sourcesets = createDefaultSourcesets(), + subModules = emptyList() + ) + ) + ) + +shared + +Module( + "iosApp", + IOSSinglePlatformModuleConfigurator, + template = null, + sourcesets = createDefaultSourcesets(), + subModules = emptyList(), + dependencies = mutableListOf(ModuleReference.ByModule(shared)) + ) + +Module( + "androidApp", + AndroidSinglePlatformModuleConfigurator, + template = null, + sourcesets = createDefaultSourcesets(), + subModules = emptyList(), + dependencies = mutableListOf(ModuleReference.ByModule(shared)) + ) + } +} + object MultiplatformMobileLibrary : ProjectTemplate() { override val title = "Multiplatform Mobile Library" override val description = "Create a library that supports sharing code between iOS and Android." @@ -309,7 +393,9 @@ object MultiplatformMobileLibrary : ProjectTemplate() { Sourceset(type, dependencies = emptyList()) }, emptyList() - ), + ).withConfiguratorSettings(AndroidTargetConfigurator) { + configurator.androidPlugin withValue AndroidGradlePlugin.LIBRARY + }, Module( "ios", RealNativeTargetConfigurator.configuratorsByModuleType.getValue(ModuleSubType.iosX64), 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 af6d00b7fd9..c56c3808138 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 @@ -5,12 +5,13 @@ package org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem +import org.jetbrains.kotlin.tools.projectWizard.core.* +import org.jetbrains.kotlin.tools.projectWizard.core.asSingletonList import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.GradleRootProjectDependencyIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleDependencyIR -import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JvmSinglePlatformModuleConfigurator -import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator +import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.* import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModulesToIrConversionData import kotlin.reflect.KClass @@ -22,7 +23,7 @@ sealed class ModuleDependencyType( fun accepts(from: Module, to: Module) = this.from.isInstance(from.configurator) && this.to.isInstance(to.configurator) - open fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): BuildSystemIR { + open fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): List { val path = to.path val modulePomIr = data.pomIr.copy(artifactId = to.name) return when { @@ -34,18 +35,45 @@ sealed class ModuleDependencyType( modulePomIr, DependencyType.MAIN ) - } + }.asSingletonList() } + open fun SettingsWriter.runArbitraryTask(from: Module, to: Module, data: ModulesToIrConversionData): TaskResult = + UNIT_SUCCESS object JVMSinglePlatformToJVMSinglePlatform : ModuleDependencyType( from = JvmSinglePlatformModuleConfigurator::class, to = JvmSinglePlatformModuleConfigurator::class ) + object AndroidSinglePlatformToMPP : ModuleDependencyType( + from = AndroidSinglePlatformModuleConfigurator::class, + to = MppModuleConfigurator::class + ) + + object IOSToMppSinglePlatformToMPP : ModuleDependencyType( + from = IOSSinglePlatformModuleConfigurator::class, + to = MppModuleConfigurator::class + ) { + override fun createDependencyIrs(from: Module, to: Module, data: ModulesToIrConversionData): List = + emptyList() + + override fun SettingsWriter.runArbitraryTask( + from: Module, + to: Module, + data: ModulesToIrConversionData + ): TaskResult = withSettingsOf(from) { + IOSSinglePlatformModuleConfigurator.dependentModule.reference + .setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to)) + UNIT_SUCCESS + } + } + companion object { private val ALL = listOf( - JVMSinglePlatformToJVMSinglePlatform + JVMSinglePlatformToJVMSinglePlatform, + AndroidSinglePlatformToMPP, + IOSToMppSinglePlatformToMPP ) fun getPossibleDependencyType(from: Module, to: Module): ModuleDependencyType? =