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.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\")")
}
@@ -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\")")
@@ -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?