Wizard: all context operations to read/write operations

This commit is contained in:
Ilya Kirillov
2020-03-09 21:02:13 +03:00
parent 81c7cb20f3
commit 691ee7412a
94 changed files with 570 additions and 632 deletions
@@ -1,22 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.wizard
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
class IdeContext(context: Context, servicesManager: ServicesManager, isUnitTestMode: Boolean) :
SettingsWritingContext(
context,
servicesManager,
isUnitTestMode
) {
val eventManager
get() = context.eventManager
}
@@ -4,8 +4,8 @@ import org.jetbrains.kotlin.tools.projectWizard.core.PluginsCreator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
@@ -25,8 +25,6 @@ class IdeWizard(
},
isUnitTestMode
) {
val ideContext = IdeContext(context, servicesManager, isUnitTestMode)
init {
initPluginSettingsDefaultValues()
}
@@ -43,12 +41,15 @@ class IdeWizard(
private fun <V : Any, T : SettingType<V>> setting(reference: SettingReference<V, T>) =
object : ReadWriteProperty<Any?, V?> {
override fun setValue(thisRef: Any?, property: KProperty<*>, value: V?) {
context.settingContext[reference] = value ?: return
if (value == null) return
context.writeSettings {
reference.setValue(value)
}
}
@Suppress("UNCHECKED_CAST")
override fun getValue(thisRef: Any?, property: KProperty<*>): V? =
context.settingContext[reference]
override fun getValue(thisRef: Any?, property: KProperty<*>): V? = context.read {
reference.notRequiredSettingValue
}
}
}
@@ -132,7 +132,9 @@ class NewProjectWizardModuleBuilder : EmptyModuleBuilder() {
}
override fun validateModuleName(moduleName: String): Boolean {
when (val validationResult = projectNameValidator.validate(wizard.valuesReadingContext, moduleName)) {
when (val validationResult = wizard.context.read {
projectNameValidator.validate(this, moduleName)
}) {
ValidationResult.OK -> return true
is ValidationResult.ValidationError -> {
val message = validationResult.messages.firstOrNull() ?: INVALID_PROJECT_NAME_MESSAGE
@@ -143,7 +145,7 @@ class NewProjectWizardModuleBuilder : EmptyModuleBuilder() {
private fun updateProjectNameAndPomDate(settingsStep: SettingsStep) {
if (pomValuesAreSet) return
val suggestedProjectName = with(wizard.valuesReadingContext) {
val suggestedProjectName = wizard.context.read {
ProjectTemplatesPlugin::template.settingValue.suggestedProjectName.decapitalize()
}
settingsStep.moduleNameLocationSettings?.apply {
@@ -182,7 +184,7 @@ class NewProjectWizardModuleBuilder : EmptyModuleBuilder() {
abstract class WizardStep(protected val wizard: IdeWizard, private val phase: GenerationPhase) : ModuleWizardStep() {
override fun updateDataModel() = Unit // model is updated on every UI action
override fun validate(): Boolean =
when (val result = with(wizard.valuesReadingContext) { with(wizard) { validate(setOf(phase)) } }) {
when (val result = wizard.context.read{ with(wizard) { validate(setOf(phase)) } }) {
is Success<*> -> true
is Failure -> {
throw ConfigurationException(result.asHtml(), KotlinNewProjectWizardBundle.message("error.validation"))
@@ -194,7 +196,7 @@ private class PomWizardStep(
originalSettingStep: SettingsStep,
wizard: IdeWizard
) : WizardStep(wizard, GenerationPhase.PROJECT_GENERATION) {
private val pomWizardStepComponent = PomWizardStepComponent(wizard.ideContext)
private val pomWizardStepComponent = PomWizardStepComponent(wizard.context)
init {
originalSettingStep.addSettingsComponent(component)
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.tools.projectWizard.core.asNullable
import org.jetbrains.kotlin.tools.projectWizard.core.compute
import org.jetbrains.kotlin.tools.projectWizard.core.safe
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderServiceImpl
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.runWithProgressBar
import java.io.BufferedReader
@@ -10,7 +10,8 @@ import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunCo
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService
import org.jetbrains.kotlin.tools.projectWizard.core.service.isBuildSystemAvailable
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.service
import com.intellij.openapi.module.ModifiableModuleModel
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
interface IdeaWizardService : WizardService
@@ -1,9 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSettingPropertyReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
@@ -21,7 +22,7 @@ abstract class Component : Displayable {
}
}
abstract class DynamicComponent(private val ideContext: IdeContext) : Component() {
abstract class DynamicComponent(private val context: Context) : Component() {
private var isInitialized: Boolean = false
override fun onInit() {
@@ -40,19 +41,21 @@ abstract class DynamicComponent(private val ideContext: IdeContext) : Component(
get() = reference.value
init {
ideContext.eventManager.addSettingUpdaterEventListener { reference ->
if (isInitialized) onValueUpdated(reference)
write {
eventManager.addSettingUpdaterEventListener { reference ->
if (isInitialized) onValueUpdated(reference)
}
}
}
protected fun <T> read(reader: ReadingContext.() -> T): T =
reader(ideContext)
context.read(reader)
protected fun <T> write(writer: WritingContext.() -> T): T =
writer(ideContext)
context.write(writer)
protected fun <T> modify(modifier: SettingsWritingContext.() -> T): T =
modifier(ideContext)
context.writeSettings(modifier)
open fun onValueUpdated(reference: SettingReference<*, *>?) {}
}
@@ -3,7 +3,6 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import com.intellij.util.ui.HtmlPanel
import com.intellij.util.ui.UIUtil
import java.awt.Font
import javax.swing.event.HyperlinkEvent
class DescriptionPanel(initialText: String? = null) : HtmlPanel() {
private var bodyText: String? = initialText
@@ -1,30 +1,30 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import com.intellij.ui.components.panels.VerticalLayout
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.StringSettingComponent
import javax.swing.Box
import javax.swing.JSeparator
import javax.swing.SwingConstants
class PomWizardStepComponent(ideContext: IdeContext) : WizardStepComponent(ideContext) {
class PomWizardStepComponent(context: Context) : WizardStepComponent(context) {
private val groupIdComponent = StringSettingComponent(
StructurePlugin::groupId.reference,
ideContext,
context,
showLabel = true
).asSubComponent()
private val artifactIdComponent = StringSettingComponent(
StructurePlugin::artifactId.reference,
ideContext,
context,
showLabel = true
).asSubComponent()
private val versionComponent = StringSettingComponent(
StructurePlugin::version.reference,
ideContext,
context,
showLabel = true
).asSubComponent()
@@ -2,13 +2,9 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import com.intellij.ui.ColoredListCellRenderer
import com.intellij.ui.components.JBList
import org.jetbrains.kotlin.tools.projectWizard.core.ignore
import javax.swing.DefaultListModel
import javax.swing.JList
import javax.swing.ListModel
import javax.swing.ListSelectionModel
import javax.swing.event.ListDataEvent
import javax.swing.event.ListDataListener
abstract class AbstractSingleSelectableListWithIcon<V>(initialValues: List<V> = emptyList()) : JBList<V>() {
protected abstract fun ColoredListCellRenderer<V>.render(value: V)
@@ -1,13 +1,13 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import java.awt.BorderLayout
import javax.swing.JComponent
abstract class SubStep(
ideContext: IdeContext
) : DynamicComponent(ideContext) {
context: Context
) : DynamicComponent(context) {
protected abstract fun buildContent(): JComponent
final override val component: JComponent by lazy(LazyThreadSafetyMode.NONE) {
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
abstract class WizardStepComponent(
ideContext: IdeContext
) : DynamicComponent(ideContext)
context: Context
) : DynamicComponent(context)
@@ -1,18 +1,17 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.ui.components.JBCheckBox
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
class CheckboxComponent(
ideContext: IdeContext,
context: Context,
labelText: String? = null,
initialValue: Boolean? = null,
validator: SettingValidator<Boolean>? = null,
onValueUpdate: (Boolean) -> Unit = {}
) : UIComponent<Boolean>(
ideContext,
context,
labelText,
validator,
onValueUpdate
@@ -3,12 +3,11 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.ui.ComboBox
import com.intellij.ui.ColoredListCellRenderer
import com.intellij.ui.SimpleTextAttributes
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.awt.event.ItemEvent
import javax.swing.DefaultComboBoxModel
@@ -16,7 +15,7 @@ import javax.swing.Icon
import javax.swing.JList
class DropDownComponent<T : DisplayableSettingItem>(
ideContext: IdeContext,
context: Context,
initialValues: List<T> = emptyList(),
labelText: String? = null,
private val filter: (T) -> Boolean = { true },
@@ -24,7 +23,7 @@ class DropDownComponent<T : DisplayableSettingItem>(
private val iconProvider: (T) -> Icon? = { null },
onValueUpdate: (T) -> Unit = {}
) : UIComponent<T>(
ideContext,
context,
labelText,
validator,
onValueUpdate
@@ -3,22 +3,21 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.ui.TextBrowseFolderListener
import com.intellij.openapi.ui.TextFieldWithBrowseButton
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.textField
import java.nio.file.Path
import java.nio.file.Paths
import javax.swing.JComponent
class PathFieldComponent(
ideContext: IdeContext,
context: Context,
labelText: String? = null,
initialValue: Path? = null,
validator: SettingValidator<Path>? = null,
onValueUpdate: (Path) -> Unit = {}
) : UIComponent<Path>(
ideContext,
context,
labelText,
validator,
onValueUpdate
@@ -1,19 +1,18 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.ui.components.JBTextField
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.textField
class TextFieldComponent(
ideContext: IdeContext,
context: Context,
labelText: String? = null,
initialValue: String? = null,
validator: SettingValidator<String>? = null,
onValueUpdate: (String) -> Unit = {}
) : UIComponent<String>(
ideContext,
context,
labelText,
validator,
onValueUpdate
@@ -6,11 +6,13 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components
import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.isSpecificError
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label
@@ -21,11 +23,11 @@ import java.awt.BorderLayout
import javax.swing.JComponent
abstract class UIComponent<V : Any>(
ideContext: IdeContext,
context: Context,
labelText: String? = null,
private val validator: SettingValidator<V>? = null,
private val onValueUpdate: (V) -> Unit = {}
) : DynamicComponent(ideContext), ErrorAwareComponent, FocusableComponent, Disposable {
) : DynamicComponent(context), ErrorAwareComponent, FocusableComponent, Disposable {
private val validationIndicator by lazy(LazyThreadSafetyMode.NONE) {
if (validator != null)
IdeaBasedComponentValidator(this, getValidatorTarget())
@@ -4,25 +4,25 @@ import com.intellij.icons.AllIcons
import icons.GradleIcons
import icons.OpenapiIcons
import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.DropDownSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.UIComponentDelegatingSettingComponent
class BuildSystemTypeSettingComponent(
ideContext: IdeContext
context: Context
) : UIComponentDelegatingSettingComponent<BuildSystemType, DropDownSettingType<BuildSystemType>>(
BuildSystemPlugin::type.reference,
ideContext
context
) {
override val uiComponent: DropDownComponent<BuildSystemType> = DropDownComponent(
ideContext,
context,
setting.type.values,
labelText = "Build System",
filter = { value -> read { setting.type.filter(this, reference, value) } },
@@ -2,14 +2,12 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
import TemplateTag
import com.intellij.util.ui.JBUI
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.applyProjectTemplate
import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import java.awt.BorderLayout
@@ -18,9 +16,9 @@ import javax.swing.BoxLayout
import javax.swing.JComponent
import java.awt.Component as AwtComponent
class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.ideContext) {
private val buildSystemSubStep = BuildSystemSubStep(wizard.ideContext).asSubComponent()
private val templatesSubStep = TemplatesSubStep(wizard.ideContext).asSubComponent()
class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.context) {
private val buildSystemSubStep = BuildSystemSubStep(wizard.context).asSubComponent()
private val templatesSubStep = TemplatesSubStep(wizard.context).asSubComponent()
override val component: JComponent = panel {
add(templatesSubStep.component, BorderLayout.CENTER)
@@ -28,17 +26,17 @@ class FirstWizardStepComponent(wizard: IdeWizard) : WizardStepComponent(wizard.i
}
}
class BuildSystemSubStep(ideContext: IdeContext) : SubStep(ideContext) {
private val buildSystemSetting = BuildSystemTypeSettingComponent(ideContext).asSubComponent()
class BuildSystemSubStep(context: Context) : SubStep(context) {
private val buildSystemSetting = BuildSystemTypeSettingComponent(context).asSubComponent()
override fun buildContent(): JComponent = panel {
add(buildSystemSetting.component, BorderLayout.CENTER)
}
}
class TemplatesSubStep(ideContext: IdeContext) : SubStep(ideContext) {
class TemplatesSubStep(context: Context) : SubStep(context) {
private val projectTemplateSettingComponent =
ProjectTemplateSettingComponent(ideContext) { projectTemplate ->
ProjectTemplateSettingComponent(context) { projectTemplate ->
templateDescriptionComponent.setTemplate(projectTemplate)
}.asSubComponent()
@@ -61,21 +59,6 @@ class TemplatesSubStep(ideContext: IdeContext) : SubStep(ideContext) {
}
}
private fun allModules(): List<Module> {
val modules = mutableListOf<Module>()
fun addModule(module: Module) {
modules += module
module.subModules.forEach(::addModule)
}
read {
KotlinPlugin::modules.reference.notRequiredSettingValue
}?.forEach(::addModule)
return modules
}
override fun onValueUpdated(reference: SettingReference<*, *>?) {
super.onValueUpdated(reference)
if (reference == ProjectTemplatesPlugin::template.reference) {
@@ -1,10 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.firstStep
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.DropDownSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates.ProjectTemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ValidationIndicator
@@ -13,11 +13,11 @@ import javax.swing.BorderFactory
import javax.swing.JComponent
class ProjectTemplateSettingComponent(
ideContext: IdeContext,
context: Context,
private val onSelected: (ProjectTemplate) -> Unit
) : SettingComponent<ProjectTemplate, DropDownSettingType<ProjectTemplate>>(
ProjectTemplatesPlugin::template.reference,
ideContext
context
) {
override val validationIndicator: ValidationIndicator? get() = null
@@ -2,6 +2,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import com.intellij.ui.components.JBTabbedPane
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.getConfiguratorSettings
@@ -10,8 +11,6 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module.Companion.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.TextFieldComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
@@ -20,21 +19,19 @@ import java.awt.BorderLayout
import javax.swing.JComponent
class ModuleSettingsComponent(
ideContext: IdeContext,
context: Context,
uiEditorUsagesStats: UiEditorUsageStats
) : DynamicComponent(ideContext) {
private val validateModuleName = run {
val entityName = KotlinNewProjectWizardBundle.message("editor.entity.module.name")
StringValidators.shouldNotBeBlank(entityName) and
StringValidators.shouldBeValidIdentifier(entityName, ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)
}
) : DynamicComponent(context) {
private val validateModuleName =
StringValidators.shouldNotBeBlank("Module name") and
StringValidators.shouldBeValidIdentifier("Module Name", ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)
private val moduleConfiguratorSettingsList = SettingsList(emptyList(), ideContext).asSubComponent()
private val templateComponent = TemplatesComponent(ideContext, uiEditorUsagesStats).asSubComponent()
private val moduleConfiguratorSettingsList = SettingsList(emptyList(), context).asSubComponent()
private val templateComponent = TemplatesComponent(context, uiEditorUsagesStats).asSubComponent()
private val tabPanel = JBTabbedPane().apply {
add(KotlinNewProjectWizardBundle.message("editor.tab.template"), templateComponent.component)
add(KotlinNewProjectWizardBundle.message("editor.tab.module.settings"), moduleConfiguratorSettingsList.component)
add("Template", templateComponent.component)
add("Module Settings", moduleConfiguratorSettingsList.component)
}
fun selectSettingWithError(error: ValidationResult.ValidationError) {
@@ -45,11 +42,11 @@ class ModuleSettingsComponent(
}
private val nameField = TextFieldComponent(
ideContext,
labelText = KotlinNewProjectWizardBundle.message("editor.field.name"),
context,
labelText = "Name",
onValueUpdate = { value ->
module?.name = value
ideContext.eventManager.fireListeners(null)
context.write { eventManager.fireListeners(null) }
},
validator = validateModuleName
).asSubComponent()
@@ -1,12 +1,11 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeWizard
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor.ModulesEditorComponent
@@ -17,9 +16,9 @@ import javax.swing.JComponent
class SecondStepWizardComponent(
wizard: IdeWizard,
uiEditorUsagesStats: UiEditorUsageStats
) : WizardStepComponent(wizard.ideContext) {
) : WizardStepComponent(wizard.context) {
private val moduleEditorSubStep =
ModulesEditorSubStep(wizard.ideContext, uiEditorUsagesStats, ::onNodeSelected) {
ModulesEditorSubStep(wizard.context, uiEditorUsagesStats, ::onNodeSelected) {
templatesSubStep.selectSettingWithError(it)
}.asSubComponent()
private val templatesSubStep = ModuleSettingsSubStep(wizard, uiEditorUsagesStats).asSubComponent()
@@ -36,13 +35,13 @@ class SecondStepWizardComponent(
class ModulesEditorSubStep(
ideContext: IdeContext,
context: Context,
uiEditorUsagesStats: UiEditorUsageStats,
onNodeSelected: (data: DisplayableSettingItem?) -> Unit,
selectSettingWithError: (ValidationResult.ValidationError) -> Unit
) : SubStep(ideContext) {
) : SubStep(context) {
private val moduleSettingComponent = ModulesEditorComponent(
ideContext,
context,
uiEditorUsagesStats,
onNodeSelected,
selectSettingWithError
@@ -62,9 +61,9 @@ class ModulesEditorSubStep(
class ModuleSettingsSubStep(
wizard: IdeWizard,
uiEditorUsagesStats: UiEditorUsageStats
) : SubStep(wizard.ideContext) {
private val sourcesetSettingsComponent = SourcesetSettingsComponent(wizard.ideContext).asSubComponent()
private val moduleSettingsComponent = ModuleSettingsComponent(wizard.ideContext, uiEditorUsagesStats).asSubComponent()
) : SubStep(wizard.context) {
private val sourcesetSettingsComponent = SourcesetSettingsComponent(wizard.context).asSubComponent()
private val moduleSettingsComponent = ModuleSettingsComponent(wizard.context, uiEditorUsagesStats).asSubComponent()
private val nothingSelectedComponent = NothingSelectedComponent().asSubComponent()
private val panel = panel {
@@ -5,13 +5,12 @@ import com.intellij.openapi.ui.DialogWrapper
import com.intellij.ui.ColoredListCellRenderer
import com.intellij.ui.SimpleTextAttributes
import com.intellij.ui.ToolbarDecorator
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.IOSSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.awt.BorderLayout
@@ -19,8 +18,8 @@ import java.awt.Dimension
import javax.swing.JComponent
class SourcesetDependenciesSettingsComponent(
ideContext: IdeContext
) : DynamicComponent(ideContext) {
context: Context
) : DynamicComponent(context) {
private val sourcesetDependenciesList = SourcesetDependenciesList()
private val toolbarDecorator: ToolbarDecorator = ToolbarDecorator.createDecorator(sourcesetDependenciesList).apply {
@@ -71,7 +70,7 @@ class SourcesetDependenciesSettingsComponent(
private class ChooseModuleDialog(modules: List<Module>, parent: JComponent) : DialogWrapper(parent, false) {
private val list = ImmutableSingleSelectableListWithIcon(
values = modules,
emptyMessage = KotlinNewProjectWizardBundle.message("editor.no.dependencies.to.add"),
emptyMessage = "There are no dependencies to add",
renderValue = { value ->
renderModule(value)
}
@@ -80,7 +79,7 @@ private class ChooseModuleDialog(modules: List<Module>, parent: JComponent) : Di
override fun createCenterPanel() = panel {
preferredSize = Dimension(preferredSize.width, 300)
add(
label(KotlinNewProjectWizardBundle.message("editor.select.dependency.modules"))
label("Please select the modules to add as dependencies:")
.bordered(
needLineBorder = false,
needInnerEmptyBorder = false,
@@ -95,7 +94,7 @@ private class ChooseModuleDialog(modules: List<Module>, parent: JComponent) : Di
get() = list.selectedValue
init {
title = KotlinNewProjectWizardBundle.message("editor.choose.modules")
title = "Choose Modules"
init()
}
}
@@ -1,16 +1,15 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep
import com.intellij.ui.components.JBTabbedPane
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
class SourcesetSettingsComponent(ideContext: IdeContext) : DynamicComponent(ideContext) {
private val dependenciesComponent = SourcesetDependenciesSettingsComponent(ideContext).asSubComponent()
class SourcesetSettingsComponent(context: Context) : DynamicComponent(context) {
private val dependenciesComponent = SourcesetDependenciesSettingsComponent(context).asSubComponent()
override val component = JBTabbedPane().apply {
add(KotlinNewProjectWizardBundle.message("editor.dependencies"), dependenciesComponent.component)
add("Dependencies", dependenciesComponent.component)
}
var sourceset: Sourceset? = null
@@ -9,15 +9,13 @@ import com.intellij.util.ui.StatusText
import com.intellij.util.ui.UIUtil
import org.jetbrains.kotlin.idea.KotlinIcons
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.moduleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.templates.Template
import org.jetbrains.kotlin.tools.projectWizard.templates.settings
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.Component
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.ErrorAwareComponent
@@ -28,23 +26,23 @@ import javax.swing.JComponent
import javax.swing.JPanel
class TemplatesComponent(
ideContext: IdeContext,
context: Context,
uiEditorUsagesStats: UiEditorUsageStats
) : DynamicComponent(ideContext), ErrorAwareComponent {
) : DynamicComponent(context), ErrorAwareComponent {
private val chooseTemplateComponent: ChooseTemplateComponent =
ChooseTemplateComponent(ideContext) { template ->
ChooseTemplateComponent(context) { template ->
uiEditorUsagesStats.moduleTemplatesSet++
module?.template = template
switchState(template)
}.asSubComponent()
private val templateSettingsComponent = TemplateSettingsComponent(ideContext) {
private val templateSettingsComponent = TemplateSettingsComponent(context) {
if (MessagesEx.showOkCancelDialog(
component,
KotlinNewProjectWizardBundle.message("editor.remove.template.description"),
KotlinNewProjectWizardBundle.message("editor.remove.template.title"),
KotlinNewProjectWizardBundle.message("editor.remove.button.remove"),
KotlinNewProjectWizardBundle.message("editor.remove.button.cancel"),
"Do you want to remove selected template from module",
"Remove selected template",
"Remove",
"Cancel",
null
) == Messages.OK
) {
@@ -86,13 +84,13 @@ class TemplatesComponent(
}
class ChooseTemplateComponent(
ideContext: IdeContext,
context: Context,
private val onTemplateChosen: (Template) -> Unit
) : DynamicComponent(ideContext) {
) : DynamicComponent(context) {
private enum class State(val text: String) {
MODULE_SELECTED_AND_TEMPLATES_AVAILABLE(KotlinNewProjectWizardBundle.message("editor.template.can.configure.template")),
MODULE_SELECTED_AND_NO_TEMPLATES_AVAILABLE(KotlinNewProjectWizardBundle.message("editor.template.no.templates.available")),
NO_MODULE_SELECTED(KotlinNewProjectWizardBundle.message("editor.template.select.module"))
MODULE_SELECTED_AND_TEMPLATES_AVAILABLE("You can configure a template for selected module"),
MODULE_SELECTED_AND_NO_TEMPLATES_AVAILABLE("No templates available for selected module"),
NO_MODULE_SELECTED("Please select a module to configure")
}
override val component: JPanel = object : JPanel() {
@@ -138,7 +136,7 @@ class ChooseTemplateComponent(
statusText.clear()
statusText.appendText(state.text)
if (state == State.MODULE_SELECTED_AND_TEMPLATES_AVAILABLE) {
statusText.appendSecondaryText(KotlinNewProjectWizardBundle.message("editor.configure"), SimpleTextAttributes.LINK_ATTRIBUTES) {
statusText.appendSecondaryText("Configure", SimpleTextAttributes.LINK_ATTRIBUTES) {
showDialog()
}
}
@@ -148,7 +146,7 @@ class ChooseTemplateComponent(
private fun showDialog() {
val availableTemplates = availableTemplates
if (availableTemplates.isEmpty()) {
MessagesEx.error(null, KotlinNewProjectWizardBundle.message("editor.template.no.templates.available"))
MessagesEx.error(null, "No templates available for the selected module")
} else {
val dialog = TemplateListDialog(availableTemplates, component)
if (dialog.showAndGet()) {
@@ -185,7 +183,7 @@ private class TemplateListDialog(
get() = templatesList.selectedValue
init {
title = KotlinNewProjectWizardBundle.message("editor.template.choose")
title = "Choose a template to configure"
init()
if (values.isNotEmpty()) {
templateDescriptionComponent.updateSelectedTemplate(values.first())
@@ -209,7 +207,7 @@ class TemplateDescriptionComponent(
onRemoveButtonClicked: () -> Unit = {}
) : Component() {
private val removeButton = if (needRemoveButton) {
hyperlinkLabel(KotlinNewProjectWizardBundle.message("editor.template.remove"), onClick = onRemoveButtonClicked)
hyperlinkLabel("Remove template", onClick = onRemoveButtonClicked)
} else null
private val titleLabel = label("", bold = true) {
@@ -249,9 +247,9 @@ class TemplateDescriptionComponent(
}
private class TemplateSettingsComponent(
ideContext: IdeContext,
context: Context,
removeTemplate: () -> Unit
) : DynamicComponent(ideContext), ErrorAwareComponent {
) : DynamicComponent(context), ErrorAwareComponent {
private val templateDescriptionComponent = TemplateDescriptionComponent(
needRemoveButton = true,
nonDefaultBackgroundColor = UIUtil.getEditorPaneBackground(),
@@ -260,7 +258,7 @@ private class TemplateSettingsComponent(
component.bordered(needTopEmptyBorder = false, needBottomEmptyBorder = false)
}
private val settings = SettingsList(emptyList(), ideContext).apply {
private val settings = SettingsList(emptyList(), context).apply {
component.bordered()
}
@@ -7,15 +7,11 @@ import com.intellij.openapi.ui.popup.util.BaseListPopupStep
import com.intellij.ui.popup.PopupFactoryImpl
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.fullText
import org.jetbrains.kotlin.tools.projectWizard.wizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.asHtml
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.htmlText
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.icon
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import javax.swing.Icon
class CreateModuleOrTargetPopup private constructor(
@@ -40,7 +36,7 @@ class CreateModuleOrTargetPopup private constructor(
}
private inner class ChooseModuleOrMppModuleStep : BaseListPopupStep<ModuleConfigurator>(
KotlinNewProjectWizardBundle.message("step.module.type"),
"Module Type",
buildList {
if (allowMultiplatform) +MppModuleConfigurator
+JvmSinglePlatformModuleConfigurator
@@ -66,7 +62,7 @@ class CreateModuleOrTargetPopup private constructor(
targetConfiguratorGroup: TargetConfiguratorGroupWithSubItems,
showTitle: Boolean
) : BaseListPopupStep<DisplayableSettingItem>(
KotlinNewProjectWizardBundle.message("step.target").takeIf { showTitle },
"Target".takeIf { showTitle },
targetConfiguratorGroup.subItems.filter { it.needToShow() }
) {
override fun getIconFor(value: DisplayableSettingItem): Icon? = when (value) {
@@ -2,14 +2,14 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEdi
import com.intellij.ui.JBColor
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ListSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ListSettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.AlwaysShownValidationIndicator
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting.SettingComponent
@@ -19,11 +19,11 @@ import javax.swing.JComponent
class ModulesEditorComponent(
ideContext: IdeContext,
context: Context,
uiEditorUsagesStats: UiEditorUsageStats,
oneEntrySelected: (data: DisplayableSettingItem?) -> Unit,
selectSettingWithError: (ValidationResult.ValidationError) -> Unit
) : SettingComponent<List<Module>, ListSettingType<Module>>(KotlinPlugin::modules.reference, ideContext) {
) : SettingComponent<List<Module>, ListSettingType<Module>>(KotlinPlugin::modules.reference, context) {
private val tree: ModulesEditorTree =
ModulesEditorTree(
onSelected = { oneEntrySelected(it) },
@@ -41,7 +41,7 @@ class ModulesEditorComponent(
}
)
private val model = TargetsModel(tree, ::value, ideContext, uiEditorUsagesStats)
private val model = TargetsModel(tree, ::value, context, uiEditorUsagesStats)
override fun onInit() {
super.onInit()
@@ -4,9 +4,14 @@ import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.ActionToolbarPosition
import com.intellij.openapi.ui.Messages
import com.intellij.ui.ToolbarDecorator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.IOSSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsSingleplatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.MppModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.createPanelWithPopupHandler
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import javax.swing.JComponent
@@ -1,7 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.TargetConfigurator
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
class NewModuleCreator {
@@ -1,10 +1,9 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.secondStep.modulesEditor
import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.TreePath
@@ -13,7 +12,7 @@ import kotlin.reflect.KMutableProperty0
class TargetsModel(
private val tree: ModulesEditorTree,
private val value: KMutableProperty0<List<Module>?>,
private val ideContext: IdeContext,
private val context: Context,
private val uiEditorUsagesStats: UiEditorUsageStats
) {
private val root get() = tree.model.root as DefaultMutableTreeNode
@@ -66,7 +65,7 @@ class TargetsModel(
fun add(module: Module) {
uiEditorUsagesStats.modulesCreated++
addToTheTree(module, modifyValue = true, parent = tree.selectedNode ?: root)
with(ideContext) {
context.writeSettings {
module.apply { initDefaultValuesForSettings() }
}
}
@@ -1,12 +1,15 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import com.intellij.openapi.ui.ComboBox
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.*
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.CheckboxComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.DropDownComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.PathFieldComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.TextFieldComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.label
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.panel
import java.awt.BorderLayout
@@ -20,32 +23,32 @@ object DefaultSettingComponent {
@Suppress("UNCHECKED_CAST")
fun <V : Any, T : SettingType<V>> create(
setting: SettingReference<V, T>,
ideContext: IdeContext
context: Context
): SettingComponent<V, T> = when (setting.type) {
VersionSettingType::class ->
VersionSettingComponent(
setting as SettingReference<Version, VersionSettingType>,
ideContext
context
) as SettingComponent<V, T>
BooleanSettingType::class ->
BooleanSettingComponent(
setting as SettingReference<Boolean, BooleanSettingType>,
ideContext
context
) as SettingComponent<V, T>
DropDownSettingType::class ->
DropdownSettingComponent(
setting as SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>,
ideContext
context
) as SettingComponent<V, T>
StringSettingType::class ->
StringSettingComponent(
setting as SettingReference<String, StringSettingType>,
ideContext
context
) as SettingComponent<V, T>
PathSettingType::class ->
PathSettingComponent(
setting as SettingReference<Path, PathSettingType>,
ideContext
context
) as SettingComponent<V, T>
else -> TODO(setting.type.qualifiedName!!)
}
@@ -53,8 +56,8 @@ object DefaultSettingComponent {
class VersionSettingComponent(
reference: SettingReference<Version, VersionSettingType>,
ideContext: IdeContext
) : SettingComponent<Version, VersionSettingType>(reference, ideContext) {
context: Context
) : SettingComponent<Version, VersionSettingType>(reference, context) {
private val settingLabel = label(setting.title)
private val comboBox = ComboBox<Version>().apply {
addItemListener { e ->
@@ -91,17 +94,17 @@ class VersionSettingComponent(
class DropdownSettingComponent(
reference: SettingReference<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>,
ideContext: IdeContext
context: Context
) : UIComponentDelegatingSettingComponent<DisplayableSettingItem, DropDownSettingType<DisplayableSettingItem>>(
reference,
ideContext
context
) {
override val uiComponent = DropDownComponent(
ideContext = ideContext,
context = context,
initialValues = setting.type.values,
validator = setting.validator,
filter = { value ->
setting.type.filter(ideContext, reference, value)
context.read { setting.type.filter(this, reference, value) }
},
labelText = setting.title,
onValueUpdate = { newValue -> value = newValue }
@@ -110,13 +113,13 @@ class DropdownSettingComponent(
class BooleanSettingComponent(
reference: SettingReference<Boolean, BooleanSettingType>,
ideContext: IdeContext
context: Context
) : UIComponentDelegatingSettingComponent<Boolean, BooleanSettingType>(
reference,
ideContext
context
) {
override val uiComponent = CheckboxComponent(
ideContext = ideContext,
context = context,
labelText = setting.title,
initialValue = null,
validator = setting.validator,
@@ -126,14 +129,14 @@ class BooleanSettingComponent(
class StringSettingComponent(
reference: SettingReference<String, StringSettingType>,
ideContext: IdeContext,
context: Context,
showLabel: Boolean = true
) : UIComponentDelegatingSettingComponent<String, StringSettingType>(
reference,
ideContext
context
) {
override val uiComponent = TextFieldComponent(
ideContext = ideContext,
context = context,
initialValue = null,
labelText = if (showLabel) setting.title else null,
validator = setting.validator,
@@ -143,13 +146,13 @@ class StringSettingComponent(
class PathSettingComponent(
reference: SettingReference<Path, PathSettingType>,
ideContext: IdeContext
context: Context
) : UIComponentDelegatingSettingComponent<Path, PathSettingType>(
reference,
ideContext
context
) {
override val uiComponent = PathFieldComponent(
ideContext = ideContext,
context = context,
labelText = setting.title,
validator = settingValidator { path -> setting.validator.validate(this, path) },
onValueUpdate = { newValue -> value = newValue }
@@ -1,17 +1,17 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.Setting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.Displayable
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent
abstract class SettingComponent<V : Any, T : SettingType<V>>(
val reference: SettingReference<V, T>,
ideContext: IdeContext
) : DynamicComponent(ideContext), Displayable, FocusableComponent {
context: Context
) : DynamicComponent(context), Displayable, FocusableComponent {
var value: V?
get() = reference.value
set(value) {
@@ -1,10 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import com.intellij.ui.components.panels.VerticalLayout
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.isSpecificError
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.DynamicComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.FocusableComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.PanelWithStatusText
@@ -16,8 +16,8 @@ interface ErrorAwareComponent {
class SettingsList(
settings: List<SettingReference<*, *>>,
private val ideContext: IdeContext
) : DynamicComponent(ideContext), ErrorAwareComponent {
private val context: Context
) : DynamicComponent(context), ErrorAwareComponent {
private val panel = PanelWithStatusText(VerticalLayout(5), "This module has no settings to configure")
var settingComponents: List<SettingComponent<*, *>> = emptyList()
@@ -38,7 +38,7 @@ class SettingsList(
panel.isStatusTextVisible = settings.isEmpty()
panel.removeAll()
settingComponents = settings.map { setting ->
DefaultSettingComponent.create(setting, ideContext)
DefaultSettingComponent.create(setting, context)
}
settingComponents.forEach { setting -> setting.onInit(); panel.add(setting.component) }
}
@@ -5,17 +5,17 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard.ui.setting
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.wizard.IdeContext
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.UIComponent
import org.jetbrains.kotlin.tools.projectWizard.wizard.ui.components.valueForSetting
import javax.swing.JComponent
abstract class UIComponentDelegatingSettingComponent<V : Any, T : SettingType<V>>(
reference: SettingReference<V, T>,
ideContext: IdeContext
) : SettingComponent<V, T>(reference, ideContext) {
context: Context
) : SettingComponent<V, T>(reference, context) {
abstract val uiComponent: UIComponent<V>
// As there is one in UIComponent
@@ -11,7 +11,10 @@ import com.intellij.openapi.projectRoots.SimpleJavaSdkType
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.PlatformTestCase
import org.jetbrains.kotlin.test.testFramework.runWriteAction
import org.jetbrains.kotlin.tools.projectWizard.cli.*
import org.jetbrains.kotlin.tools.projectWizard.cli.BuildSystem
import org.jetbrains.kotlin.tools.projectWizard.cli.TestWizardService
import org.jetbrains.kotlin.tools.projectWizard.cli.assertSuccess
import org.jetbrains.kotlin.tools.projectWizard.cli.isGradle
import org.jetbrains.kotlin.tools.projectWizard.core.service.Services
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
@@ -7,8 +7,6 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard
import org.jetbrains.kotlin.tools.projectWizard.cli.BuildSystem
import org.jetbrains.kotlin.tools.projectWizard.cli.ProjectTemplateBasedTestWizard
import org.jetbrains.kotlin.tools.projectWizard.cli.readSettingsYaml
import org.jetbrains.kotlin.tools.projectWizard.plugins.Plugins
import java.nio.file.Path
abstract class AbstractProjectTemplateNewWizardProjectImportTest : AbstractNewWizardProjectImportTest() {
@@ -7,9 +7,7 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard.services
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.cli.TestWizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderServiceImpl
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
class KotlinVersionProviderTestWizardService : KotlinVersionProviderService, TestWizardService {
@@ -1,10 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard
import org.jetbrains.kotlin.tools.projectWizard.wizard.core.YamlParsingError
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.wizard.core.YamlParsingError
import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.parser.ParserException
import java.nio.file.Path
@@ -2,8 +2,6 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard
import org.jetbrains.kotlin.tools.projectWizard.YamlSettingsParser
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
@@ -24,16 +22,15 @@ class YamlWizard(
servicesManager: ServicesManager = CLI_SERVICES_MANAGER,
isUnitTestMode: Boolean
) : Wizard(createPlugins, servicesManager, isUnitTestMode) {
private val settingsWritingContext = SettingsWritingContext(context, servicesManager, isUnitTestMode)
override fun apply(
services: List<WizardService>,
phases: Set<GenerationPhase>,
onTaskExecuting: (PipelineTask) -> Unit
): TaskResult<Unit> = computeM {
val (settingsValuesFromYaml) = valuesReadingContext.parseYaml(yaml, pluginSettings)
val (settingsValuesFromYaml) = context.read { parseYaml(yaml, pluginSettings) }
with(settingsWritingContext) {
context.writeSettings {
settingsValuesFromYaml.forEach { (reference, value) -> reference.setValue(value) }
StructurePlugin::projectPath.reference.setValue(projectPath)
}
@@ -6,11 +6,11 @@
package org.jetbrains.kotlin.tools.projectWizard.cli
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.compute
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
import org.jetbrains.kotlin.tools.projectWizard.core.computeM
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.core.map
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
@@ -34,31 +34,29 @@ class ProjectTemplateBasedTestWizard(
servicesManager,
isUnitTestMode = true
) {
private val settingsWritingContext = SettingsWritingContext(context, servicesManager, isUnitTestMode = true)
override fun apply(
services: List<WizardService>,
phases: Set<GenerationPhase>,
onTaskExecuting: (PipelineTask) -> Unit
): TaskResult<Unit> =
computeM {
super.apply(services, setOf(GenerationPhase.PREPARE), onTaskExecuting).ensure()
with(settingsWritingContext) {
applyProjectTemplate(projectTemplate)
BuildSystemPlugin::type.reference.setValue(buildSystem.buildSystemType)
StructurePlugin::projectPath.reference.setValue(projectDirectory)
StructurePlugin::name.reference.setValue(projectTemplate.id)
StructurePlugin::groupId.reference.setValue(GROUP_ID)
StructurePlugin::artifactId.reference.setValue(ARTIFACT_ID)
applyAdditionalSettingsFromYaml().ensure()
}
super.apply(services, phases, onTaskExecuting)
): TaskResult<Unit> = computeM {
super.apply(services, setOf(GenerationPhase.PREPARE), onTaskExecuting).ensure()
context.writeSettings {
applyProjectTemplate(projectTemplate)
BuildSystemPlugin::type.reference.setValue(buildSystem.buildSystemType)
StructurePlugin::projectPath.reference.setValue(projectDirectory)
StructurePlugin::name.reference.setValue(projectTemplate.id)
StructurePlugin::groupId.reference.setValue(GROUP_ID)
StructurePlugin::artifactId.reference.setValue(ARTIFACT_ID)
}
applyAdditionalSettingsFromYaml().ensure()
private fun SettingsWritingContext.applyAdditionalSettingsFromYaml() = compute {
if (additionalYamlSettings != null) {
val (additionalSettings) = parseYaml(additionalYamlSettings, pluginSettings)
super.apply(services, phases, onTaskExecuting)
}
private fun applyAdditionalSettingsFromYaml() = context.writeSettings {
if (additionalYamlSettings == null) return@writeSettings UNIT_SUCCESS
parseYaml(additionalYamlSettings, pluginSettings).map { additionalSettings ->
additionalSettings.forEach { (reference, value) -> reference.setValue(value) }
}
}
@@ -1,7 +1,5 @@
package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
typealias Checker = ReadingContext.() -> Boolean
val ALWAYS_AVAILABLE_CHECKER = checker { true }
@@ -1,14 +1,95 @@
package org.jetbrains.kotlin.tools.projectWizard.core
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.AnySetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KClass
import kotlin.reflect.KProperty1
import kotlin.reflect.full.isSubclassOf
import kotlin.reflect.full.memberProperties
class Context(private val pluginsCreator: PluginsCreator, val eventManager: EventManager) {
class Context private constructor(
private val servicesManager: ServicesManager,
private val isUnitTestMode: Boolean,
private val settingContext: SettingContext,
private val propertyContext: PropertyContext,
private val taskContext: TaskContext
) {
private lateinit var plugins: List<Plugin>
private val settingWritingContext = SettingsWritingContext()
private val pluginSettings by lazy(LazyThreadSafetyMode.NONE) {
plugins.flatMap(Plugin::declaredSettings).distinctBy(PluginSetting<*, *>::path)
}
fun <T> read(reader: ReadingContext.() -> T): T =
settingWritingContext.reader()
fun <T> write(writer: WritingContext.() -> T): T =
settingWritingContext.writer()
fun <T> writeSettings(writer: SettingsWritingContext.() -> T): T =
settingWritingContext.writer()
constructor(
pluginsCreator: PluginsCreator,
servicesManager: ServicesManager,
isUnitTestMode: Boolean
) : this(
servicesManager,
isUnitTestMode,
SettingContext(),
PropertyContext(),
TaskContext()
) {
plugins = pluginsCreator(this).onEach(::initPlugin)
}
fun withAdditionalServices(services: List<WizardService>) =
Context(
servicesManager.withAdditionalServices(services),
isUnitTestMode,
settingContext,
propertyContext,
taskContext
).also {
it.plugins = plugins
}
fun <V : Any, T : SettingType<V>> pluginSettingDelegate(
create: (path: String) -> SettingBuilder<V, T>
): ReadOnlyProperty<Any, PluginSetting<V, T>> =
settingContext.settingDelegate(create)
fun <T : Any> propertyDelegate(
init: Property.Builder<T>.() -> Unit,
defaultValue: T
) = entityDelegate(propertyContext) { name ->
Property.Builder(name, defaultValue).apply(init).build()
}
fun pipelineTaskDelegate(
phase: GenerationPhase,
init: PipelineTask.Builder.() -> Unit
) = entityDelegate(taskContext) { name ->
PipelineTask.Builder(name, phase).apply(init).build()
}
fun <A, B : Any> task1Delegate(
init: Task1.Builder<A, B>.() -> Unit
) = entityDelegate(taskContext) { name ->
Task1.Builder<A, B>(name).apply(init).build()
}
private fun initPlugin(plugin: Plugin) {
for (entityReference in plugin::class.memberProperties) {
val type = entityReference.returnType.classifier.safeAs<KClass<*>>() ?: continue
@@ -23,32 +104,13 @@ class Context(private val pluginsCreator: PluginsCreator, val eventManager: Even
}
}
val settingContext =
SettingContext(eventManager::fireListeners)
val propertyContext = PropertyContext()
val taskContext = TaskContext()
val plugins = pluginsCreator(this).onEach(::initPlugin)
@Suppress("UNUSED_PARAMETER")
fun getUnspecifiedSettings(phases: Set<GenerationPhase>): List<AnySetting> {
val required = plugins
.flatMap { plugin ->
plugin.declaredSettings.mapNotNull { setting ->
if (setting.neededAtPhase !in phases) return@mapNotNull null
if (setting.isRequired) setting else null
}
}.toSet()
val provided = settingContext.allPluginSettings.map { it.path }.toSet()
return required.filterNot { it.path in provided }
}
private val pipelineLineTasks: List<PipelineTask>
get() = plugins
.flatMap { it.declaredTasks.filterIsInstance<PipelineTask>() }
private fun task(reference: PipelineTaskReference) =
taskContext.getEntity(reference) as? PipelineTask
?: error(reference.path)
taskContext.getEntity(reference) as? PipelineTask ?: error(reference.path)
private val dependencyList: Map<PipelineTask, List<PipelineTask>>
get() {
@@ -67,8 +129,123 @@ class Context(private val pluginsCreator: PluginsCreator, val eventManager: Even
}
}
fun copy() = Context(pluginsCreator, eventManager)
fun sortTasks(): TaskResult<List<PipelineTask>> =
TaskSorter().sort(pipelineLineTasks, dependencyList)
open inner class ReadingContext {
val plugins: List<Plugin>
get() = this@Context.plugins
val pluginSettings: List<PluginSetting<*, *>>
get() = this@Context.pluginSettings
val isUnitTestMode: Boolean
get() = this@Context.isUnitTestMode
inline fun <reified S : WizardService> service(noinline filter: (S) -> Boolean = { true }): S =
serviceByClass(S::class, filter)
fun <S : WizardService> serviceByClass(klass: KClass<S>, filter: (S) -> Boolean = { true }): S =
servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found")
@Suppress("UNCHECKED_CAST")
val <T : Any> PropertyReference<T>.propertyValue: T
get() = propertyContext[this] as T
val <V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue: V
get() = settingContext[this] ?: error("No value is present for setting `$this`")
inline val <reified V : Any> KProperty1<out Plugin, PluginSetting<V, SettingType<V>>>.settingValue: V
get() = reference.settingValue
inline fun <reified V : Any> KProperty1<out Plugin, PluginSetting<V, SettingType<V>>>.settingValue(): V =
this.reference.settingValue
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue(): V =
settingContext[this] ?: error("No value is present for setting `$this`")
val <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue: V?
get() = settingContext[this]
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue(): V? =
settingContext[this]
val <V : Any, T : SettingType<V>> PluginSettingReference<V, T>.pluginSetting: Setting<V, T>
get() = settingContext.getPluginSetting(this)
private fun <V : Any> Setting<V, SettingType<V>>.getSavedValueForSetting(): V? {
if (!isSavable || this !is PluginSetting<*, *>) return null
val serializer = type.serializer.safeAs<SettingSerializer.Serializer<V>>() ?: return null
val savedValue = service<SettingSavingWizardService>().getSettingValue(path) ?: return null
return serializer.fromString(savedValue)
}
val <V : Any> SettingReference<V, SettingType<V>>.savedOrDefaultValue: V?
get() = setting.getSavedValueForSetting() ?: when (val defaultValue = setting.defaultValue) {
is SettingDefaultValue.Value -> defaultValue.value
is SettingDefaultValue.Dynamic<V> -> defaultValue.getter(this@ReadingContext, this)
null -> null
}
val <V : Any, T : SettingType<V>> SettingReference<V, T>.setting: Setting<V, T>
get() = with(this) { getSetting() }
}
open inner class WritingContext : ReadingContext() {
val eventManager: EventManager
get() = settingContext.eventManager
fun <A, B : Any> Task1Reference<A, B>.execute(value: A): TaskResult<B> {
@Suppress("UNCHECKED_CAST")
val task = taskContext.getEntity(this) as Task1<A, B>
return task.action(this@WritingContext, value)
}
fun <T : Any> PropertyReference<T>.update(
updater: suspend ComputeContext<*>.(T) -> TaskResult<T>
): TaskResult<Unit> = compute {
val (newValue) = updater(propertyValue)
propertyContext[this@update] = newValue
}
fun <T : Any> PropertyReference<List<T>>.addValues(
vararg values: T
): TaskResult<Unit> = update { oldValues -> success(oldValues + values) }
fun <T : Any> PropertyReference<List<T>>.addValues(
values: List<T>
): TaskResult<Unit> = update { oldValues -> success(oldValues + values) }
}
open inner class SettingsWritingContext : WritingContext() {
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setValue(newValue: V) {
settingContext[this] = newValue
}
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setSettingValueToItsDefaultIfItIsNotSetValue() {
val defaultValue = savedOrDefaultValue ?: return
if (notRequiredSettingValue == null) {
setValue(defaultValue)
}
}
}
}
fun ReadingContext.getUnspecifiedSettings(phases: Set<GenerationPhase>): List<AnySetting> {
val required = plugins
.flatMap { plugin ->
plugin.declaredSettings.mapNotNull { setting ->
if (setting.neededAtPhase !in phases) return@mapNotNull null
if (setting.isRequired) setting else null
}
}.toSet()
val provided = pluginSettings.map(PluginSetting<*, *>::path).toSet()
return required.filterNot { it.path in provided }
}
typealias ReadingContext = Context.ReadingContext
typealias WritingContext = Context.WritingContext
typealias SettingsWritingContext = Context.SettingsWritingContext
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.nio.file.Path
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
import kotlin.reflect.full.isSubclassOf
import kotlin.reflect.full.memberProperties
@@ -28,17 +27,7 @@ abstract class Plugin(override val context: Context) : EntityBase(),
override fun <V : Any, T : SettingType<V>> settingDelegate(
create: (path: String) -> SettingBuilder<V, T>
): ReadOnlyProperty<Any, PluginSetting<V, T>> = object : ReadOnlyProperty<Any, PluginSetting<V, T>> {
override fun getValue(thisRef: Any, property: KProperty<*>): PluginSetting<V, T> {
@Suppress("UNCHECKED_CAST")
val reference = property as PluginSettingPropertyReference<V, T>
context.settingContext.getPluginSetting(reference)?.let { return it }
val setting =
PluginSetting(create(reference.path).buildInternal())
context.settingContext.setPluginSetting(reference, setting)
return setting
}
}
): ReadOnlyProperty<Any, PluginSetting<V, T>> = context.pluginSettingDelegate(create)
val reference = this::class
override val path = reference.path
@@ -47,7 +36,6 @@ abstract class Plugin(override val context: Context) : EntityBase(),
val declaredSettings get() = entitiesOfType<PluginSetting<*, *>>().toSet()
val declaredTasks get() = entitiesOfType<Task>()
private inline fun <reified E : Entity> entitiesOfType() =
reference.memberProperties.filter { kProperty ->
kProperty.returnType.classifier.safeAs<KClass<*>>()?.isSubclassOf(E::class) == true
@@ -56,13 +44,13 @@ abstract class Plugin(override val context: Context) : EntityBase(),
}
fun pipelineTask(phase: GenerationPhase, init: PipelineTask.Builder.() -> Unit) =
PipelineTask.delegate(context.taskContext, phase, init)
context.pipelineTaskDelegate(phase, init)
fun <A, B : Any> task1(init: Task1.Builder<A, B>.() -> Unit) =
Task1.delegate(context.taskContext, init)
context.task1Delegate(init)
fun <T : Any> property(defaultValue: T, init: Property.Builder<T>.() -> Unit = {}) =
propertyDelegate(context.propertyContext, init, defaultValue)
context.propertyDelegate(init, defaultValue)
fun <T : Any> listProperty(vararg defaultValues: T, init: Property.Builder<List<T>>.() -> Unit = {}) =
property(defaultValues.toList(), init)
@@ -168,9 +156,9 @@ abstract class Plugin(override val context: Context) : EntityBase(),
val PluginReference.withParentPlugins
get() = generateSequence(this) { klass ->
klass.supertypes.firstOrNull { supertype ->
supertype.classifier?.safeAs<KClass<Plugin>>()
?.isSubclassOf(Plugin::class) == true
}?.classifier
supertype.classifier?.safeAs<KClass<Plugin>>()
?.isSubclassOf(Plugin::class) == true
}?.classifier
?.safeAs<KClass<Plugin>>()
?.takeIf { superClass ->
superClass.simpleName != null
@@ -185,8 +173,8 @@ val PluginReference.name
val PluginReference.path
get() = withParentPlugins.mapNotNull { klass ->
klass.name.takeIf { it.isNotEmpty() }
}.toList()
klass.name.takeIf { it.isNotEmpty() }
}.toList()
.reversed()
.joinToString(".")
@@ -1,13 +1,5 @@
package org.jetbrains.kotlin.tools.projectWizard.core
import kotlin.coroutines.Continuation
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED
import kotlin.coroutines.intrinsics.createCoroutineUnintercepted
import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn
import kotlin.coroutines.resume
sealed class TaskResult<out T : Any>
data class Success<T : Any>(val value: T) : TaskResult<T>()
@@ -1,74 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.context
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService
import kotlin.reflect.KClass
import kotlin.reflect.KProperty1
open class ReadingContext(
protected val context: Context,
private val servicesManager: ServicesManager,
val isUnitTestMode: Boolean
) {
inline fun <reified S : WizardService> service(noinline filter: (S) -> Boolean = { true }): S =
serviceByClass(S::class, filter)
fun <S : WizardService> serviceByClass(klass: KClass<S>, filter: (S) -> Boolean = { true }): S =
servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found")
inline val <reified T : Any> PropertyReference<T>.propertyValue: T
get() = `access$context`.propertyContext[this] as T
inline val <reified V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue: V
get() = `access$context`.settingContext[this] ?: error("No value is present for setting `$this`")
inline val <reified V : Any> KProperty1<out Plugin, PluginSetting<V, SettingType<V>>>.settingValue: V
get() = reference.settingValue
inline fun <reified V : Any> KProperty1<out Plugin, PluginSetting<V, SettingType<V>>>.settingValue(): V =
this.reference.settingValue
inline fun <reified V : Any, T : SettingType<V>> SettingReference<V, T>.settingValue(): V =
`access$context`.settingContext[this] ?: error("No value is present for setting `$this`")
val <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue: V?
get() = context.settingContext[this]
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.notRequiredSettingValue(): V? =
context.settingContext[this]
val <V : Any, T : SettingType<V>> PluginSettingReference<V, T>.pluginSetting: Setting<V, T>
get() = context.settingContext.getPluginSetting(this)
private fun <V : Any> Setting<V, SettingType<V>>.getSavedValueForSetting(): V? {
if (!isSavable || this !is PluginSetting<*, *>) return null
val serializer = type.serializer.safeAs<SettingSerializer.Serializer<V>>() ?: return null
val savedValue = service<SettingSavingWizardService>().getSettingValue(path) ?: return null
return serializer.fromString(savedValue)
}
val <V : Any> SettingReference<V, SettingType<V>>.savedOrDefaultValue: V?
get() = setting.getSavedValueForSetting() ?: when (val defaultValue = setting.defaultValue) {
is SettingDefaultValue.Value -> defaultValue.value
is SettingDefaultValue.Dynamic<V> -> defaultValue.getter(this@ReadingContext, this)
null -> null
}
val <V : Any, T : SettingType<V>> SettingReference<V, T>.setting: Setting<V, T>
get() = with(this) { getSetting() }
@PublishedApi
internal val `access$context`: Context
get() = context
}
@@ -1,31 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.context
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
open class SettingsWritingContext(context: Context, servicesManager: ServicesManager, isUnitTestMode: Boolean) :
WritingContext(
context,
servicesManager,
isUnitTestMode
) {
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setValue(newValue: V) {
context.settingContext[this] = newValue
}
fun <V : Any, T : SettingType<V>> SettingReference<V, T>.setSettingValueToItsDefaultIfItIsNotSetValue() {
val defaultValue = savedOrDefaultValue ?: return
if (notRequiredSettingValue == null) {
setValue(defaultValue)
}
}
}
@@ -1,39 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.tools.projectWizard.core.context
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.PropertyReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task1Reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
open class WritingContext(
context: Context,
servicesManager: ServicesManager,
isUnitTestMode: Boolean
) : ReadingContext(context, servicesManager, isUnitTestMode) {
fun <A, B : Any> Task1Reference<A, B>.execute(value: A): TaskResult<B> {
@Suppress("UNCHECKED_CAST")
val task = context.taskContext.getEntity(this) as Task1<A, B>
return task.action(this@WritingContext, value)
}
inline fun <reified T : Any> PropertyReference<T>.update(
crossinline updater: suspend ComputeContext<*>.(T) -> TaskResult<T>
): TaskResult<Unit> = compute {
val (newValue) = updater(propertyValue)
`access$context`.propertyContext[this@update] = newValue
}
fun <T : Any> PropertyReference<List<T>>.addValues(
vararg values: T
): TaskResult<Unit> = update { oldValues -> success(oldValues + values) }
fun <T : Any> PropertyReference<List<T>>.addValues(
values: List<T>
): TaskResult<Unit> = update { oldValues -> success(oldValues + values) }
}
@@ -1,7 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.PluginReference
import org.jetbrains.kotlin.tools.projectWizard.core.path
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
@@ -1,7 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.PluginReference
import kotlin.reflect.KProperty1
typealias PropertyReference<T> = KProperty1<out Plugin, Property<T>>
@@ -20,12 +19,3 @@ data class Property<out T : Any>(
fun build(): Property<T> = Property(name, defaultValue)
}
}
fun <T : Any> propertyDelegate(
context: PropertyContext,
init: Property.Builder<T>.() -> Unit,
defaultValue: T
) = entityDelegate(context) { name ->
Property.Builder(name, defaultValue).apply(init).build()
}
@@ -1,9 +1,10 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.Failure
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS
import org.jetbrains.kotlin.tools.projectWizard.core.ValidationError
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
inline class SettingValidator<V>(val validate: ReadingContext.(V) -> ValidationResult) {
infix fun and(other: SettingValidator<V>) = SettingValidator<V> { value ->
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import kotlin.reflect.KProperty1
@@ -26,15 +26,6 @@ data class Task1<A, B : Any>(
fun build(): Task1<A, B> = Task1(name, action)
}
companion object {
fun <A, B : Any> delegate(
context: EntityContext<Task, TaskReference>,
init: Builder<A, B>.() -> Unit
) = entityDelegate(context) { name ->
Builder<A, B>(name).apply(init).build()
}
}
}
data class PipelineTask(
@@ -72,14 +63,4 @@ data class PipelineTask(
fun build(): PipelineTask = PipelineTask(name, action, before, after, phase, isAvailable, title)
}
companion object {
fun delegate(
context: EntityContext<Task, TaskReference>,
phase: GenerationPhase,
init: Builder.() -> Unit
) = entityDelegate(context) { name ->
Builder(name, phase).apply(init).build()
}
}
}
@@ -7,7 +7,8 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.core.ActivityCheckerOwner
import org.jetbrains.kotlin.tools.projectWizard.core.Checker
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.Entity
import org.jetbrains.kotlin.tools.projectWizard.core.entity.EntityWithValue
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.SettingValidator
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settingValidator
@@ -5,11 +5,15 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.core.EventManager
import org.jetbrains.kotlin.tools.projectWizard.core.entity.path
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class SettingContext(val onUpdated: (SettingReference<*, *>) -> Unit) {
class SettingContext {
private val values = mutableMapOf<String, Any>()
private val pluginSettings = mutableMapOf<String, PluginSetting<*, *>>()
val eventManager = EventManager()
@Suppress("UNCHECKED_CAST")
operator fun <V : Any, T : SettingType<V>> get(
@@ -21,30 +25,34 @@ class SettingContext(val onUpdated: (SettingReference<*, *>) -> Unit) {
newValue: V
) {
values[reference.path] = newValue
onUpdated(reference)
eventManager.fireListeners(reference)
}
val allPluginSettings: Collection<PluginSetting<*, *>>
get() = pluginSettings.values
@Suppress("UNCHECKED_CAST")
fun <V : Any, T : SettingType<V>> getPluginSetting(pluginSettingReference: PluginSettingReference<V, T>) =
pluginSettings[pluginSettingReference.path] as PluginSetting<V, T>
@Suppress("UNCHECKED_CAST")
fun <V : Any, T : SettingType<V>> getPluginSetting(pluginSettingReference: PluginSettingPropertyReference<V, T>) =
private fun <V : Any, T : SettingType<V>> getPluginSetting(pluginSettingReference: PluginSettingPropertyReference<V, T>) =
pluginSettings[pluginSettingReference.path] as? PluginSetting<V, T>
@Suppress("UNCHECKED_CAST")
fun <V : Any, T : SettingType<V>> setPluginSetting(
private fun <V : Any, T : SettingType<V>> setPluginSetting(
pluginSettingReference: PluginSettingPropertyReference<V, T>,
setting: PluginSetting<V, T>
) {
pluginSettings[pluginSettingReference.path] = setting
}
@Suppress("UNCHECKED_CAST")
fun <V : Any, T : SettingType<V>> pluginSettingValue(setting: PluginSetting<V, T>): V? =
values[setting.path] as? V
fun <V : Any, T : SettingType<V>> settingDelegate(
create: (path: String) -> SettingBuilder<V, T>
): ReadOnlyProperty<Any, PluginSetting<V, T>> = object : ReadOnlyProperty<Any, PluginSetting<V, T>> {
override fun getValue(thisRef: Any, property: KProperty<*>): PluginSetting<V, T> {
@Suppress("UNCHECKED_CAST")
val reference = property as PluginSettingPropertyReference<V, T>
getPluginSetting(reference)?.let { return it }
val setting = PluginSetting(create(reference.path).buildInternal())
setPluginSetting(reference, setting)
return setting
}
}
}
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.path
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.ModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
interface BuildSystemAvailabilityWizardService : WizardService {
@@ -6,7 +6,8 @@
package org.jetbrains.kotlin.tools.projectWizard.core.service
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
interface RunConfigurationsService : WizardService {
fun ReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>)
@@ -8,13 +8,16 @@ package org.jetbrains.kotlin.tools.projectWizard.core.service
import kotlin.reflect.KClass
import kotlin.reflect.full.isSubclassOf
class ServicesManager(private val services: List<WizardService>, private val serviceSelector: (List<WizardService>) -> WizardService?) {
class ServicesManager(
private val services: List<WizardService>,
private val serviceSelector: (List<WizardService>) -> WizardService?
) {
@Suppress("UNCHECKED_CAST")
fun <S : WizardService> serviceByClass(klass: KClass<S>, filter: (S) -> Boolean): S? =
services.filter { service ->
service::class.isSubclassOf(klass) && filter(service as S)
}.let(serviceSelector) as? S
fun withServices(services: List<WizardService>) =
fun withAdditionalServices(services: List<WizardService>) =
ServicesManager(this.services + services, serviceSelector)
}
@@ -4,7 +4,6 @@ import kotlinx.collections.immutable.toPersistentList
import java.io.IOException
import java.nio.file.Path
import java.nio.file.Paths
import java.util.*
import kotlin.properties.ReadOnlyProperty
import kotlin.random.Random
import kotlin.reflect.KProperty
@@ -2,7 +2,6 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
@@ -1,6 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.*
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.plus
import kotlinx.collections.immutable.toPersistentList
interface IrsOwner {
@@ -2,14 +2,11 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
import kotlinx.collections.immutable.PersistentList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
import org.jetbrains.kotlin.tools.projectWizard.templates.Template
import java.nio.file.Path
@@ -1,6 +1,9 @@
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
@@ -5,31 +5,30 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.AndroidConfigIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.AndroidPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingType
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.AndroidConfigIR
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.AndroidPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.JavaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository
import org.jetbrains.kotlin.tools.projectWizard.settings.javaPackage
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
@@ -5,15 +5,12 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.div
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplate
import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor
import java.nio.file.Path
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
@@ -1,12 +1,9 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.cached
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -16,7 +13,8 @@ import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.correspondingStdlib
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import java.nio.file.Path
import kotlin.properties.ReadOnlyProperty
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSettingReference
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
@@ -1,7 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.CreateGradleValueIR
@@ -1,7 +1,8 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.buildPersistenceList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -1,21 +1,22 @@
package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.KotlinBuildSystemPluginIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenPropertyIR
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleConfigurationData
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.maven.MavenPropertyIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle
interface JvmModuleConfigurator : ModuleConfiguratorWithTests {
companion object : ModuleConfiguratorSettings() {
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
@@ -1,15 +1,15 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult
import org.jetbrains.kotlin.tools.projectWizard.core.entity.fold
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderService
import org.jetbrains.kotlin.tools.projectWizard.core.service.KotlinVersionProviderServiceImpl
import org.jetbrains.kotlin.tools.projectWizard.core.service.kotlinVersionKind
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.RepositoryIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.withIrs
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
@@ -2,8 +2,8 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
@@ -1,9 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.printer
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BodyIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.isEmpty
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.render
class GradlePrinter(val dsl: GradleDsl, override val indent: Int = 4) : BuildFilePrinter() {
fun inBrackets(inner: () -> Unit) {
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.templates.*
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.templates.ConsoleJvmApplicationTemplate
class ConsoleJvmApplicationTemplatePlugin(context: Context) : TemplatePlugin(context) {
val addTemplate by addTemplateTask(
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.templates.*
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.templates.SimpleJsClientTemplate
class JsTemplatesPlugin(context: Context) : TemplatePlugin(context) {
val addTemplate by addTemplateTask(SimpleJsClientTemplate())
@@ -1,7 +1,7 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.templates.*
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.templates.KtorServerTemplate
class KtorTemplatesPlugin(context: Context) : TemplatePlugin(context) {
val addTemplate by addTemplateTask(KtorServerTemplate())
@@ -2,8 +2,8 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.Context
import org.jetbrains.kotlin.tools.projectWizard.core.Plugin
import org.jetbrains.kotlin.tools.projectWizard.templates.Template
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.templates.Template
abstract class TemplatePlugin(context: Context) : Plugin(context) {
fun addTemplateTask(template: Template) = pipelineTask(GenerationPhase.PREPARE) {
@@ -1,6 +1,6 @@
package org.jetbrains.kotlin.tools.projectWizard.plugins.templates
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.KOTLIN_DIR
import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.RESOURCES_DIR
@@ -4,7 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.ModuleConfiguratorSetting
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting
@@ -4,7 +4,7 @@ import org.jetbrains.kotlin.tools.projectWizard.GeneratedIdentificator
import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.IdentificatorOwner
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin
@@ -1,11 +1,13 @@
package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.addWithJavaIntoJvmTarget
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.runTaskIrs
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.TemplateSetting
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.asPath
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
@@ -5,13 +5,11 @@
package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.TemplateSetting
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
@@ -3,10 +3,10 @@ package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.kotlin.tools.projectWizard.Identificator
import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.enumSettingImpl
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR
@@ -6,7 +6,8 @@ import org.apache.velocity.runtime.RuntimeConstants
import org.apache.velocity.runtime.RuntimeServices
import org.apache.velocity.runtime.log.LogChute
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.div
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileFormattingService
import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService
@@ -1,65 +1,58 @@
package org.jetbrains.kotlin.tools.projectWizard.wizard
import org.jetbrains.kotlin.tools.projectWizard.core.context.ReadingContext
import org.jetbrains.kotlin.tools.projectWizard.core.context.WritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.*
import org.jetbrains.kotlin.tools.projectWizard.core.context.SettingsWritingContext
import org.jetbrains.kotlin.tools.projectWizard.core.entity.*
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.*
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.SettingSerializer
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference
import org.jetbrains.kotlin.tools.projectWizard.core.service.ServicesManager
import org.jetbrains.kotlin.tools.projectWizard.core.service.SettingSavingWizardService
import org.jetbrains.kotlin.tools.projectWizard.core.service.WizardService
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules
abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: ServicesManager, private val isUnitTestMode: Boolean) {
val context = Context(createPlugins, EventManager())
val valuesReadingContext = ReadingContext(context, servicesManager, isUnitTestMode)
private val settingsWritingContext = SettingsWritingContext(context, servicesManager, isUnitTestMode)
protected val plugins = context.plugins
protected val pluginSettings = plugins.flatMap { it.declaredSettings }.distinctBy { it.path }
abstract class Wizard(createPlugins: PluginsCreator, servicesManager: ServicesManager, isUnitTestMode: Boolean) {
val context = Context(createPlugins, servicesManager, isUnitTestMode)
inline fun <reified V : Any> settingValue(setting: PluginSettingReference<V, SettingType<V>>): V =
with(valuesReadingContext) { setting.settingValue }
private fun Context.checkAllRequiredSettingPresent(phases: Set<GenerationPhase>): TaskResult<Unit> =
private fun checkAllRequiredSettingPresent(phases: Set<GenerationPhase>): TaskResult<Unit> = context.read {
getUnspecifiedSettings(phases).let { unspecifiedSettings ->
if (unspecifiedSettings.isEmpty()) UNIT_SUCCESS
else Failure(RequiredSettingsIsNotPresentError(unspecifiedSettings.map { it.path }))
}
}
private fun initNonPluginDefaultValues() {
with(settingsWritingContext) {
KotlinPlugin::modules.reference.notRequiredSettingValue?.withAllSubModules(includeSourcesets = true)?.forEach { module ->
with(module) { initDefaultValuesForSettings() }
}
context.writeSettings {
KotlinPlugin::modules.reference.notRequiredSettingValue
?.withAllSubModules(includeSourcesets = true)
?.forEach { module ->
with(module) { initDefaultValuesForSettings() }
}
}
}
protected fun initPluginSettingsDefaultValues() {
with(settingsWritingContext) {
context.writeSettings {
for (setting in pluginSettings) {
setting.reference.setSettingValueToItsDefaultIfItIsNotSetValue()
}
}
}
@Suppress("UNUSED_PARAMETER")
fun ReadingContext.validate(phases: Set<GenerationPhase>): TaskResult<Unit> =
context.settingContext.allPluginSettings.map { setting ->
val value = context.settingContext.pluginSettingValue(setting) ?: return@map ValidationResult.OK
fun validate(phases: Set<GenerationPhase>): TaskResult<Unit> = context.read {
pluginSettings.map { setting ->
val value = setting.reference.notRequiredSettingValue ?: return@map ValidationResult.OK
if (setting.neededAtPhase in phases && setting.isActive(this))
(setting.validator as SettingValidator<Any>).validate(this, value)
else ValidationResult.OK
}.fold(ValidationResult.OK, ValidationResult::and).toResult()
}.fold().toResult()
}
private fun ReadingContext.saveSettingValues(phases: Set<GenerationPhase>) {
private fun saveSettingValues(phases: Set<GenerationPhase>) = context.read {
for (setting in pluginSettings) {
if (setting.neededAtPhase !in phases) continue
if (!setting.isSavable) continue
if (!setting.isAvailable(valuesReadingContext)) continue
if (!setting.isAvailable(this)) continue
val serializer = setting.type.serializer as? SettingSerializer.Serializer<Any> ?: continue
service<SettingSavingWizardService>().saveSettingValue(
setting.path,
@@ -75,21 +68,23 @@ abstract class Wizard(createPlugins: PluginsCreator, val servicesManager: Servic
): TaskResult<Unit> = computeM {
initPluginSettingsDefaultValues()
initNonPluginDefaultValues()
context.checkAllRequiredSettingPresent(phases).ensure()
val taskRunningContext = WritingContext(context, servicesManager.withServices(services), isUnitTestMode)
taskRunningContext.validate(phases).ensure()
taskRunningContext.saveSettingValues(phases)
checkAllRequiredSettingPresent(phases).ensure()
validate(phases).ensure()
saveSettingValues(phases)
val (tasksSorted) = context.sortTasks().map { tasks ->
tasks.groupBy { it.phase }.toList().sortedBy { it.first }.flatMap { it.second }
}
tasksSorted
// We should take only one task of each type as all tasks with the same path are considered to be the same
.distinctBy { it.path }
.asSequence()
.filter { task -> task.phase in phases }
.filter { task -> task.isAvailable(taskRunningContext) }
.map { task -> onTaskExecuting(task); task.action(taskRunningContext) }
.sequenceFailFirst()
.ignore()
context.withAdditionalServices(services).write {
tasksSorted
// We should take only one task of each type as all tasks with the same path are considered to be the same
.distinctBy { it.path }
.asSequence()
.filter { task -> task.phase in phases }
.filter { task -> task.isAvailable(this) }
.map { task -> onTaskExecuting(task); task.action(this) }
.sequenceFailFirst()
.ignore()
}
}
}