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