MPP wizard: introduce structure: root <- common <- js / jvm

This commit also removes deprecated structure with common root
So #KT-20554 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-06-08 19:17:32 +03:00
parent cf294b57f0
commit 3d4b407d0c
3 changed files with 47 additions and 59 deletions
@@ -21,7 +21,6 @@ import com.intellij.ide.util.projectWizard.WizardContext
import com.intellij.openapi.externalSystem.service.project.wizard.ExternalModuleSettingsStep import com.intellij.openapi.externalSystem.service.project.wizard.ExternalModuleSettingsStep
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.ui.configuration.ModulesProvider import com.intellij.openapi.roots.ui.configuration.ModulesProvider
import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
@@ -33,6 +32,7 @@ import org.jetbrains.plugins.gradle.service.settings.GradleProjectSettingsContro
import javax.swing.Icon import javax.swing.Icon
class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
var commonModuleIsParent = false
var commonModuleName: String? = null var commonModuleName: String? = null
var jvmModuleName: String? = null var jvmModuleName: String? = null
var jdk: Sdk? = 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) { override fun setupModule(module: Module) {
try { try {
module.gradleModuleBuilder = this module.gradleModuleBuilder = this
super.setupModule(module) super.setupModule(module)
val contentRoot = module.rootManager.contentRoots.firstOrNull() ?: return val rootDir = module.rootManager.contentRoots.firstOrNull() ?: return
setupCommonModule(module, contentRoot) val commonDir = setupCommonModule(module, rootDir)
setupPlatformModule(module, contentRoot, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk) val platformRootDir = if (commonModuleIsParent) commonDir else rootDir
setupPlatformModule(module, contentRoot, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider()) setupPlatformModule(module, platformRootDir, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk)
setupPlatformModule(module, platformRootDir, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider())
updateSettingsScript(module) { 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()) { if (includedModules.isNotEmpty()) {
it.addIncludedModules(includedModules) it.addIncludedModules(includedModules)
} }
@@ -91,35 +85,36 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
private fun setupChildModule( private fun setupChildModule(
rootModule: Module, rootModule: Module,
contentRoot: VirtualFile, parentDir: VirtualFile?,
childModuleName: String?, childModuleName: String?,
sdk: Sdk? = null, sdk: Sdk? = null,
extendScript: (BuildScriptDataBuilder, Sdk?) -> Unit = { _, _ -> } extendScript: (BuildScriptDataBuilder, Sdk?) -> Unit = { _, _ -> }
) { ): VirtualFile? {
if (childModuleName.isNullOrEmpty()) return 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 buildGradle = moduleDir.createChildData(null, "build.gradle")
val buildScriptData = BuildScriptDataBuilder(buildGradle) val buildScriptData = BuildScriptDataBuilder(buildGradle)
extendScript(buildScriptData, sdk ?: rootModule.rootManager.sdk) extendScript(buildScriptData, sdk ?: rootModule.rootManager.sdk)
VfsUtil.saveText(buildGradle, buildScriptData.buildConfigurationPart() + buildScriptData.buildMainPart()) VfsUtil.saveText(buildGradle, buildScriptData.buildConfigurationPart() + buildScriptData.buildMainPart())
return moduleDir
} }
private fun setupCommonModule( private fun setupCommonModule(
rootModule: Module, rootModule: Module,
contentRoot: VirtualFile parentDir: VirtualFile?
) = setupChildModule(rootModule, contentRoot, commonModuleName) { builder, sdk -> ) = setupChildModule(rootModule, parentDir, commonModuleName) { builder, sdk ->
GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, true) GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, specifyPluginVersionIfNeeded = true)
} }
private fun setupPlatformModule( private fun setupPlatformModule(
rootModule: Module, rootModule: Module,
contentRoot: VirtualFile, parentDir: VirtualFile?,
platformModuleName: String?, platformModuleName: String?,
supportProvider: GradleKotlinFrameworkSupportProvider, supportProvider: GradleKotlinFrameworkSupportProvider,
sdk: Sdk? = null sdk: Sdk? = null
) = setupChildModule(rootModule, contentRoot, platformModuleName, sdk) { builder, finalSdk -> ) = setupChildModule(rootModule, parentDir, platformModuleName, sdk) { builder, finalSdk ->
supportProvider.addSupport(builder, rootModule, finalSdk, !commonModuleName.isNullOrEmpty()) supportProvider.addSupport(builder, rootModule, finalSdk, specifyPluginVersionIfNeeded = !commonModuleIsParent)
val dependency = commonModuleName ?: "" val dependency = commonModuleName ?: ""
builder.addDependencyNotation("expectedBy project(\":$dependency\")") builder.addDependencyNotation("expectedBy project(\":$dependency\")")
} }
@@ -22,7 +22,6 @@ import com.intellij.openapi.externalSystem.service.project.wizard.ExternalModule
import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.ui.configuration.ModulesProvider import com.intellij.openapi.roots.ui.configuration.ModulesProvider
import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
@@ -35,6 +34,7 @@ import org.jetbrains.plugins.gradle.service.settings.GradleProjectSettingsContro
import javax.swing.Icon import javax.swing.Icon
class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() { class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
var commonModuleIsParent = false
var commonModuleName: String? = null var commonModuleName: String? = null
var jvmModuleName: String? = null var jvmModuleName: String? = null
var jdk: Sdk? = 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) { override fun setupModule(module: Module) {
super.setupModule(module) super.setupModule(module)
val contentRoot = module.rootManager.contentRoots.firstOrNull() ?: return val rootDir = module.rootManager.contentRoots.firstOrNull() ?: return
setupCommonModule(module, contentRoot) val commonDir = setupCommonModule(module, rootDir)
setupPlatformModule(module, contentRoot, jvmModuleName, GradleKotlinMPPJavaFrameworkSupportProvider(), jdk) val platformRootDir = if (commonModuleIsParent) commonDir else rootDir
setupPlatformModule(module, contentRoot, jsModuleName, GradleKotlinMPPJSFrameworkSupportProvider()) 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 { settingsGradle?.let {
module.project.executeCommand("Update settings.gradle") { module.project.executeCommand("Update settings.gradle") {
val doc = FileDocumentManager.getInstance().getDocument(it) ?: return@executeCommand 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()) { if (includedModules.isNotEmpty()) {
doc.insertString(doc.textLength, includedModules.joinToString(prefix = "include ") { "'$it'" }) doc.insertString(doc.textLength, includedModules.joinToString(prefix = "include ") { "'$it'" })
} }
@@ -92,34 +86,35 @@ class KotlinGradleMultiplatformModuleBuilder : GradleModuleBuilder() {
private fun setupChildModule( private fun setupChildModule(
rootModule: Module, rootModule: Module,
contentRoot: VirtualFile, parentDir: VirtualFile?,
childModuleName: String?, childModuleName: String?,
sdk: Sdk? = null, sdk: Sdk? = null,
extendScript: (BuildScriptDataBuilder, Sdk?) -> Unit = { _, _ -> } extendScript: (BuildScriptDataBuilder, Sdk?) -> Unit = { _, _ -> }
) { ): VirtualFile? {
if (childModuleName.isNullOrEmpty()) return 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 buildGradle = moduleDir.createChildData(null, "build.gradle")
val buildScriptData = BuildScriptDataBuilder(buildGradle) val buildScriptData = BuildScriptDataBuilder(buildGradle)
extendScript(buildScriptData, sdk ?: rootModule.rootManager.sdk) extendScript(buildScriptData, sdk ?: rootModule.rootManager.sdk)
VfsUtil.saveText(buildGradle, buildScriptData.build()) VfsUtil.saveText(buildGradle, buildScriptData.build())
return moduleDir
} }
private fun setupCommonModule( private fun setupCommonModule(
rootModule: Module, rootModule: Module,
contentRoot: VirtualFile parentDir: VirtualFile?
) = setupChildModule(rootModule, contentRoot, commonModuleName) { builder, sdk -> ) = setupChildModule(rootModule, parentDir, commonModuleName) { builder, sdk ->
GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, true) GradleKotlinMPPCommonFrameworkSupportProvider().addSupport(builder, rootModule, sdk, true)
} }
private fun setupPlatformModule( private fun setupPlatformModule(
rootModule: Module, rootModule: Module,
contentRoot: VirtualFile, parentDir: VirtualFile?,
platformModuleName: String?, platformModuleName: String?,
supportProvider: GradleKotlinFrameworkSupportProvider, supportProvider: GradleKotlinFrameworkSupportProvider,
sdk: Sdk? = null sdk: Sdk? = null
) = setupChildModule(rootModule, contentRoot, platformModuleName, sdk) { builder, finalSdk -> ) = setupChildModule(rootModule, parentDir, platformModuleName, sdk) { builder, finalSdk ->
supportProvider.addSupport(builder, rootModule, finalSdk, true) supportProvider.addSupport(builder, rootModule, finalSdk, true)
val dependency = commonModuleName ?: "" val dependency = commonModuleName ?: ""
builder.addDependencyNotation("expectedBy project(\":$dependency\")") builder.addDependencyNotation("expectedBy project(\":$dependency\")")
@@ -42,8 +42,8 @@ class KotlinGradleMultiplatformWizardStep(
private val hierarchyKindComponent = ComboBox( private val hierarchyKindComponent = ComboBox(
arrayOf( arrayOf(
"Root empty module with common & platform children", "Root with common & platform children",
"Root common module with children platform modules" "Root with common child & platform grand-children"
), 400 ), 400
) )
private val rootModuleNameComponent = JTextField() private val rootModuleNameComponent = JTextField()
@@ -104,9 +104,6 @@ class KotlinGradleMultiplatformWizardStep(
jdkComboBox.selectedJdk = jdkModel.projectSdk jdkComboBox.selectedJdk = jdkModel.projectSdk
hierarchyKindComponent.addActionListener {
commonModuleNameComponent.isEnabled = !commonModuleIsRoot
}
jvmCheckBox.addItemListener { jvmCheckBox.addItemListener {
jvmModuleNameComponent.isEnabled = jvmCheckBox.isSelected jvmModuleNameComponent.isEnabled = jvmCheckBox.isSelected
jdkComboBox.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 getRootModuleError() = if (rootModuleName.isEmpty()) "Please specify the root module name" else null
private fun getCommonModuleError() = when { private fun getCommonModuleError() = when {
!commonModuleIsRoot && commonModuleName.isEmpty() -> commonModuleName.isEmpty() ->
"Please specify the common module name" "Please specify the common module name"
commonModuleName.isNotEmpty() && commonModuleName.isNotEmpty() &&
@@ -208,6 +205,7 @@ class KotlinGradleMultiplatformWizardStep(
wizardContext.projectName = rootModuleName wizardContext.projectName = rootModuleName
builder.projectId = ProjectId("", rootModuleName, "") builder.projectId = ProjectId("", rootModuleName, "")
builder.commonModuleIsParent = commonModuleIsParent
builder.commonModuleName = commonModuleName builder.commonModuleName = commonModuleName
builder.jvmModuleName = jvmModuleName builder.jvmModuleName = jvmModuleName
builder.jdk = jdk builder.jdk = jdk
@@ -216,12 +214,12 @@ class KotlinGradleMultiplatformWizardStep(
override fun getComponent() = panel override fun getComponent() = panel
private val commonModuleIsRoot: Boolean private val commonModuleIsParent: Boolean
get() = hierarchyKindComponent.selectedIndex != 0 get() = hierarchyKindComponent.selectedIndex != 0
private val rootModuleName: String private val rootModuleName: String
get() = rootModuleNameComponent.text get() = rootModuleNameComponent.text
private val commonModuleName: String private val commonModuleName: String
get() = if (commonModuleIsRoot) "" else commonModuleNameComponent.text get() = commonModuleNameComponent.text
private val jvmModuleName: String private val jvmModuleName: String
get() = if (jvmCheckBox.isSelected) jvmModuleNameComponent.text else "" get() = if (jvmCheckBox.isSelected) jvmModuleNameComponent.text else ""
private val jdk: Sdk? private val jdk: Sdk?