diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt index 34e749d799a..2d2722c008c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt @@ -21,7 +21,6 @@ import com.intellij.ide.util.projectWizard.WizardContext import com.intellij.openapi.externalSystem.service.project.wizard.ExternalModuleSettingsStep import com.intellij.openapi.module.Module import com.intellij.openapi.projectRoots.Sdk -import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.roots.ui.configuration.ModulesProvider import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile @@ -33,6 +32,7 @@ import org.jetbrains.plugins.gradle.service.settings.GradleProjectSettingsContro import javax.swing.Icon class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { + var commonModuleIsParent = false var commonModuleName: String? = null var jvmModuleName: String? = null var jdk: Sdk? = null @@ -57,29 +57,23 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { ) } - override fun setupRootModel(modifiableRootModel: ModifiableRootModel) { - super.setupRootModel(modifiableRootModel) - if (commonModuleName.isNullOrEmpty()) { - val module = modifiableRootModel.module - val buildScriptData = getBuildScriptData(module) ?: return - val sdk = modifiableRootModel.sdk - GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(buildScriptData, module, sdk, true) - } - } - override fun setupModule(module: Module) { try { module.gradleModuleBuilder = this super.setupModule(module) - val contentRoot = module.rootManager.contentRoots.firstOrNull() ?: return - setupCommonModule(module, contentRoot) - setupPlatformModule(module, contentRoot, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk) - setupPlatformModule(module, contentRoot, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider()) + val rootDir = module.rootManager.contentRoots.firstOrNull() ?: return + val commonDir = setupCommonModule(module, rootDir) + val platformRootDir = if (commonModuleIsParent) commonDir else rootDir + setupPlatformModule(module, platformRootDir, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk) + setupPlatformModule(module, platformRootDir, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider()) updateSettingsScript(module) { - val includedModules = listOfNotNull(commonModuleName, jvmModuleName, jsModuleName).filter { it.isNotEmpty() } + val includedModules = listOfNotNull(commonModuleName, jvmModuleName, jsModuleName).filter { it.isNotEmpty() }.map { + if (!commonModuleIsParent || it == commonModuleName) it + else "$commonModuleName:$it" + } if (includedModules.isNotEmpty()) { it.addIncludedModules(includedModules) } @@ -91,35 +85,36 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { private fun setupChildModule( rootModule: Module, - contentRoot: VirtualFile, + parentDir: VirtualFile?, childModuleName: String?, sdk: Sdk? = null, extendScript: (BuildScriptDataBuilder, Sdk?) -> Unit = { _, _ -> } - ) { - if (childModuleName.isNullOrEmpty()) return + ): VirtualFile? { + if (parentDir == null || childModuleName.isNullOrEmpty()) return null - val moduleDir = contentRoot.createChildDirectory(this, childModuleName!!) + val moduleDir = parentDir.createChildDirectory(this, childModuleName!!) val buildGradle = moduleDir.createChildData(null, "build.gradle") val buildScriptData = BuildScriptDataBuilder(buildGradle) extendScript(buildScriptData, sdk ?: rootModule.rootManager.sdk) VfsUtil.saveText(buildGradle, buildScriptData.buildConfigurationPart() + buildScriptData.buildMainPart()) + return moduleDir } private fun setupCommonModule( rootModule: Module, - contentRoot: VirtualFile - ) = setupChildModule(rootModule, contentRoot, commonModuleName) { builder, sdk -> - GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, true) + parentDir: VirtualFile? + ) = setupChildModule(rootModule, parentDir, commonModuleName) { builder, sdk -> + GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, specifyPluginVersionIfNeeded = true) } private fun setupPlatformModule( rootModule: Module, - contentRoot: VirtualFile, + parentDir: VirtualFile?, platformModuleName: String?, supportProvider: GradleKotlinFrameworkSupportProvider, sdk: Sdk? = null - ) = setupChildModule(rootModule, contentRoot, platformModuleName, sdk) { builder, finalSdk -> - supportProvider.addSupport(builder, rootModule, finalSdk, !commonModuleName.isNullOrEmpty()) + ) = setupChildModule(rootModule, parentDir, platformModuleName, sdk) { builder, finalSdk -> + supportProvider.addSupport(builder, rootModule, finalSdk, specifyPluginVersionIfNeeded = !commonModuleIsParent) val dependency = commonModuleName ?: "" builder.addDependencyNotation("expectedBy project(\":$dependency\")") } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt.172 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt.172 index 09d84ad7857..c54b6828102 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt.172 +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformModuleBuilder.kt.172 @@ -22,7 +22,6 @@ import com.intellij.openapi.externalSystem.service.project.wizard.ExternalModule import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.module.Module import com.intellij.openapi.projectRoots.Sdk -import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.roots.ui.configuration.ModulesProvider import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile @@ -35,6 +34,7 @@ import org.jetbrains.plugins.gradle.service.settings.GradleProjectSettingsContro import javax.swing.Icon class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { + var commonModuleIsParent = false var commonModuleName: String? = null var jvmModuleName: String? = null var jdk: Sdk? = null @@ -59,29 +59,23 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { ) } - override fun setupRootModel(modifiableRootModel: ModifiableRootModel) { - super.setupRootModel(modifiableRootModel) - if (commonModuleName.isNullOrEmpty()) { - val module = modifiableRootModel.module - val buildScriptData = getBuildScriptData(module) ?: return - val sdk = modifiableRootModel.sdk - GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(buildScriptData, module, sdk, true) - } - } - override fun setupModule(module: Module) { super.setupModule(module) - val contentRoot = module.rootManager.contentRoots.firstOrNull() ?: return - setupCommonModule(module, contentRoot) - setupPlatformModule(module, contentRoot, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk) - setupPlatformModule(module, contentRoot, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider()) + val rootDir = module.rootManager.contentRoots.firstOrNull() ?: return + val commonDir = setupCommonModule(module, rootDir) + val platformRootDir = if (commonModuleIsParent) commonDir else rootDir + setupPlatformModule(module, platformRootDir, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk) + setupPlatformModule(module, platformRootDir, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider()) - val settingsGradle = contentRoot.findChild("settings.gradle") + val settingsGradle = rootDir.findChild("settings.gradle") settingsGradle?.let { module.project.executeCommand("Update settings.gradle") { val doc = FileDocumentManager.getInstance().getDocument(it) ?: return@executeCommand - val includedModules = listOfNotNull(commonModuleName, jvmModuleName, jsModuleName).filter { it.isNotEmpty() } + val includedModules = listOfNotNull(commonModuleName, jvmModuleName, jsModuleName).filter { it.isNotEmpty() }.map { + if (!commonModuleIsParent || it == commonModuleName) it + else "$commonModuleName:$it" + } if (includedModules.isNotEmpty()) { doc.insertString(doc.textLength, includedModules.joinToString(prefix = "include ") { "'$it'" }) } @@ -92,34 +86,35 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { private fun setupChildModule( rootModule: Module, - contentRoot: VirtualFile, + parentDir: VirtualFile?, childModuleName: String?, sdk: Sdk? = null, extendScript: (BuildScriptDataBuilder, Sdk?) -> Unit = { _, _ -> } - ) { - if (childModuleName.isNullOrEmpty()) return + ): VirtualFile? { + if (parentDir == null || childModuleName.isNullOrEmpty()) return null - val moduleDir = contentRoot.createChildDirectory(this, childModuleName!!) + val moduleDir = parentDir.createChildDirectory(this, childModuleName!!) val buildGradle = moduleDir.createChildData(null, "build.gradle") val buildScriptData = BuildScriptDataBuilder(buildGradle) extendScript(buildScriptData, sdk ?: rootModule.rootManager.sdk) VfsUtil.saveText(buildGradle, buildScriptData.build()) + return moduleDir } private fun setupCommonModule( rootModule: Module, - contentRoot: VirtualFile - ) = setupChildModule(rootModule, contentRoot, commonModuleName) { builder, sdk -> + parentDir: VirtualFile? + ) = setupChildModule(rootModule, parentDir, commonModuleName) { builder, sdk -> GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, true) } private fun setupPlatformModule( rootModule: Module, - contentRoot: VirtualFile, + parentDir: VirtualFile?, platformModuleName: String?, supportProvider: GradleKotlinFrameworkSupportProvider, sdk: Sdk? = null - ) = setupChildModule(rootModule, contentRoot, platformModuleName, sdk) { builder, finalSdk -> + ) = setupChildModule(rootModule, parentDir, platformModuleName, sdk) { builder, finalSdk -> supportProvider.addSupport(builder, rootModule, finalSdk, true) val dependency = commonModuleName ?: "" builder.addDependencyNotation("expectedBy project(\":$dependency\")") diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformWizardStep.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformWizardStep.kt index 859b1f55654..b9e7ec2d0ab 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformWizardStep.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleMultiplatformWizardStep.kt @@ -42,8 +42,8 @@ class KotlinGradleMultiplatformWizardStep( private val hierarchyKindComponent = ComboBox( arrayOf( - "Root empty module with common & platform children", - "Root common module with children platform modules" + "Root with common & platform children", + "Root with common child & platform grand-children" ), 400 ) private val rootModuleNameComponent = JTextField() @@ -104,9 +104,6 @@ class KotlinGradleMultiplatformWizardStep( jdkComboBox.selectedJdk = jdkModel.projectSdk - hierarchyKindComponent.addActionListener { - commonModuleNameComponent.isEnabled = !commonModuleIsRoot - } jvmCheckBox.addItemListener { jvmModuleNameComponent.isEnabled = jvmCheckBox.isSelected jdkComboBox.isEnabled = jvmCheckBox.isSelected @@ -156,7 +153,7 @@ class KotlinGradleMultiplatformWizardStep( private fun getRootModuleError() = if (rootModuleName.isEmpty()) "Please specify the root module name" else null private fun getCommonModuleError() = when { - !commonModuleIsRoot && commonModuleName.isEmpty() -> + commonModuleName.isEmpty() -> "Please specify the common module name" commonModuleName.isNotEmpty() && @@ -208,6 +205,7 @@ class KotlinGradleMultiplatformWizardStep( wizardContext.projectName = rootModuleName builder.projectId = ProjectId("", rootModuleName, "") + builder.commonModuleIsParent = commonModuleIsParent builder.commonModuleName = commonModuleName builder.jvmModuleName = jvmModuleName builder.jdk = jdk @@ -216,12 +214,12 @@ class KotlinGradleMultiplatformWizardStep( override fun getComponent() = panel - private val commonModuleIsRoot: Boolean + private val commonModuleIsParent: Boolean get() = hierarchyKindComponent.selectedIndex != 0 private val rootModuleName: String get() = rootModuleNameComponent.text private val commonModuleName: String - get() = if (commonModuleIsRoot) "" else commonModuleNameComponent.text + get() = commonModuleNameComponent.text private val jvmModuleName: String get() = if (jvmCheckBox.isSelected) jvmModuleNameComponent.text else "" private val jdk: Sdk?