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:
+21
-26
@@ -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\")")
|
||||
}
|
||||
|
||||
+20
-25
@@ -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\")")
|
||||
|
||||
+6
-8
@@ -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?
|
||||
|
||||
Reference in New Issue
Block a user