diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt index d4ad0ac53d7..b7c0544e590 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/IdeWizard.kt @@ -4,7 +4,6 @@ import com.intellij.facet.impl.ui.libraries.LibraryOptionsPanel import com.intellij.framework.library.FrameworkLibraryVersionFilter import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk -import com.intellij.openapi.roots.ui.configuration.libraries.CustomLibraryDescription import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainer import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesContainerFactory import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription @@ -43,14 +42,14 @@ class IdeWizard( ) var jdk: Sdk? = null - var projectPath by setting(StructurePlugin::projectPath.reference) - var projectName by setting(StructurePlugin::name.reference) + var projectPath by setting(StructurePlugin.projectPath.reference) + var projectName by setting(StructurePlugin.name.reference) - var groupId by setting(StructurePlugin::groupId.reference) - var artifactId by setting(StructurePlugin::artifactId.reference) - var buildSystemType by setting(BuildSystemPlugin::type.reference) + var groupId by setting(StructurePlugin.groupId.reference) + var artifactId by setting(StructurePlugin.artifactId.reference) + var buildSystemType by setting(BuildSystemPlugin.type.reference) - var projectTemplate by setting(ProjectTemplatesPlugin::template.reference) + var projectTemplate by setting(ProjectTemplatesPlugin.template.reference) private fun > setting(reference: SettingReference) = object : ReadWriteProperty { diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt index 54db30a6b6c..d3611268994 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/NewProjectWizardModuleBuilder.kt @@ -3,7 +3,6 @@ package org.jetbrains.kotlin.tools.projectWizard.wizard import com.intellij.ide.RecentProjectsManager import com.intellij.ide.actions.NewProjectAction import com.intellij.ide.impl.NewProjectUtil -import com.intellij.ide.projectWizard.NewProjectWizard import com.intellij.ide.util.projectWizard.* import com.intellij.ide.wizard.AbstractWizard import com.intellij.openapi.Disposable @@ -14,11 +13,9 @@ import com.intellij.openapi.module.ModuleType import com.intellij.openapi.options.ConfigurationException import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project -import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.roots.ui.configuration.ModulesProvider import com.intellij.openapi.ui.Messages import com.intellij.util.SystemProperties -import org.jetbrains.kotlin.idea.configuration.ExperimentalFeatures import org.jetbrains.kotlin.idea.framework.KotlinTemplatesFactory import org.jetbrains.kotlin.idea.projectWizard.ProjectCreationStats import org.jetbrains.kotlin.idea.projectWizard.UiEditorUsageStats @@ -201,12 +198,12 @@ class ModuleNewWizardFirstStep(wizard: IdeWizard) : WizardStep(wizard, Generatio val suggestedProjectParentLocation = suggestProjectLocation() val suggestedProjectName = ProjectWizardUtil.findNonExistingFileName(suggestedProjectParentLocation, "untitled", "") wizard.context.writeSettings { - StructurePlugin::name.reference.setValue(suggestedProjectName) - StructurePlugin::projectPath.reference.setValue(suggestedProjectParentLocation / suggestedProjectName) - StructurePlugin::artifactId.reference.setValue(suggestedProjectName) + StructurePlugin.name.reference.setValue(suggestedProjectName) + StructurePlugin.projectPath.reference.setValue(suggestedProjectParentLocation / suggestedProjectName) + StructurePlugin.artifactId.reference.setValue(suggestedProjectName) - if (StructurePlugin::groupId.reference.notRequiredSettingValue == null) { - StructurePlugin::groupId.reference.setValue(suggestGroupId()) + if (StructurePlugin.groupId.notRequiredSettingValue == null) { + StructurePlugin.groupId.reference.setValue(suggestGroupId()) } } } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt index 6a45f855c9e..26267b56f6e 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/Component.kt @@ -6,10 +6,8 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Reader import org.jetbrains.kotlin.tools.projectWizard.core.SettingsWriter import org.jetbrains.kotlin.tools.projectWizard.core.Writer import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult -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 -import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference abstract class Component : Displayable, ErrorNavigatable { private val subComponents = mutableListOf() @@ -45,10 +43,6 @@ abstract class DynamicComponent(private val context: Context) : Component() { value?.let { setValue(it) } } - - inline val > PluginSettingPropertyReference.value: V? - get() = reference.value - init { write { eventManager.addSettingUpdaterEventListener { reference -> diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt index e65fdc9e89c..38fa422a1a6 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/BuildSystemTypeSettingComponent.kt @@ -29,7 +29,7 @@ import javax.swing.JComponent class BuildSystemTypeSettingComponent( context: Context ) : SettingComponent>( - BuildSystemPlugin::type.reference, + BuildSystemPlugin.type.reference, context ) { diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt index c7161c2c969..ada41a4ed38 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/FirstWizardStepComponent.kt @@ -12,7 +12,6 @@ import com.intellij.ui.layout.panel import com.intellij.util.ui.JBUI import com.intellij.util.ui.components.BorderLayoutPanel import org.jetbrains.kotlin.tools.projectWizard.core.Context -import org.jetbrains.kotlin.tools.projectWizard.core.entity.path 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.StructurePlugin @@ -53,8 +52,8 @@ class ProjectSettingsComponent(ideWizard: IdeWizard) : DynamicComponent(ideWizar private val nameAndLocationComponent = TitledComponentsList( listOf( - StructurePlugin::name.reference.createSettingComponent(context), - StructurePlugin::projectPath.reference.createSettingComponent(context), + StructurePlugin.name.reference.createSettingComponent(context), + StructurePlugin.projectPath.reference.createSettingComponent(context), projectTemplateComponent, buildSystemSetting, jdkComponent @@ -84,17 +83,17 @@ class ProjectSettingsComponent(ideWizard: IdeWizard) : DynamicComponent(ideWizar override fun onValueUpdated(reference: SettingReference<*, *>?) { super.onValueUpdated(reference) when (reference?.path) { - StructurePlugin::name.path -> { - val isNameValid = read { StructurePlugin::name.reference.validate().isOk } + StructurePlugin.name.path -> { + val isNameValid = read { StructurePlugin.name.reference.validate().isOk } if (isNameValid) { tryUpdateLocationByProjectName() tryArtifactIdByProjectName() } } - StructurePlugin::artifactId.path -> { + StructurePlugin.artifactId.path -> { artifactIdWasUpdatedByHand = true } - StructurePlugin::projectPath.path -> { + StructurePlugin.projectPath.path -> { locationWasUpdatedByHand = true } } @@ -102,9 +101,9 @@ class ProjectSettingsComponent(ideWizard: IdeWizard) : DynamicComponent(ideWizar private fun tryUpdateLocationByProjectName() { if (!locationWasUpdatedByHand) { - val location = read { StructurePlugin::projectPath.settingValue } + val location = read { StructurePlugin.projectPath.settingValue } if (location.parent != null) modify { - StructurePlugin::projectPath.reference.setValue(location.parent.resolve(StructurePlugin::name.settingValue)) + StructurePlugin.projectPath.reference.setValue(location.parent.resolve(StructurePlugin.name.settingValue)) locationWasUpdatedByHand = false } } @@ -112,7 +111,7 @@ class ProjectSettingsComponent(ideWizard: IdeWizard) : DynamicComponent(ideWizar private fun tryArtifactIdByProjectName() { if (!artifactIdWasUpdatedByHand) modify { - StructurePlugin::artifactId.reference.setValue(StructurePlugin::name.settingValue) + StructurePlugin.artifactId.reference.setValue(StructurePlugin.name.settingValue) artifactIdWasUpdatedByHand = false } } @@ -124,7 +123,7 @@ class BuildSystemAdditionalSettingsComponent(ideWizard: IdeWizard) : DynamicComp override fun onValueUpdated(reference: SettingReference<*, *>?) { super.onValueUpdated(reference) - if (reference == BuildSystemPlugin::type.reference) { + if (reference == BuildSystemPlugin.type.reference) { updateBuildSystemComponent() } } @@ -135,7 +134,7 @@ class BuildSystemAdditionalSettingsComponent(ideWizard: IdeWizard) : DynamicComp } private fun updateBuildSystemComponent() { - val buildSystemType = read { BuildSystemPlugin::type.settingValue() } + val buildSystemType = read { BuildSystemPlugin.type.settingValue } val state = buildSystemType.state() section.updateTitleAndComponent(state.sectionTitle, state.component) } @@ -162,9 +161,9 @@ class BuildSystemAdditionalSettingsComponent(ideWizard: IdeWizard) : DynamicComp private class PomSettingsComponent(context: Context) : TitledComponentsList( listOf( - StructurePlugin::groupId.reference.createSettingComponent(context), - StructurePlugin::artifactId.reference.createSettingComponent(context), - StructurePlugin::version.reference.createSettingComponent(context) + StructurePlugin.groupId.reference.createSettingComponent(context), + StructurePlugin.artifactId.reference.createSettingComponent(context), + StructurePlugin.version.reference.createSettingComponent(context) ), context, stretchY = true @@ -257,7 +256,7 @@ class ProjectPreviewComponent(context: Context) : DynamicComponent(context) { override fun onValueUpdated(reference: SettingReference<*, *>?) { super.onValueUpdated(reference) - if (reference == ProjectTemplatesPlugin::template.reference) { + if (reference == ProjectTemplatesPlugin.template.reference) { modulesEditorComponent.updateModel() } } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt index 8bf4f8d7f7d..1f7d2945cdb 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt @@ -23,7 +23,7 @@ import javax.swing.JComponent class ProjectTemplateSettingComponent( context: Context ) : SettingComponent>( - ProjectTemplatesPlugin::template.reference, + ProjectTemplatesPlugin.template.reference, context ) { override val validationIndicator: ValidationIndicator? get() = null @@ -58,7 +58,7 @@ class ProjectTemplateSettingComponent( override fun onValueUpdated(reference: SettingReference<*, *>?) { super.onValueUpdated(reference) - if (reference == ProjectTemplatesPlugin::template.reference) { + if (reference == ProjectTemplatesPlugin.template.reference) { applySelectedTemplate() value?.let { template -> list.setSelectedValue(template, true) diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleDependenciesComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleDependenciesComponent.kt index 629b4290fb3..83808b6489a 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleDependenciesComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleDependenciesComponent.kt @@ -61,7 +61,7 @@ class ModuleDependenciesComponent( } private fun possibleDependencies(): List = - read { KotlinPlugin::modules.settingValue }.withAllSubModules().toMutableList().apply { + read { KotlinPlugin.modules.settingValue }.withAllSubModules().toMutableList().apply { module?.let(::remove) removeAll( module diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt index 1e5acce72b3..db07aff49ea 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/ModuleSettingsComponent.kt @@ -90,7 +90,7 @@ private class ModuleNameComponent(context: Context, private val module: Module) override fun onInit() { super.onInit() - val isSingleRootMode = read { KotlinPlugin::modules.settingValue }.size == 1 + val isSingleRootMode = read { KotlinPlugin.modules.settingValue }.size == 1 when { isSingleRootMode && module.isRootModule -> { textField.disable(KotlinNewProjectWizardUIBundle.message("module.settings.name.same.as.project")) @@ -168,7 +168,7 @@ private object NoneTemplate : Template() { } fun Reader.availableTemplatesFor(module: Module) = - TemplatesPlugin::templates.propertyValue.values.filter { template -> + TemplatesPlugin.templates.propertyValue.values.filter { template -> module.configurator.moduleType in template.moduleTypes } diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/ModulesEditorComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/ModulesEditorComponent.kt index b90cefb7a20..2865cdf5e8d 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/ModulesEditorComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/secondStep/modulesEditor/ModulesEditorComponent.kt @@ -26,14 +26,14 @@ class ModulesEditorComponent( needBorder: Boolean, private val editable: Boolean, oneEntrySelected: (data: DisplayableSettingItem?) -> Unit -) : SettingComponent, ListSettingType>(KotlinPlugin::modules.reference, context) { +) : SettingComponent, ListSettingType>(KotlinPlugin.modules.reference, context) { private val tree: ModulesEditorTree = ModulesEditorTree( onSelected = { oneEntrySelected(it) }, context = context, isTreeEditable = editable, addModule = { component -> - val isMppProject = KotlinPlugin::projectKind.value == ProjectKind.Singleplatform + val isMppProject = KotlinPlugin.projectKind.reference.value == ProjectKind.Singleplatform moduleCreator.create( target = null, // The empty tree case allowMultiplatform = isMppProject, @@ -77,7 +77,7 @@ class ModulesEditorComponent( moduleCreator = moduleCreator, model = model, getModules = { value ?: emptyList() }, - isMultiplatformProject = { KotlinPlugin::projectKind.value != ProjectKind.Singleplatform } + isMultiplatformProject = { KotlinPlugin.projectKind.reference.value != ProjectKind.Singleplatform } ) else null override val component: JComponent by lazy(LazyThreadSafetyMode.NONE) { diff --git a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt index 35130bda181..3a1a99dcada 100644 --- a/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt +++ b/idea/idea-new-project-wizard/tests/org/jetbrains/kotlin/tools/projectWizard/wizard/services/ProjectImportingTestWizardService.kt @@ -59,7 +59,7 @@ class GradleProjectImportingTestWizardService(private val project: Project) : Pr return importingErrorMessage?.let { message -> Failure( ProjectImportingError( - reader { KotlinPlugin::version.propertyValue.version.toString() }, + reader { KotlinPlugin.version.propertyValue.version.toString() }, message, ) ) diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt index 18881584688..3bba689d8fc 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/src/org/jetbrains/kotlin/tools/projectWizard/wizard/YamlWizard.kt @@ -32,7 +32,7 @@ class YamlWizard( context.writeSettings { settingsValuesFromYaml.forEach { (reference, value) -> reference.setValue(value) } - StructurePlugin::projectPath.reference.setValue(projectPath) + StructurePlugin.projectPath.reference.setValue(projectPath) } super.apply(services, phases, onTaskExecuting) @@ -49,7 +49,7 @@ fun Reader.parseYaml( yaml: String, pluginSettings: List> ): TaskResult, Any>> { - val parsingData = ParsingState(TemplatesPlugin::templates.propertyValue, emptyMap()) + val parsingData = ParsingState(TemplatesPlugin.templates.propertyValue, emptyMap()) val yamlParser = YamlSettingsParser(pluginSettings, parsingData) return yamlParser.parseYamlText(yaml) } diff --git a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt index 9ada2a60751..ab1939f00a6 100644 --- a/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt +++ b/libraries/tools/new-project-wizard/new-project-wizard-cli/tests/org/jetbrains/kotlin/tools/projectWizard/cli/ProjectTemplateBasedTestWizard.kt @@ -43,11 +43,11 @@ class ProjectTemplateBasedTestWizard( 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) + 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() diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt index f7c064bc19e..3488f1d9639 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/SettingsOwner.kt @@ -10,6 +10,7 @@ import kotlin.properties.ReadOnlyProperty interface SettingsOwner { fun > settingDelegate( + prefix: String, create: (path: String) -> SettingBuilder ): ReadOnlyProperty> @@ -21,24 +22,27 @@ interface SettingsOwner { title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String = "", init: DropDownSettingType.Builder.() -> Unit = {} - ): ReadOnlyProperty>> = settingDelegate { path -> + ): ReadOnlyProperty>> = settingDelegate(prefix) { path -> DropDownSettingType.Builder(path, title, neededAtPhase, parser).apply(init) } fun stringSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", init: StringSettingType.Builder.() -> Unit = {} - ) = settingDelegate { path -> + ) = settingDelegate(prefix) { path -> StringSettingType.Builder(path, title, neededAtPhase).apply(init) } fun booleanSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", init: BooleanSettingType.Builder.() -> Unit = {} - ) = settingDelegate { path -> + ) = settingDelegate(prefix) { path -> BooleanSettingType.Builder(path, title, neededAtPhase).apply(init) } @@ -46,16 +50,18 @@ interface SettingsOwner { title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String = "", init: ValueSettingType.Builder.() -> Unit = {} - ) = settingDelegate { path -> + ) = settingDelegate(prefix) { path -> ValueSettingType.Builder(path, title, neededAtPhase, parser).apply(init) } fun versionSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", init: VersionSettingType.Builder.() -> Unit = {} - ) = settingDelegate { path -> + ) = settingDelegate(prefix) { path -> VersionSettingType.Builder(path, title, neededAtPhase).apply(init) } @@ -63,16 +69,18 @@ interface SettingsOwner { title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String = "", init: ListSettingType.Builder.() -> Unit = {} - ) = settingDelegate { path -> + ) = settingDelegate(prefix) { path -> ListSettingType.Builder(path, title, neededAtPhase, parser).apply(init) } fun pathSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", init: PathSettingType.Builder.() -> Unit = {} - ) = settingDelegate { path -> + ) = settingDelegate(prefix) { path -> PathSettingType.Builder(path, title, neededAtPhase).apply(init) } } @@ -81,8 +89,9 @@ interface SettingsOwner { inline fun SettingsOwner.enumSettingImpl( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", crossinline init: DropDownSettingType.Builder.() -> Unit = {} -) where E : Enum, E : DisplayableSettingItem = dropDownSetting(title, neededAtPhase, enumParser()) { +) where E : Enum, E : DisplayableSettingItem = dropDownSetting(title, neededAtPhase, enumParser(), prefix) { values = enumValues().asList() // init() diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt index 20887b6fa18..2955ae214d7 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Context.kt @@ -6,19 +6,14 @@ 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 constructor( - private val servicesManager: ServicesManager, + val servicesManager: ServicesManager, private val isUnitTestMode: Boolean, private val settingContext: SettingContext, - private val propertyContext: PropertyContext, - private val taskContext: TaskContext + private val propertyContext: PropertyContext ) { private lateinit var plugins: List @@ -47,8 +42,7 @@ class Context private constructor( servicesManager, isUnitTestMode, SettingContext(), - PropertyContext(), - TaskContext() + PropertyContext() ) { plugins = pluginsCreator(this).onEach(::initPlugin) } @@ -58,50 +52,17 @@ class Context private constructor( servicesManager.withAdditionalServices(services), isUnitTestMode, settingContext, - propertyContext, - taskContext + propertyContext ).also { it.plugins = plugins } - - fun > pluginSettingDelegate( - create: (path: String) -> SettingBuilder - ): ReadOnlyProperty> = - settingContext.settingDelegate(create) - - fun propertyDelegate( - init: Property.Builder.() -> 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 task1Delegate( - init: Task1.Builder.() -> Unit - ) = entityDelegate(taskContext) { name -> - Task1.Builder(name).apply(init).build() - } - - private fun initPlugin(plugin: Plugin) { - for (entityReference in plugin::class.memberProperties) { - val type = entityReference.returnType.classifier.safeAs>() ?: continue - if (type.isSubclassOf(Entity::class)) { - when (val entity = entityReference.getter.call(plugin)) { - is Property<*> -> { - @Suppress("UNCHECKED_CAST") - propertyContext[entityReference as PropertyReference] = entity.defaultValue - } - } - } + for (property in plugin.properties) { + propertyContext[property] = property.defaultValue + } + for (setting in plugin.settings) { + settingContext.setPluginSetting(setting.reference, setting) } } @@ -110,17 +71,14 @@ class Context private constructor( get() = plugins .flatMap { it.pipelineTasks } - private fun task(reference: PipelineTaskReference) = - taskContext.getEntity(reference) as? PipelineTask ?: error(reference.path) - private val dependencyList: Map> get() { val dependeeMap = pipelineLineTasks.flatMap { task -> - task.after.map { after -> task to task(after) } + task.after.map { after -> task to after } } val dependencyMap = pipelineLineTasks.flatMap { task -> - task.before.map { before -> task(before) to task } + task.before.map { before -> before to task } } return (dependeeMap + dependencyMap) @@ -151,18 +109,17 @@ class Context private constructor( fun serviceByClass(klass: KClass, filter: (S) -> Boolean = { true }): S = servicesManager.serviceByClass(klass, filter) ?: error("Service ${klass.simpleName} was not found") - @Suppress("UNCHECKED_CAST") - val PropertyReference.propertyValue: T - get() = propertyContext[this] as T + val Property.propertyValue: T + get() = propertyContext[this] ?: error("No value is present for property `$this`") val > SettingReference.settingValue: V get() = settingContext[this] ?: error("No value is present for setting `$this`") - inline val KProperty1>>.settingValue: V - get() = reference.settingValue + val PluginSetting>.settingValue: V + get() = settingContext[this.reference] ?: error("No value is present for setting `$this`") - inline fun KProperty1>>.settingValue(): V = - this.reference.settingValue + val PluginSetting>.notRequiredSettingValue: V? + get() = settingContext[this.reference] fun > SettingReference.settingValue(): V = settingContext[this] ?: error("No value is present for setting `$this`") @@ -207,24 +164,23 @@ class Context private constructor( val eventManager: EventManager get() = settingContext.eventManager - fun Task1Reference.execute(value: A): TaskResult { + fun Task1.execute(value: A): TaskResult { @Suppress("UNCHECKED_CAST") - val task = taskContext.getEntity(this) as Task1 - return task.action(this@Writer, value) + return action(this@Writer, value) } - fun PropertyReference.update( + fun Property.update( updater: suspend ComputeContext<*>.(T) -> TaskResult ): TaskResult = compute { val (newValue) = updater(propertyValue) propertyContext[this@update] = newValue } - fun PropertyReference>.addValues( + fun Property>.addValues( vararg values: T ): TaskResult = update { oldValues -> success(oldValues + values) } - fun PropertyReference>.addValues( + fun Property>.addValues( values: List ): TaskResult = update { oldValues -> success(oldValues + values) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt index 878f6a4dfea..438bb21d3b6 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Parser.kt @@ -6,7 +6,6 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.templates.Template import java.nio.file.Paths import kotlin.reflect.KClass -import kotlin.reflect.full.isSubclassOf data class ParsingState( val idToTemplate: Map, @@ -87,10 +86,6 @@ fun valueParserM(parser: suspend ParsingContext.(value: Any?, path: St } } -inline fun valueParser() = valueParser { value, path -> - value.parseAs(path, T::class).get() -} - fun Any?.classMismatchError(@NonNls path: String, expected: KClass<*>): ParseError { val classpath = this?.let { it::class.simpleName } ?: "null" return ParseError("Expected ${expected.simpleName!!} for `$path` but $classpath was found") @@ -100,11 +95,6 @@ inline fun Any?.parseAs(@NonNls path: String) = safeAs().toResult { classMismatchError(path, V::class) } -inline fun Any?.parseAs(@NonNls path: String, klass: KClass): TaskResult = - this?.takeIf { it::class.isSubclassOf(klass) }?.safeAs() - .toResult { classMismatchError(path, klass) } - - inline fun Map<*, *>.parseValue(@NonNls path: String, @NonNls name: String) = get(name).parseAs("$path.$name") @@ -124,13 +114,6 @@ inline fun Map<*, *>.parseValue( } } -inline fun Map<*, *>.parseValue( - @NonNls path: String, - @NonNls name: String, - klass: KClass -) = get(path).parseAs("$path.$name", klass) - - fun Map<*, *>.parseValue( context: ParsingContext, @NonNls path: String, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Plugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Plugin.kt index 09ae23cec66..ef0a93c4c50 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Plugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/Plugin.kt @@ -9,163 +9,163 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem 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.full.isSubclassOf -typealias PluginReference = KClass typealias PluginsCreator = (Context) -> List abstract class Plugin(override val context: Context) : EntityBase(), - SettingsOwner, ContextOwner, EntitiesOwnerDescriptor, EntitiesOwner { override val descriptor get() = this override val id: String get() = path - override fun > settingDelegate( - create: (path: String) -> SettingBuilder - ): ReadOnlyProperty> = context.pluginSettingDelegate(create) - val reference = this::class abstract override val path: String + abstract val properties: List> abstract val settings: List> abstract val pipelineTasks: List - fun pipelineTask(phase: GenerationPhase, init: PipelineTask.Builder.() -> Unit) = - context.pipelineTaskDelegate(phase, init) + companion object : SettingsOwner { + fun pipelineTask( + prefix: String, + phase: GenerationPhase, + init: PipelineTask.Builder.() -> Unit + ): ReadOnlyProperty = + cached { name -> PipelineTask.Builder(withPrefix(prefix, name), phase).apply(init).build() } - fun task1(init: Task1.Builder.() -> Unit) = - context.task1Delegate(init) + fun task1( + prefix: String, + init: Task1.Builder.() -> Unit + ): ReadOnlyProperty> = cached { name -> Task1.Builder(withPrefix(prefix, name)).apply(init).build() } - fun property(defaultValue: T, init: Property.Builder.() -> Unit = {}) = - context.propertyDelegate(init, defaultValue) + fun property( + prefix: String, + defaultValue: T, + init: Property.Builder.() -> Unit = {} + ): ReadOnlyProperty> = + cached { name -> Property.Builder(withPrefix(prefix, name), defaultValue).apply(init).build() } - fun listProperty(vararg defaultValues: T, init: Property.Builder>.() -> Unit = {}) = - property(defaultValues.toList(), init) + fun listProperty(prefix: String, vararg defaultValues: T, init: Property.Builder>.() -> Unit = {}) = + property(prefix, defaultValues.toList(), init) + private fun withPrefix(name: String, prefix: String): String = if (prefix.isNotEmpty()) "$prefix.$name" else name - // setting types + override fun > settingDelegate( + prefix: String, + create: (path: String) -> SettingBuilder + ): ReadOnlyProperty> = cached { name -> PluginSetting(create(withPrefix(name, prefix)).buildInternal()) } - @Suppress("UNCHECKED_CAST") - final override fun dropDownSetting( - title: String, - neededAtPhase: GenerationPhase, - parser: Parser, - init: DropDownSettingType.Builder.() -> Unit - ): ReadOnlyProperty>> = - super.dropDownSetting( - title, - neededAtPhase, - parser, - init - ) as ReadOnlyProperty>> + // setting types - @Suppress("UNCHECKED_CAST") - final override fun stringSetting( - title: String, - neededAtPhase: GenerationPhase, - init: StringSettingType.Builder.() -> Unit - ): ReadOnlyProperty> = - super.stringSetting( - title, - neededAtPhase, - init - ) as ReadOnlyProperty> + @Suppress("UNCHECKED_CAST") + override fun dropDownSetting( + title: String, + neededAtPhase: GenerationPhase, + parser: Parser, + prefix: String, + init: DropDownSettingType.Builder.() -> Unit + ): ReadOnlyProperty>> = + super.dropDownSetting( + title, + neededAtPhase, + parser, + prefix, + init + ) as ReadOnlyProperty>> - @Suppress("UNCHECKED_CAST") - final override fun booleanSetting( - title: String, - neededAtPhase: GenerationPhase, - init: BooleanSettingType.Builder.() -> Unit - ): ReadOnlyProperty> = - super.booleanSetting( - title, - neededAtPhase, - init - ) as ReadOnlyProperty> + @Suppress("UNCHECKED_CAST") + override fun stringSetting( + title: String, + neededAtPhase: GenerationPhase, + prefix: String, + init: StringSettingType.Builder.() -> Unit + ): ReadOnlyProperty> = + super.stringSetting( + title, + neededAtPhase, + prefix, + init + ) as ReadOnlyProperty> - @Suppress("UNCHECKED_CAST") - final override fun valueSetting( - title: String, - neededAtPhase: GenerationPhase, - parser: Parser, - init: ValueSettingType.Builder.() -> Unit - ): ReadOnlyProperty>> = - super.valueSetting( - title, - neededAtPhase, - parser, - init - ) as ReadOnlyProperty>> + @Suppress("UNCHECKED_CAST") + override fun booleanSetting( + title: String, + neededAtPhase: GenerationPhase, + prefix: String, + init: BooleanSettingType.Builder.() -> Unit + ): ReadOnlyProperty> = + super.booleanSetting( + title, + neededAtPhase, + prefix, + init + ) as ReadOnlyProperty> - @Suppress("UNCHECKED_CAST") - final override fun versionSetting( - title: String, - neededAtPhase: GenerationPhase, - init: VersionSettingType.Builder.() -> Unit - ): ReadOnlyProperty> = - super.versionSetting( - title, - neededAtPhase, - init - ) as ReadOnlyProperty> + @Suppress("UNCHECKED_CAST") + override fun valueSetting( + title: String, + neededAtPhase: GenerationPhase, + parser: Parser, + prefix: String, + init: ValueSettingType.Builder.() -> Unit + ): ReadOnlyProperty>> = + super.valueSetting( + title, + neededAtPhase, + parser, + prefix, + init + ) as ReadOnlyProperty>> - @Suppress("UNCHECKED_CAST") - final override fun listSetting( - title: String, - neededAtPhase: GenerationPhase, - parser: Parser, - init: ListSettingType.Builder.() -> Unit - ): ReadOnlyProperty, ListSettingType>> = - super.listSetting( - title, - neededAtPhase, - parser, - init - ) as ReadOnlyProperty, ListSettingType>> + @Suppress("UNCHECKED_CAST") + override fun versionSetting( + title: String, + neededAtPhase: GenerationPhase, + prefix: String, + init: VersionSettingType.Builder.() -> Unit + ): ReadOnlyProperty> = + super.versionSetting( + title, + neededAtPhase, + prefix, + init + ) as ReadOnlyProperty> - @Suppress("UNCHECKED_CAST") - final override fun pathSetting( - title: String, - neededAtPhase: GenerationPhase, - init: PathSettingType.Builder.() -> Unit - ): ReadOnlyProperty> = - super.pathSetting(title, neededAtPhase, init) as ReadOnlyProperty> + @Suppress("UNCHECKED_CAST") + override fun listSetting( + title: String, + neededAtPhase: GenerationPhase, + parser: Parser, + prefix: String, + init: ListSettingType.Builder.() -> Unit + ): ReadOnlyProperty, ListSettingType>> = + super.listSetting( + title, + neededAtPhase, + parser, + prefix, + init + ) as ReadOnlyProperty, ListSettingType>> - @Suppress("UNCHECKED_CAST") - inline fun enumSetting( - title: String, - neededAtPhase: GenerationPhase, - crossinline init: DropDownSettingType.Builder.() -> Unit = {} - ): ReadOnlyProperty>> where E : Enum, E : DisplayableSettingItem = - enumSettingImpl(title, neededAtPhase, init) as ReadOnlyProperty>> + @Suppress("UNCHECKED_CAST") + override fun pathSetting( + title: String, + neededAtPhase: GenerationPhase, + prefix: String, + init: PathSettingType.Builder.() -> Unit + ): ReadOnlyProperty> = + super.pathSetting(title, neededAtPhase, prefix, init) as ReadOnlyProperty> + + @Suppress("UNCHECKED_CAST") + inline fun enumSetting( + title: String, + neededAtPhase: GenerationPhase, + prefix: String, + crossinline init: DropDownSettingType.Builder.() -> Unit = {} + ): ReadOnlyProperty>> where E : Enum, E : DisplayableSettingItem = + enumSettingImpl(title, neededAtPhase, prefix, init) as ReadOnlyProperty>> + } } -val PluginReference.withParentPlugins - get() = generateSequence(this) { klass -> - klass.supertypes.firstOrNull { supertype -> - supertype.classifier?.safeAs>() - ?.isSubclassOf(Plugin::class) == true - }?.classifier - ?.safeAs>() - ?.takeIf { superClass -> - superClass.simpleName != null - } - } - -val PluginReference.name - get() = simpleName - ?.removeSuffix("Plugin") - ?.decapitalize() - .orEmpty() - -val PluginReference.path - get() = withParentPlugins.mapNotNull { klass -> - klass.name.takeIf { it.isNotEmpty() } - }.toList() - .reversed() - .joinToString(".") - diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Entity.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Entity.kt index f95c28bea82..0f4b4d26b24 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Entity.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Entity.kt @@ -1,12 +1,6 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity -import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner -import org.jetbrains.kotlin.tools.projectWizard.core.PluginReference -import org.jetbrains.kotlin.tools.projectWizard.core.path import org.jetbrains.kotlin.tools.projectWizard.core.safeAs -import kotlin.reflect.KProperty1 -import kotlin.reflect.full.declaredMemberProperties -import kotlin.reflect.jvm.javaGetter interface Entity { val path: String @@ -18,17 +12,3 @@ abstract class EntityBase: Entity { } abstract class EntityWithValue : EntityBase() - -typealias EntityReference = KProperty1 - -val EntityReference.path - get() = "${plugin.path}.$name" - -@Suppress("UNCHECKED_CAST") -val EP.original - get() = plugin.declaredMemberProperties.first { it.name == name } as EP - -@Suppress("UNCHECKED_CAST") -val EntityReference.plugin: PluginReference - get() = javaGetter!!.declaringClass.kotlin as PluginReference - diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/EntityContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/EntityContext.kt deleted file mode 100644 index 06cccce4086..00000000000 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/EntityContext.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.jetbrains.kotlin.tools.projectWizard.core.entity - -import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty - -abstract class EntityContext { - private val entities = mutableMapOf() - - open fun addEntity(entityReference: ER, createEntityByName: (String) -> E): E = - createEntityByName(entityReference.original.path).also { - entities[entityReference.original] = it - } - - fun getEntity(entityReference: ER): E? = entities[entityReference.original] - fun getAll(): List = entities.values.toList() -} - -abstract class ValuedEntityContext, ER : EntityReference> : EntityContext() { - private val values = mutableMapOf() - - operator fun get(entityReference: ER) = - values[entityReference.original.path] - - operator fun get(entityPath: String) = - values[entityPath] - - open operator fun set(entityReference: ER, value: Any) { - values[entityReference.original.path] = value - } - - open operator fun set(entityPath: String, value: Any) { - values[entityPath] = value - } - - val allValues: Map = values -} - -@Suppress("UNCHECKED_CAST") -fun entityDelegate( - entityContext: EntityContext, - createEntityByPath: (String) -> A -) = object : ReadOnlyProperty { - override fun getValue(thisRef: Any, property: KProperty<*>): A = - entityContext.getEntity(property as ER) as? A - ?: entityContext.addEntity(property, createEntityByPath) as A -} - diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Property.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Property.kt index 98ae16fa3c6..ef01a0764d8 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Property.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Property.kt @@ -1,12 +1,6 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity -import org.jetbrains.kotlin.tools.projectWizard.core.Plugin -import kotlin.reflect.KProperty1 - -typealias PropertyReference = KProperty1> - -class PropertyContext : ValuedEntityContext, PropertyReference>() - +class PropertyContext : ValuedEntityContext>() data class Property( override val path: String, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Task.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Task.kt index 8d07f7544df..8acbe2b5ccf 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Task.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/Task.kt @@ -6,12 +6,6 @@ import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import kotlin.reflect.KProperty1 -typealias TaskReference = KProperty1 -typealias Task1Reference = KProperty1> -typealias PipelineTaskReference = KProperty1 - -class TaskContext : EntityContext() - sealed class Task : EntityBase() data class Task1( @@ -32,8 +26,8 @@ data class Task1( data class PipelineTask( override val path: String, val action: Writer.() -> TaskResult, - val before: List, - val after: List, + val before: List, + val after: List, val phase: GenerationPhase, val isAvailable: Checker, val title: String? @@ -43,8 +37,8 @@ data class PipelineTask( private val phase: GenerationPhase ) { private var action: Writer.() -> TaskResult = { UNIT_SUCCESS } - private val before = mutableListOf() - private val after = mutableListOf() + private val before = mutableListOf() + private val after = mutableListOf() var isAvailable: Checker = ALWAYS_AVAILABLE_CHECKER @@ -55,11 +49,11 @@ data class PipelineTask( this.action = action } - fun runBefore(vararg before: PipelineTaskReference) { + fun runBefore(vararg before: PipelineTask) { this.before.addAll(before) } - fun runAfter(vararg after: PipelineTaskReference) { + fun runAfter(vararg after: PipelineTask) { this.after.addAll(after) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/ValuedEntityContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/ValuedEntityContext.kt new file mode 100644 index 00000000000..f1776af2bf4 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/ValuedEntityContext.kt @@ -0,0 +1,15 @@ +package org.jetbrains.kotlin.tools.projectWizard.core.entity + +abstract class ValuedEntityContext> { + private val values = mutableMapOf() + + @Suppress("UNCHECKED_CAST") + operator fun get(entity: E) = + values[entity.path] as? V + + open operator fun set(entity: E, value: Any) { + values[entity.path] = value + } + +} + diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingContext.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingContext.kt index cf295006ad0..c4434390c1a 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingContext.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingContext.kt @@ -6,9 +6,6 @@ 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 { private val values = mutableMapOf() @@ -32,27 +29,10 @@ class SettingContext { fun > getPluginSetting(pluginSettingReference: PluginSettingReference) = pluginSettings[pluginSettingReference.path] as PluginSetting - @Suppress("UNCHECKED_CAST") - private fun > getPluginSetting(pluginSettingReference: PluginSettingPropertyReference) = - pluginSettings[pluginSettingReference.path] as? PluginSetting - - private fun > setPluginSetting( - pluginSettingReference: PluginSettingPropertyReference, + fun > setPluginSetting( + pluginSettingReference: PluginSettingReference, setting: PluginSetting ) { pluginSettings[pluginSettingReference.path] = setting } - - fun > settingDelegate( - create: (path: String) -> SettingBuilder - ): ReadOnlyProperty> = object : ReadOnlyProperty> { - override fun getValue(thisRef: Any, property: KProperty<*>): PluginSetting { - @Suppress("UNCHECKED_CAST") - val reference = property as PluginSettingPropertyReference - getPluginSetting(reference)?.let { return it } - val setting = PluginSetting(create(reference.path).buildInternal()) - setPluginSetting(reference, setting) - return setting - } - } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt index a082dfc5c18..2fabd0c4006 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/entity/settings/SettingReference.kt @@ -7,15 +7,12 @@ package org.jetbrains.kotlin.tools.projectWizard.core.entity.settings import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.tools.projectWizard.Identificator -import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.Reader -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 import org.jetbrains.kotlin.tools.projectWizard.templates.Template import kotlin.reflect.KClass -import kotlin.reflect.KProperty1 sealed class SettingReference> { @@ -35,9 +32,6 @@ data class PluginSettingReference>( override val type: KClass<@UnsafeVariance T> ) : SettingReference() { - constructor(kProperty: KProperty1>, type: KClass) : - this(kProperty.path, type) - @Suppress("UNCHECKED_CAST") constructor(setting: PluginSetting) : this(setting.path, setting.type::class as KClass) @@ -112,8 +106,8 @@ data class IdBasedTemplateSettingReference>( override val module: Module? = null } -inline val > PluginSettingPropertyReference.reference: PluginSettingReference +/*inline val > PluginSettingPropertyReference.reference: PluginSettingReference get() = PluginSettingReference(this, T::class) -typealias PluginSettingPropertyReference = KProperty1> +typealias PluginSettingPropertyReference = KProperty1>*/ diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt index 3ef995f0f07..f35e91053ab 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/IrsOwner.kt @@ -3,7 +3,6 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.plus import kotlinx.collections.immutable.toPersistentList -import kotlin.reflect.full.isSubclassOf interface IrsOwner { @@ -20,7 +19,7 @@ fun I.withIrs(vararg irs: BuildSystemIR) = withReplacedIrs(irs = inline fun IrsOwner.irsOfType(): List = irs.filterIsInstance().let { irs -> - if (I::class.isSubclassOf(BuildSystemIRWithPriority::class)) + if (irs.all { it is BuildSystemIRWithPriority }) irs.sortedBy { (it as BuildSystemIRWithPriority).priority } else irs } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt index 1d119915071..64e9894d838 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidModuleConfigurator.kt @@ -44,7 +44,7 @@ interface AndroidModuleConfigurator : ModuleConfigurator, get() = ModuleType.android override fun getPluginSettings(): List>> = - listOf(AndroidPlugin::androidSdkPath.reference) + listOf(AndroidPlugin.androidSdkPath.reference) override fun createBuildFileIRs( reader: Reader, @@ -66,7 +66,7 @@ interface AndroidModuleConfigurator : ModuleConfigurator, fun Reader.createAndroidPlugin(module: Module): AndroidGradlePlugin override fun Reader.createSettingsGradleIRs(module: Module) = buildList { - +createRepositories(KotlinPlugin::version.propertyValue).map { PluginManagementRepositoryIR(RepositoryIR(it)) } + +createRepositories(KotlinPlugin.version.propertyValue).map { PluginManagementRepositoryIR(RepositoryIR(it)) } +AndroidResolutionStrategyIR(Versions.GRADLE_PLUGINS.ANDROID) } @@ -154,7 +154,7 @@ object AndroidTargetConfigurator : TargetConfigurator, ): TaskResult = computeM { val javaPackage = module.javaPackage(configurationData.pomIr) val settings = mapOf("package" to javaPackage.asCodePackage()) - TemplatesPlugin::addFileTemplates.execute( + TemplatesPlugin.addFileTemplates.execute( listOf( FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.androidManifestForLibraryXml, modulePath, settings) ) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt index 290beddfe6e..889bd94adf2 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/AndroidSinglePlatformModuleConfigurator.kt @@ -96,7 +96,7 @@ object AndroidSinglePlatformModuleConfigurator : ): TaskResult = computeM { val javaPackage = module.javaPackage(configurationData.pomIr) val settings = mapOf("package" to javaPackage.asCodePackage()) - TemplatesPlugin::addFileTemplates.execute( + TemplatesPlugin.addFileTemplates.execute( listOf( FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.activityMainXml, modulePath, settings), FileTemplate(AndroidModuleConfigurator.FileTemplateDescriptors.androidManifestXml, modulePath, settings), diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt index 09f425ad07f..409726c21a0 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/IOSModuleConfigurator.kt @@ -36,7 +36,7 @@ object IOSSinglePlatformModuleConfigurator : SinglePlatformModuleConfigurator, M module: Module, modulePath: Path ): TaskResult = - GradlePlugin::gradleProperties.addValues("xcodeproj" to "./${module.name}") + GradlePlugin.gradleProperties.addValues("xcodeproj" to "./${module.name}") override fun Reader.createTemplates( configurationData: ModulesToIrConversionData, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt index 53b568d9d7d..df6b53c2fb8 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfigurator.kt @@ -62,6 +62,7 @@ fun > Reader.settingValue(module: Module, setting: M abstract class ModuleConfiguratorSettings : SettingsOwner { final override fun > settingDelegate( + prefix: String, create: (path: String) -> SettingBuilder ): ReadOnlyProperty> = cached { name -> ModuleConfiguratorSetting(create(name).buildInternal()) @@ -72,12 +73,14 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String, init: DropDownSettingType.Builder.() -> Unit ): ReadOnlyProperty>> = super.dropDownSetting( title, neededAtPhase, parser, + prefix, init ) as ReadOnlyProperty>> @@ -85,11 +88,13 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { final override fun stringSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: StringSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.stringSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -97,11 +102,13 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { final override fun booleanSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: BooleanSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.booleanSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -110,12 +117,14 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String, init: ValueSettingType.Builder.() -> Unit ): ReadOnlyProperty>> = super.valueSetting( title, neededAtPhase, parser, + prefix, init ) as ReadOnlyProperty>> @@ -123,11 +132,13 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { final override fun versionSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: VersionSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.versionSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -136,12 +147,14 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String, init: ListSettingType.Builder.() -> Unit ): ReadOnlyProperty, ListSettingType>> = super.listSetting( title, neededAtPhase, parser, + prefix, init ) as ReadOnlyProperty, ListSettingType>> @@ -149,11 +162,13 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { final override fun pathSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: PathSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.pathSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -161,9 +176,10 @@ abstract class ModuleConfiguratorSettings : SettingsOwner { inline fun enumSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", crossinline init: DropDownSettingType.Builder.() -> Unit = {} ): ReadOnlyProperty>> where E : Enum, E : DisplayableSettingItem = - enumSettingImpl(title, neededAtPhase, init) as ReadOnlyProperty>> + enumSettingImpl(title, neededAtPhase, prefix, init) as ReadOnlyProperty>> } interface ModuleConfiguratorWithSettings : ModuleConfigurator { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt index fc251991c53..e2b0a2e225b 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/ModuleConfiguratorWithTests.kt @@ -63,7 +63,7 @@ interface ModuleConfiguratorWithTests : ModuleConfiguratorWithSettings { dependencyName, isInMppModule = module.kind .let { it == ModuleKind.multiplatform || it == ModuleKind.target }, - kotlinVersion = KotlinPlugin::version.propertyValue, + kotlinVersion = KotlinPlugin.version.propertyValue, dependencyType = DependencyType.TEST ) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt index 82cb8c9b4cd..42070bde7fb 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/configurators.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators +import kotlinx.collections.immutable.toPersistentList import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.core.Reader @@ -10,10 +11,15 @@ 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.gradle.multiplatform.DefaultTargetConfigurationIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetAccessIR 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.gradle.GradlePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.isGradle +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.kotlin.ModulesToIrConversionData import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt index 9c112e34fd8..f419a0cfd25 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/AndroidPlugin.kt @@ -11,9 +11,8 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.checker import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask -import org.jetbrains.kotlin.tools.projectWizard.core.entity.Task +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting -import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.AndroidModuleConfigurator import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.allIRModules @@ -22,36 +21,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules class AndroidPlugin(context: Context) : Plugin(context) { - override val path = "android" - - val androidSdkPath by pathSetting( - KotlinNewProjectWizardBundle.message("plugin.android.setting.sdk"), - neededAtPhase = GenerationPhase.PROJECT_GENERATION - ) { - isSavable = true - isAvailable = isAndroidContainingProject - shouldExists() - } - - private val isAndroidContainingProject = checker { - KotlinPlugin::modules.settingValue - .withAllSubModules(includeSourcesets = true) - .any { it.configurator is AndroidModuleConfigurator } - } - - val addAndroidSdkToLocalProperties by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(GradlePlugin::createLocalPropertiesFile) - runAfter(KotlinPlugin::createModules) - isAvailable = isAndroidContainingProject - withAction { - if (allIRModules.none { it.originalModule.configurator is AndroidModuleConfigurator }) return@withAction UNIT_SUCCESS - val path = AndroidPlugin::androidSdkPath.settingValue - val fileSystemService = service() - GradlePlugin::localProperties.addValues( - "sdk.dir" to fileSystemService.renderPath(path) - ) - } - } + override val path = PATH override val settings: List> = listOf( androidSdkPath @@ -59,4 +29,40 @@ class AndroidPlugin(context: Context) : Plugin(context) { override val pipelineTasks: List = listOf( addAndroidSdkToLocalProperties ) + override val properties: List> = listOf() + + companion object { + private const val PATH = "android" + + val androidSdkPath by pathSetting( + KotlinNewProjectWizardBundle.message("plugin.android.setting.sdk"), + neededAtPhase = GenerationPhase.PROJECT_GENERATION, + PATH + ) { + isSavable = true + isAvailable = isAndroidContainingProject + shouldExists() + } + + private val isAndroidContainingProject = checker { + KotlinPlugin.modules.settingValue + .withAllSubModules(includeSourcesets = true) + .any { it.configurator is AndroidModuleConfigurator } + } + + val addAndroidSdkToLocalProperties by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(GradlePlugin.createLocalPropertiesFile) + runAfter(KotlinPlugin.createModules) + isAvailable = isAndroidContainingProject + withAction { + if (allIRModules.none { it.originalModule.configurator is AndroidModuleConfigurator }) return@withAction UNIT_SUCCESS + val path = androidSdkPath.settingValue + val fileSystemService = service() + GradlePlugin.localProperties.addValues( + "sdk.dir" to fileSystemService.renderPath(path) + ) + } + } + + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/RunConfigurationsPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/RunConfigurationsPlugin.kt index bc035fefb5a..e25ca00e5e3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/RunConfigurationsPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/RunConfigurationsPlugin.kt @@ -10,27 +10,33 @@ import org.jetbrains.kotlin.tools.projectWizard.core.Context import org.jetbrains.kotlin.tools.projectWizard.core.Plugin import org.jetbrains.kotlin.tools.projectWizard.core.UNIT_SUCCESS import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin class RunConfigurationsPlugin(context: Context) : Plugin(context) { - override val path = "runConfigurations" - - val configurations by listProperty() - - val createRunConfigurationsTask by pipelineTask(GenerationPhase.PROJECT_IMPORT) { - runBefore(BuildSystemPlugin::importProject) - - withAction { - service().apply { - addRunConfigurations(RunConfigurationsPlugin::configurations.propertyValue) - } - UNIT_SUCCESS - } - } + override val path = PATH override val settings: List> = emptyList() override val pipelineTasks: List = listOf(createRunConfigurationsTask) + override val properties: List> = listOf(configurations) + + companion object { + private const val PATH = "runConfigurations" + + val configurations by listProperty(PATH) + + val createRunConfigurationsTask by pipelineTask(PATH, GenerationPhase.PROJECT_IMPORT) { + runBefore(BuildSystemPlugin.importProject) + + withAction { + service().apply { + addRunConfigurations(configurations.propertyValue) + } + UNIT_SUCCESS + } + } + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt index 5cda0f9e51d..981995322df 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting @@ -17,58 +18,70 @@ import java.nio.file.Files import java.nio.file.Paths class StructurePlugin(context: Context) : Plugin(context) { - override val path = "structure" + override val path = PATH - val projectPath by pathSetting( - KotlinNewProjectWizardBundle.message("plugin.structure.setting.location"), - GenerationPhase.FIRST_STEP - ) { - defaultValue = value(Paths.get(".")) + companion object { + private const val PATH = "structure" - validateOnProjectCreation = false + private val ALLOWED_SPECIAL_CHARS_IN_GROUP_ID = Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES + '.' + private val ALLOWED_SPECIAL_CHARS_IN_ARTIFACT_ID = Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES + private val ALLOWED_SPECIAL_CHARS_IN_VERSION = setOf('_', '-', '.') - validate { path -> - if (!Files.exists(path)) return@validate ValidationResult.OK - ValidationResult.create(Files.list(path).noneMatch { true }) { - KotlinNewProjectWizardBundle.message("plugin.structure.setting.location.error.is.not.empty") + val projectPath by pathSetting( + KotlinNewProjectWizardBundle.message("plugin.structure.setting.location"), + GenerationPhase.FIRST_STEP, + PATH + ) { + defaultValue = value(Paths.get(".")) + + validateOnProjectCreation = false + + validate { path -> + if (!Files.exists(path)) return@validate ValidationResult.OK + ValidationResult.create(Files.list(path).noneMatch { true }) { + KotlinNewProjectWizardBundle.message("plugin.structure.setting.location.error.is.not.empty") + } } } - } - val name by stringSetting( - KotlinNewProjectWizardBundle.message("plugin.structure.setting.name"), - GenerationPhase.FIRST_STEP - ) { - shouldNotBeBlank() - validate(StringValidators.shouldBeValidIdentifier(title, Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)) - } + val name by stringSetting( + KotlinNewProjectWizardBundle.message("plugin.structure.setting.name"), + GenerationPhase.FIRST_STEP, + PATH + ) { + shouldNotBeBlank() + validate(StringValidators.shouldBeValidIdentifier(title, Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES)) + } - val groupId by stringSetting( - KotlinNewProjectWizardBundle.message("plugin.structure.setting.group.id"), - GenerationPhase.FIRST_STEP - ) { - isSavable = true - shouldNotBeBlank() - validate(StringValidators.shouldBeValidIdentifier(title, ALLOWED_SPECIAL_CHARS_IN_GROUP_ID)) - } - val artifactId by stringSetting( - KotlinNewProjectWizardBundle.message("plugin.structure.setting.artifact.id"), - GenerationPhase.FIRST_STEP - ) { - shouldNotBeBlank() - validate(StringValidators.shouldBeValidIdentifier(title, ALLOWED_SPECIAL_CHARS_IN_ARTIFACT_ID)) - } - val version by stringSetting( - KotlinNewProjectWizardBundle.message("plugin.structure.setting.version"), - GenerationPhase.FIRST_STEP - ) { - shouldNotBeBlank() - validate(StringValidators.shouldBeValidIdentifier(title, ALLOWED_SPECIAL_CHARS_IN_VERSION)) - defaultValue = value("1.0-SNAPSHOT") - } - - val createProjectDir by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - withAction { - service().createDirectory(StructurePlugin::projectPath.reference.settingValue) + val groupId by stringSetting( + KotlinNewProjectWizardBundle.message("plugin.structure.setting.group.id"), + GenerationPhase.FIRST_STEP, + PATH + ) { + isSavable = true + shouldNotBeBlank() + validate(StringValidators.shouldBeValidIdentifier(title, ALLOWED_SPECIAL_CHARS_IN_GROUP_ID)) + } + val artifactId by stringSetting( + KotlinNewProjectWizardBundle.message("plugin.structure.setting.artifact.id"), + GenerationPhase.FIRST_STEP, + PATH + ) { + shouldNotBeBlank() + validate(StringValidators.shouldBeValidIdentifier(title, ALLOWED_SPECIAL_CHARS_IN_ARTIFACT_ID)) + } + val version by stringSetting( + KotlinNewProjectWizardBundle.message("plugin.structure.setting.version"), + GenerationPhase.FIRST_STEP, + PATH + ) { + shouldNotBeBlank() + validate(StringValidators.shouldBeValidIdentifier(title, ALLOWED_SPECIAL_CHARS_IN_VERSION)) + defaultValue = value("1.0-SNAPSHOT") + } + val createProjectDir by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + withAction { + service().createDirectory(StructurePlugin.projectPath.settingValue) + } } } @@ -82,23 +95,18 @@ class StructurePlugin(context: Context) : Plugin(context) { ) override val pipelineTasks: List = listOf(createProjectDir) - - companion object { - private val ALLOWED_SPECIAL_CHARS_IN_GROUP_ID = Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES + '.' - private val ALLOWED_SPECIAL_CHARS_IN_ARTIFACT_ID = Module.ALLOWED_SPECIAL_CHARS_IN_MODULE_NAMES - private val ALLOWED_SPECIAL_CHARS_IN_VERSION = setOf('_', '-', '.') - } + override val properties: List> = listOf() } val Reader.projectPath - get() = StructurePlugin::projectPath.reference.settingValue + get() = StructurePlugin.projectPath.settingValue val Reader.projectName - get() = StructurePlugin::name.reference.settingValue + get() = StructurePlugin.name.settingValue fun Writer.pomIR() = PomIR( - artifactId = StructurePlugin::artifactId.reference.settingValue, - groupId = StructurePlugin::groupId.reference.settingValue, - version = Version.fromString(StructurePlugin::version.reference.settingValue) + artifactId = StructurePlugin.artifactId.settingValue, + groupId = StructurePlugin.groupId.settingValue, + version = Version.fromString(StructurePlugin.version.settingValue) ) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt index 28026f4fa5f..bcf65feacd5 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt @@ -6,9 +6,9 @@ import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.ValidationResult import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting -import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference import org.jetbrains.kotlin.tools.projectWizard.core.service.BuildSystemAvailabilityWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.core.service.ProjectImportingWizardService @@ -27,91 +27,96 @@ import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles abstract class BuildSystemPlugin(context: Context) : Plugin(context) { - override val path = "buildSystem" + override val path = PATH - val type by enumSetting( - KotlinNewProjectWizardBundle.message("plugin.buildsystem.setting.type"), - GenerationPhase.FIRST_STEP - ) { - isSavable = true - filter = { _, type -> - val service = service() - service.isAvailable(type) - } + companion object { + private const val PATH = "buildSystem" - validate { buildSystemType -> - if (!buildSystemType.isGradle - && KotlinPlugin::projectKind.reference.notRequiredSettingValue != ProjectKind.Singleplatform - ) { - val projectKind = KotlinPlugin::projectKind.reference.notRequiredSettingValue?.text?.capitalize() - ?: KotlinNewProjectWizardBundle.message("project") - ValidationResult.ValidationError( - KotlinNewProjectWizardBundle.message( - "plugin.buildsystem.setting.type.error.wrong.project.kind", - projectKind, - buildSystemType.fullText + val type by enumSetting( + KotlinNewProjectWizardBundle.message("plugin.buildsystem.setting.type"), + GenerationPhase.FIRST_STEP, + PATH + ) { + isSavable = true + filter = { _, type -> + val service = service() + service.isAvailable(type) + } + + validate { buildSystemType -> + if (!buildSystemType.isGradle + && KotlinPlugin.projectKind.notRequiredSettingValue != ProjectKind.Singleplatform + ) { + val projectKind = KotlinPlugin.projectKind.notRequiredSettingValue?.text?.capitalize() + ?: KotlinNewProjectWizardBundle.message("project") + ValidationResult.ValidationError( + KotlinNewProjectWizardBundle.message( + "plugin.buildsystem.setting.type.error.wrong.project.kind", + projectKind, + buildSystemType.fullText + ) ) - ) - } else ValidationResult.OK + } else ValidationResult.OK + } } - } - val buildSystemData by property>(emptyList()) + val buildSystemData by property>(PATH, emptyList()) - val buildFiles by listProperty() + val buildFiles by listProperty(PATH) - val pluginRepositoreis by listProperty() + val pluginRepositoreis by listProperty(PATH) - val takeRepositoriesFromDependencies by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(BuildSystemPlugin::createModules) - runAfter(TemplatesPlugin::postApplyTemplatesToModules) + val takeRepositoriesFromDependencies by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(createModules) + runAfter(TemplatesPlugin.postApplyTemplatesToModules) - withAction { - updateBuildFiles { buildFile -> - val dependenciesOfModule = buildList { - buildFile.modules.modules.forEach { module -> - if (module is SingleplatformModuleIR) module.sourcesets.forEach { sourceset -> - +sourceset.irs.filterIsInstance() + withAction { + updateBuildFiles { buildFile -> + val dependenciesOfModule = buildList { + buildFile.modules.modules.forEach { module -> + if (module is SingleplatformModuleIR) module.sourcesets.forEach { sourceset -> + +sourceset.irs.filterIsInstance() + } + +module.irs.filterIsInstance() } - +module.irs.filterIsInstance() } + val repositoriesToAdd = dependenciesOfModule.mapNotNull { dependency -> + dependency.artifact.safeAs()?.repository?.let(::RepositoryIR) + } + buildFile.withIrs(repositoriesToAdd).asSuccess() } - val repositoriesToAdd = dependenciesOfModule.mapNotNull { dependency -> - dependency.artifact.safeAs()?.repository?.let(::RepositoryIR) - } - buildFile.withIrs(repositoriesToAdd).asSuccess() } } - } - val createModules by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(StructurePlugin::createProjectDir) - withAction { - val fileSystem = service() - val data = BuildSystemPlugin::buildSystemData.propertyValue.first { it.type == buildSystemType } - val buildFileData = data.buildFileData ?: return@withAction UNIT_SUCCESS - BuildSystemPlugin::buildFiles.propertyValue.mapSequenceIgnore { buildFile -> - fileSystem.createFile( - buildFile.directoryPath / buildFileData.buildFileName, - buildFileData.createPrinter().printBuildFile { buildFile.render(this) } - ) + val createModules by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(StructurePlugin.createProjectDir) + withAction { + val fileSystem = service() + val data = buildSystemData.propertyValue.first { it.type == buildSystemType } + val buildFileData = data.buildFileData ?: return@withAction UNIT_SUCCESS + buildFiles.propertyValue.mapSequenceIgnore { buildFile -> + fileSystem.createFile( + buildFile.directoryPath / buildFileData.buildFileName, + buildFileData.createPrinter().printBuildFile { buildFile.render(this) } + ) + } } } - } - val importProject by pipelineTask(GenerationPhase.PROJECT_IMPORT) { - runAfter(BuildSystemPlugin::createModules) - withAction { - val data = BuildSystemPlugin::buildSystemData.propertyValue.first { it.type == buildSystemType } - service { service -> service.isSuitableFor(data.type) } - .importProject(this, StructurePlugin::projectPath.reference.settingValue, allIRModules, buildSystemType) + val importProject by pipelineTask(PATH, GenerationPhase.PROJECT_IMPORT) { + runAfter(createModules) + withAction { + val data = buildSystemData.propertyValue.first { it.type == buildSystemType } + service { service -> service.isSuitableFor(data.type) } + .importProject(this, StructurePlugin.projectPath.settingValue, allIRModules, buildSystemType) + } } - } - protected fun addBuildSystemData(data: BuildSystemData) = pipelineTask(GenerationPhase.PREPARE) { - runBefore(BuildSystemPlugin::createModules) - withAction { - BuildSystemPlugin::buildSystemData.addValues(data) + fun addBuildSystemData(prefix: String, data: BuildSystemData) = pipelineTask(prefix, GenerationPhase.PREPARE) { + runBefore(createModules) + withAction { + buildSystemData.addValues(data) + } } } @@ -123,6 +128,11 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { createModules, importProject, ) + override val properties: List> = listOf( + buildSystemData, + buildFiles, + pluginRepositoreis + ) } data class BuildSystemData( @@ -169,12 +179,12 @@ val BuildSystemType.isGradle || this == BuildSystemType.GradleKotlinDsl val Reader.allIRModules - get() = BuildSystemPlugin::buildFiles.propertyValue.flatMap { buildFile -> + get() = BuildSystemPlugin.buildFiles.propertyValue.flatMap { buildFile -> buildFile.modules.modules } val Writer.allModulesPaths - get() = BuildSystemPlugin::buildFiles.propertyValue.flatMap { buildFile -> + get() = BuildSystemPlugin.buildFiles.propertyValue.flatMap { buildFile -> val paths = when (val structure = buildFile.modules) { is MultiplatformModulesStructureIR -> listOf(buildFile.directoryPath) else -> structure.modules.map { it.path } @@ -189,5 +199,5 @@ val Writer.allModulesPaths val Reader.buildSystemType: BuildSystemType - get() = BuildSystemPlugin::type.reference.settingValue + get() = BuildSystemPlugin.type.settingValue diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt index b403934a63f..5e6e86d7015 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/JpsPlugin.kt @@ -1,14 +1,21 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem import org.jetbrains.kotlin.tools.projectWizard.core.Context +import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask class JpsPlugin(context: Context) : BuildSystemPlugin(context) { - override val path = "buildSystem.jps" + override val path = PATH - val addBuildSystemData by addBuildSystemData( - BuildSystemData( - type = BuildSystemType.Jps, - buildFileData = null + companion object { + private const val PATH = "buildSystem.jps" + val addBuildSystemData by addBuildSystemData( + PATH, + BuildSystemData( + type = BuildSystemType.Jps, + buildFileData = null + ) ) - ) + } + + override val pipelineTasks: List = super.pipelineTasks + listOf(addBuildSystemData) } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt index 32f3cabdad2..0407dfdad61 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/MavenPlugin.kt @@ -14,56 +14,61 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles class MavenPlugin(context: Context) : BuildSystemPlugin(context) { - override val path = "buildSystem.maven" + override val path = PATH - private val isMaven = checker { - BuildSystemPlugin::type.settingValue == BuildSystemType.Maven - } + companion object { + private const val PATH = "buildSystem.maven" - val createSettingsFileTask by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createModules) - runBefore(BuildSystemPlugin::createModules) - isAvailable = isMaven - withAction { - BuildSystemPlugin::buildFiles.update { buildFiles -> - if (buildFiles.size == 1) return@update buildFiles.asSuccess() - buildFiles.map { buildFile -> - when (val structure = buildFile.modules) { - is RootFileModuleStructureIR -> { - val dependencies = allModulesPaths.map { path -> - path.joinToString(separator = "/") + private val isMaven = checker { + type.settingValue == BuildSystemType.Maven + } + + val createSettingsFileTask by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createModules) + runBefore(createModules) + isAvailable = isMaven + withAction { + buildFiles.update { buildFiles -> + if (buildFiles.size == 1) return@update buildFiles.asSuccess() + buildFiles.map { buildFile -> + when (val structure = buildFile.modules) { + is RootFileModuleStructureIR -> { + val dependencies = allModulesPaths.map { path -> + path.joinToString(separator = "/") + } + buildFile.copy(modules = structure.withIrs(ModulesDependencyMavenIR(dependencies))) } - buildFile.copy(modules = structure.withIrs(ModulesDependencyMavenIR(dependencies))) + else -> buildFile } - else -> buildFile - } - }.asSuccess() + }.asSuccess() + } } } - } - val addBuildSystemPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createPluginRepositories) - runBefore(BuildSystemPlugin::createModules) - isAvailable = isMaven + val addBuildSystemPluginRepositories by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createPluginRepositories) + runBefore(createModules) + isAvailable = isMaven - withAction { - val repositories = BuildSystemPlugin::pluginRepositoreis.propertyValue - updateBuildFiles { buildFile -> - buildFile.withIrs(repositories.map(::PluginRepositoryMavenIR)).asSuccess() + withAction { + val repositories = pluginRepositoreis.propertyValue + updateBuildFiles { buildFile -> + buildFile.withIrs(repositories.map(::PluginRepositoryMavenIR)).asSuccess() + } } } - } - val addBuildSystemData by addBuildSystemData( - BuildSystemData( - type = BuildSystemType.Maven, - buildFileData = BuildFileData( - createPrinter = { MavenPrinter() }, - buildFileName = "pom.xml" + val addBuildSystemData by addBuildSystemData( + PATH, + BuildSystemData( + type = BuildSystemType.Maven, + buildFileData = BuildFileData( + createPrinter = { MavenPrinter() }, + buildFileName = "pom.xml" + ) ) ) - ) + } override val pipelineTasks: List = super.pipelineTasks + listOf( diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt index caa1779f036..62aa6b90076 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GradlePlugin.kt @@ -4,8 +4,8 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.gradle import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting -import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.reference import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.PluginManagementRepositoryIR @@ -27,111 +27,116 @@ import org.jetbrains.kotlin.tools.projectWizard.templates.FileTemplateDescriptor abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) { - override val path = "buildSystem.gradle" + override val path = PATH - val gradleProperties by listProperty( - "kotlin.code.style" to "official" - ) + companion object { + private const val PATH = "buildSystem.gradle" - val settingsGradleFileIRs by listProperty() + val gradleProperties by listProperty( + PATH, + "kotlin.code.style" to "official" + ) - val createGradlePropertiesFile by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createModules) - runBefore(TemplatesPlugin::renderFileTemplates) - isAvailable = isGradle - withAction { - TemplatesPlugin::addFileTemplate.execute( - FileTemplate( - FileTemplateDescriptor( - "gradle/gradle.properties.vm", - "gradle.properties".asPath() - ), - StructurePlugin::projectPath.settingValue, - mapOf( - "properties" to GradlePlugin::gradleProperties - .propertyValue - .distinctBy { it.first } + val settingsGradleFileIRs by listProperty(PATH) + + val createGradlePropertiesFile by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createModules) + runBefore(TemplatesPlugin.renderFileTemplates) + isAvailable = isGradle + withAction { + TemplatesPlugin.addFileTemplate.execute( + FileTemplate( + FileTemplateDescriptor( + "gradle/gradle.properties.vm", + "gradle.properties".asPath() + ), + StructurePlugin.projectPath.settingValue, + mapOf( + "properties" to gradleProperties + .propertyValue + .distinctBy { it.first } + ) ) ) - ) + } } - } - val localProperties by listProperty>() + val localProperties by listProperty>(PATH) - val createLocalPropertiesFile by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createModules) - runBefore(TemplatesPlugin::renderFileTemplates) - isAvailable = isGradle - withAction { - TemplatesPlugin::addFileTemplate.execute( - FileTemplate( - FileTemplateDescriptor( - "gradle/local.properties.vm", - "local.properties".asPath() - ), - StructurePlugin::projectPath.settingValue, - mapOf( - "properties" to GradlePlugin::localProperties.propertyValue + val createLocalPropertiesFile by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createModules) + runBefore(TemplatesPlugin.renderFileTemplates) + isAvailable = isGradle + withAction { + TemplatesPlugin.addFileTemplate.execute( + FileTemplate( + FileTemplateDescriptor( + "gradle/local.properties.vm", + "local.properties".asPath() + ), + StructurePlugin.projectPath.settingValue, + mapOf( + "properties" to localProperties.propertyValue + ) ) ) - ) + } } - } - private val isGradle = checker { buildSystemType.isGradle } + private val isGradle = checker { buildSystemType.isGradle } - - val initGradleWrapperTask by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(TemplatesPlugin::renderFileTemplates) - isAvailable = isGradle - withAction { - TemplatesPlugin::addFileTemplate.execute( - FileTemplate( - FileTemplateDescriptor( - "gradle/gradle-wrapper.properties.vm", - "gradle" / "wrapper" / "gradle-wrapper.properties" - ), - StructurePlugin::projectPath.reference.settingValue, - mapOf( - "version" to Versions.GRADLE + val initGradleWrapperTask by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(TemplatesPlugin.renderFileTemplates) + isAvailable = isGradle + withAction { + TemplatesPlugin.addFileTemplate.execute( + FileTemplate( + FileTemplateDescriptor( + "gradle/gradle-wrapper.properties.vm", + "gradle" / "wrapper" / "gradle-wrapper.properties" + ), + StructurePlugin.projectPath.settingValue, + mapOf( + "version" to Versions.GRADLE + ) ) ) - ) + } + } + + + val createSettingsFileTask by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createModules) + runAfter(KotlinPlugin.createPluginRepositories) + isAvailable = isGradle + withAction { + val (createBuildFile, buildFileName) = settingsGradleBuildFileData ?: return@withAction UNIT_SUCCESS + + val repositories = buildList { + +pluginRepositoreis.propertyValue.map(::RepositoryIR) + if (isNotEmpty()) { + +RepositoryIR(DefaultRepository.MAVEN_CENTRAL) + +RepositoryIR(DefaultRepository.GRADLE_PLUGIN_PORTAL) + } + }.map(::PluginManagementRepositoryIR) + + val settingsGradleIR = SettingsGradleFileIR( + StructurePlugin.name.settingValue, + allModulesPaths.map { path -> path.joinToString(separator = "") { ":$it" } }, + buildPersistenceList { + +repositories + +settingsGradleFileIRs.propertyValue + } + ) + val buildFileText = createBuildFile().printBuildFile { settingsGradleIR.render(this) } + service().createFile( + projectPath / buildFileName, + buildFileText + ) + } } } - - val createSettingsFileTask by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createModules) - runAfter(KotlinPlugin::createPluginRepositories) - isAvailable = isGradle - withAction { - val (createBuildFile, buildFileName) = settingsGradleBuildFileData ?: return@withAction UNIT_SUCCESS - - val repositories = buildList { - +BuildSystemPlugin::pluginRepositoreis.propertyValue.map(::RepositoryIR) - if (isNotEmpty()) { - +RepositoryIR(DefaultRepository.MAVEN_CENTRAL) - +RepositoryIR(DefaultRepository.GRADLE_PLUGIN_PORTAL) - } - }.map(::PluginManagementRepositoryIR) - - val settingsGradleIR = SettingsGradleFileIR( - StructurePlugin::name.settingValue, - allModulesPaths.map { path -> path.joinToString(separator = "") { ":$it" } }, - buildPersistenceList { - +repositories - +GradlePlugin::settingsGradleFileIRs.propertyValue - } - ) - val buildFileText = createBuildFile().printBuildFile { settingsGradleIR.render(this) } - service().createFile( - projectPath / buildFileName, - buildFileText - ) - } - } override val settings: List> = super.settings override val pipelineTasks: List = super.pipelineTasks + listOf( @@ -140,7 +145,12 @@ abstract class GradlePlugin(context: Context) : BuildSystemPlugin(context) { initGradleWrapperTask, createSettingsFileTask, ) - + override val properties: List> = super.properties + + listOf( + gradleProperties, + settingsGradleFileIRs, + localProperties + ) } val Reader.settingsGradleBuildFileData diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt index eeacd5c638c..a78bdf0a264 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/GroovyDslPlugin.kt @@ -8,17 +8,22 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemT import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter class GroovyDslPlugin(context: Context) : GradlePlugin(context) { - override val path = "buildSystem.gradle.groovyDsl" + override val path = PATH - val addBuildSystemData by addBuildSystemData( - BuildSystemData( - type = BuildSystemType.GradleGroovyDsl, - buildFileData = BuildFileData( - createPrinter = { GradlePrinter(GradlePrinter.GradleDsl.GROOVY) }, - buildFileName = "build.gradle" + companion object { + private const val PATH = "buildSystem.gradle.groovyDsl" + + val addBuildSystemData by addBuildSystemData( + PATH, + BuildSystemData( + type = BuildSystemType.GradleGroovyDsl, + buildFileData = BuildFileData( + createPrinter = { GradlePrinter(GradlePrinter.GradleDsl.GROOVY) }, + buildFileName = "build.gradle" + ) ) ) - ) + } override val pipelineTasks: List = super.pipelineTasks + listOf( diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt index 34d68e7fc31..ba83d0dc859 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/gradle/KotlinDslPlugin.kt @@ -8,17 +8,23 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemT import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter class KotlinDslPlugin(context: Context) : GradlePlugin(context) { - override val path = "buildSystem.gradle.kotlinDsl" + override val path = PATH - val addBuildSystemData by addBuildSystemData( - BuildSystemData( - type = BuildSystemType.GradleKotlinDsl, - buildFileData = BuildFileData( - createPrinter = { GradlePrinter(GradlePrinter.GradleDsl.KOTLIN) }, - buildFileName = "build.gradle.kts" + companion object { + private const val PATH = "buildSystem.gradle.kotlinDsl" + + val addBuildSystemData by addBuildSystemData( + PATH, + BuildSystemData( + type = BuildSystemType.GradleKotlinDsl, + buildFileData = BuildFileData( + createPrinter = { GradlePrinter(GradlePrinter.GradleDsl.KOTLIN) }, + buildFileName = "build.gradle.kts" + ) ) ) - ) + } + override val pipelineTasks: List = super.pipelineTasks + listOf( addBuildSystemData, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt index 4f0e886185b..0f5f847f67a 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/KotlinPlugin.kt @@ -3,10 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.Versions import org.jetbrains.kotlin.tools.projectWizard.core.* -import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask -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.entity.settingValidator +import org.jetbrains.kotlin.tools.projectWizard.core.entity.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.service.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildFileIR @@ -21,128 +18,14 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.pomIR import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* -import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import java.nio.file.Path class KotlinPlugin(context: Context) : Plugin(context) { - override val path = "kotlin" - - val version by property( - // todo do not hardcode kind & repository - WizardKotlinVersion(Versions.KOTLIN, KotlinVersionKind.M, Repositories.KOTLIN_EAP_BINTRAY) - ) - - val initKotlinVersions by pipelineTask(GenerationPhase.PREPARE_GENERATION) { - title = KotlinNewProjectWizardBundle.message("plugin.kotlin.downloading.kotlin.versions") - - withAction { - val version = service().getKotlinVersion() - KotlinPlugin::version.update { version.asSuccess() } - } - } - - val projectKind by enumSetting( - KotlinNewProjectWizardBundle.message("plugin.kotlin.setting.project.kind"), - GenerationPhase.FIRST_STEP - ) - - private fun List.findDuplicatesByName() = - groupingBy { it.name }.eachCount().filter { it.value > 1 } - - val modules by listSetting( - KotlinNewProjectWizardBundle.message("plugin.kotlin.setting.modules"), - GenerationPhase.SECOND_STEP, - Module.parser - ) { - validate { value -> - val allModules = value.withAllSubModules() - val duplicatedModules = allModules.findDuplicatesByName() - if (duplicatedModules.isEmpty()) ValidationResult.OK - else ValidationResult.ValidationError( - KotlinNewProjectWizardBundle.message( - "plugin.kotlin.setting.modules.error.duplicated.modules", - duplicatedModules.values.first(), - duplicatedModules.keys.first() - ) - ) - } - - validate { value -> - value.withAllSubModules().filter { it.kind == ModuleKind.multiplatform }.map { module -> - val duplicatedModules = module.subModules.findDuplicatesByName() - if (duplicatedModules.isEmpty()) ValidationResult.OK - else ValidationResult.ValidationError( - KotlinNewProjectWizardBundle.message( - "plugin.kotlin.setting.modules.error.duplicated.targets", - duplicatedModules.values.first(), - duplicatedModules.keys.first() - ) - ) - }.fold() - } - - validate(moduleDependenciesValidator) - } - - - val createModules by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(BuildSystemPlugin::createModules) - runAfter(StructurePlugin::createProjectDir) - withAction { - BuildSystemPlugin::buildFiles.update { - val modules = KotlinPlugin::modules.settingValue - val (buildFiles) = createBuildFiles(modules) - buildFiles.map { it.withIrs(RepositoryIR(DefaultRepository.MAVEN_CENTRAL)) }.asSuccess() - } - } - } - - val createPluginRepositories by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(BuildSystemPlugin::createModules) - withAction { - val version = KotlinPlugin::version.propertyValue - if (version.kind.isStable) return@withAction UNIT_SUCCESS - val pluginRepository = version.repository - BuildSystemPlugin::pluginRepositoreis.addValues(pluginRepository) andThen - updateBuildFiles { buildFile -> - buildFile.withIrs(RepositoryIR(pluginRepository)).asSuccess() - } - } - } - - val createSourcesetDirectories by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createModules) - withAction { - fun Path.createKotlinAndResourceDirectories(moduleConfigurator: ModuleConfigurator) = with(service()) { - createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.kotlinDirectoryName) andThen - createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.resourcesDirectoryName) - } - - forEachModule { moduleIR -> - moduleIR.sourcesets.mapSequenceIgnore { sourcesetIR -> - sourcesetIR.path.createKotlinAndResourceDirectories(moduleIR.originalModule.configurator) - } - } - } - } - - - private fun Writer.createBuildFiles(modules: List): TaskResult> = - with( - ModulesToIRsConverter( - ModulesToIrConversionData( - modules, - projectPath, - StructurePlugin::name.settingValue, - KotlinPlugin::version.propertyValue, - buildSystemType, - pomIR() - ) - ) - ) { createBuildFiles() } - + override val path = PATH companion object { + private const val PATH = "kotlin" + private val moduleDependenciesValidator = settingValidator> { modules -> val allModules = modules.withAllSubModules(includeSourcesets = true).toSet() val allModulePaths = allModules.map(Module::path).toSet() @@ -162,6 +45,122 @@ class KotlinPlugin(context: Context) : Plugin(context) { } }.fold() } + + val version by property( + PATH, + // todo do not hardcode kind & repository + WizardKotlinVersion(Versions.KOTLIN, KotlinVersionKind.M, Repositories.KOTLIN_EAP_BINTRAY) + ) + + val initKotlinVersions by pipelineTask(PATH, GenerationPhase.PREPARE_GENERATION) { + title = KotlinNewProjectWizardBundle.message("plugin.kotlin.downloading.kotlin.versions") + + withAction { + val version = service().getKotlinVersion() + KotlinPlugin.version.update { version.asSuccess() } + } + } + + val projectKind by enumSetting( + KotlinNewProjectWizardBundle.message("plugin.kotlin.setting.project.kind"), + GenerationPhase.FIRST_STEP, + PATH + ) + + private fun List.findDuplicatesByName() = + groupingBy { it.name }.eachCount().filter { it.value > 1 } + + val modules by listSetting( + KotlinNewProjectWizardBundle.message("plugin.kotlin.setting.modules"), + GenerationPhase.SECOND_STEP, + Module.parser, + PATH + ) { + validate { value -> + val allModules = value.withAllSubModules() + val duplicatedModules = allModules.findDuplicatesByName() + if (duplicatedModules.isEmpty()) ValidationResult.OK + else ValidationResult.ValidationError( + KotlinNewProjectWizardBundle.message( + "plugin.kotlin.setting.modules.error.duplicated.modules", + duplicatedModules.values.first(), + duplicatedModules.keys.first() + ) + ) + } + + validate { value -> + value.withAllSubModules().filter { it.kind == ModuleKind.multiplatform }.map { module -> + val duplicatedModules = module.subModules.findDuplicatesByName() + if (duplicatedModules.isEmpty()) ValidationResult.OK + else ValidationResult.ValidationError( + KotlinNewProjectWizardBundle.message( + "plugin.kotlin.setting.modules.error.duplicated.targets", + duplicatedModules.values.first(), + duplicatedModules.keys.first() + ) + ) + }.fold() + } + + validate(moduleDependenciesValidator) + } + + val createModules by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(BuildSystemPlugin.createModules) + runAfter(StructurePlugin.createProjectDir) + withAction { + BuildSystemPlugin.buildFiles.update { + val modules = modules.settingValue + val (buildFiles) = createBuildFiles(modules) + buildFiles.map { it.withIrs(RepositoryIR(DefaultRepository.MAVEN_CENTRAL)) }.asSuccess() + } + } + } + + val createPluginRepositories by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(BuildSystemPlugin.createModules) + withAction { + val version = version.propertyValue + if (version.kind.isStable) return@withAction UNIT_SUCCESS + val pluginRepository = version.repository + BuildSystemPlugin.pluginRepositoreis.addValues(pluginRepository) andThen + updateBuildFiles { buildFile -> + buildFile.withIrs(RepositoryIR(pluginRepository)).asSuccess() + } + } + } + + val createSourcesetDirectories by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createModules) + withAction { + fun Path.createKotlinAndResourceDirectories(moduleConfigurator: ModuleConfigurator) = + with(service()) { + createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.kotlinDirectoryName) andThen + createDirectory(this@createKotlinAndResourceDirectories / moduleConfigurator.resourcesDirectoryName) + } + + forEachModule { moduleIR -> + moduleIR.sourcesets.mapSequenceIgnore { sourcesetIR -> + sourcesetIR.path.createKotlinAndResourceDirectories(moduleIR.originalModule.configurator) + } + } + } + } + + private fun Writer.createBuildFiles(modules: List): TaskResult> = + with( + ModulesToIRsConverter( + ModulesToIrConversionData( + modules, + projectPath, + StructurePlugin.name.settingValue, + version.propertyValue, + buildSystemType, + pomIR() + ) + ) + ) { createBuildFiles() } } override val settings: List> = @@ -177,6 +176,8 @@ class KotlinPlugin(context: Context) : Plugin(context) { createPluginRepositories, createSourcesetDirectories ) + override val properties: List> = + listOf(version) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt index a4893d2af47..a302c870446 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt @@ -253,9 +253,9 @@ class ModulesToIRsConverter( compute { rootBuildFileIrs += createRootBuildFileIrs(data) runArbitraryTask(data, module, modulePath).ensure() - TemplatesPlugin::addFileTemplates.execute(createTemplates(data, module, modulePath)).ensure() + TemplatesPlugin.addFileTemplates.execute(createTemplates(data, module, modulePath)).ensure() if (this@with is GradleModuleConfigurator) { - GradlePlugin::settingsGradleFileIRs.addValues(createSettingsGradleIRs(module)).ensure() + GradlePlugin.settingsGradleFileIRs.addValues(createSettingsGradleIRs(module)).ensure() } } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt index 322f671d926..2e5a7b97b37 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/projectTemplates/ProjectTemplatesPlugin.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.projectTemplates import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase @@ -11,28 +12,34 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.withAllSubModules import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.ProjectTemplate class ProjectTemplatesPlugin(context: Context) : Plugin(context) { - override val path = "projectTemplates" + override val path = PATH - val template by dropDownSetting( - KotlinNewProjectWizardBundle.message("plugin.templates.setting.template"), - GenerationPhase.INIT_TEMPLATE, - parser = valueParserM { _, _ -> - Failure(ParseError("Project templates is not supported in yaml for now")) + companion object { + const val PATH = "projectTemplates" + + val template by dropDownSetting( + KotlinNewProjectWizardBundle.message("plugin.templates.setting.template"), + GenerationPhase.INIT_TEMPLATE, + parser = valueParserM { _, _ -> + Failure(ParseError("Project templates is not supported in yaml for now")) + }, + PATH + ) { + values = ProjectTemplate.ALL + isRequired = false } - ) { - values = ProjectTemplate.ALL - isRequired = false } override val settings: List> = listOf(template) override val pipelineTasks: List = listOf() + override val properties: List> = listOf() } fun SettingsWriter.applyProjectTemplate(projectTemplate: ProjectTemplate) { projectTemplate.setsValues.forEach { (setting, value) -> setting.setValue(value) } - KotlinPlugin::modules.settingValue.withAllSubModules(includeSourcesets = true).forEach { module -> + KotlinPlugin.modules.settingValue.withAllSubModules(includeSourcesets = true).forEach { module -> module.apply { initDefaultValuesForSettings() } } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ConsoleJvmApplicationTemplatePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ConsoleJvmApplicationTemplatePlugin.kt index 94c11503788..e6f7209ec78 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ConsoleJvmApplicationTemplatePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/ConsoleJvmApplicationTemplatePlugin.kt @@ -1,12 +1,17 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.templates import org.jetbrains.kotlin.tools.projectWizard.core.Context +import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.templates.ConsoleJvmApplicationTemplate class ConsoleJvmApplicationTemplatePlugin(context: Context) : TemplatePlugin(context) { - override val path = "template.consoleJvmApplicationTemplate" + override val path = PATH - val addTemplate by addTemplateTask( - ConsoleJvmApplicationTemplate() - ) + override val pipelineTasks: List = super.pipelineTasks + listOf(addTemplate) + + companion object { + private const val PATH = "template.consoleJvmApplicationTemplate" + + val addTemplate by addTemplateTask(PATH, ConsoleJvmApplicationTemplate()) + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt index 492f475330b..12c3b579f56 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt @@ -5,12 +5,16 @@ import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.templates.SimpleJsClientTemplate class JsTemplatesPlugin(context: Context) : TemplatePlugin(context) { - override val path = "template.jsTemplate" - - val addTemplate by addTemplateTask(SimpleJsClientTemplate()) + override val path = PATH override val pipelineTasks: List = super.pipelineTasks + listOf( addTemplate, ) + + companion object { + private const val PATH = "template.jsTemplates" + + val addTemplate by addTemplateTask(PATH, SimpleJsClientTemplate()) + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/KtorTemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/KtorTemplatesPlugin.kt index 0b366edd2cd..c8b7109a86a 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/KtorTemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/KtorTemplatesPlugin.kt @@ -5,10 +5,16 @@ import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.templates.KtorServerTemplate class KtorTemplatesPlugin(context: Context) : TemplatePlugin(context) { - val addTemplate by addTemplateTask(KtorServerTemplate()) + override val path = PATH override val pipelineTasks: List = super.pipelineTasks + listOf( addTemplate, ) + + companion object { + private const val PATH = "template.ktorTemplates" + + val addTemplate by addTemplateTask(PATH, KtorServerTemplate()) + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt index 839eb392ac6..60dafb385b9 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/NativeConsoleApplicationTemplatePlugin.kt @@ -10,10 +10,16 @@ import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask import org.jetbrains.kotlin.tools.projectWizard.templates.NativeConsoleApplicationTemplate class NativeConsoleApplicationTemplatePlugin(context: Context) : TemplatePlugin(context) { - val addTemplate by addTemplateTask(NativeConsoleApplicationTemplate()) + override val path = PATH override val pipelineTasks: List = super.pipelineTasks + listOf( addTemplate, ) + + companion object { + private const val PATH = "template.nativeConsoleApplicationTemplate" + + val addTemplate by addTemplateTask(PATH, NativeConsoleApplicationTemplate()) + } } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatePlugin.kt index 9cb65d0af0d..4abfcb2be8e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatePlugin.kt @@ -3,19 +3,25 @@ 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.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.templates.Template abstract class TemplatePlugin(context: Context) : Plugin(context) { - override val path = "template" - - fun addTemplateTask(template: Template) = pipelineTask(GenerationPhase.PREPARE) { - withAction { - TemplatesPlugin::addTemplate.execute(template) - } - } + override val path = PATH override val settings: List> = emptyList() override val pipelineTasks: List = emptyList() + override val properties: List> = emptyList() + + companion object { + const val PATH = "template" + + fun addTemplateTask(prefix: String, template: Template) = pipelineTask(prefix, GenerationPhase.PREPARE) { + withAction { + TemplatesPlugin.addTemplate.execute(template) + } + } + } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt index f9a601921fe..f5f6ec7f7f1 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins.templates import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.Defaults.SRC_DIR import org.jetbrains.kotlin.tools.projectWizard.core.entity.PipelineTask +import org.jetbrains.kotlin.tools.projectWizard.core.entity.Property import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.PluginSetting import org.jetbrains.kotlin.tools.projectWizard.core.service.TemplateEngineService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* @@ -23,144 +24,149 @@ import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.settingValue import java.nio.file.Path class TemplatesPlugin(context: Context) : Plugin(context) { - override val path = "templates" + override val path = PATH - val templates by property>( - emptyMap() - ) + companion object { + private const val PATH = "templates" - val addTemplate by task1 { - withAction { template -> - TemplatesPlugin::templates.update { success(it + (template.id to template)) } - } - } + val templates by property>( + PATH, + emptyMap() + ) - val fileTemplatesToRender by property>(emptyList()) - - val addFileTemplate by task1 { - withAction { template -> - TemplatesPlugin::fileTemplatesToRender.update { success(it + template) } - } - } - - val addFileTemplates by task1, Unit> { - withAction { templates -> - TemplatesPlugin::fileTemplatesToRender.addValues(templates) - } - } - - val renderFileTemplates by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runAfter(KotlinPlugin::createModules) - withAction { - val templateEngine = service() - TemplatesPlugin::fileTemplatesToRender.propertyValue.mapSequenceIgnore { template -> - with(templateEngine) { writeTemplate(template) } + val addTemplate by task1(PATH) { + withAction { template -> + templates.update { success(it + (template.id to template)) } } } - } - val addTemplatesToModules by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(BuildSystemPlugin::createModules) - runAfter(KotlinPlugin::createModules) + val fileTemplatesToRender by property>(PATH, emptyList()) - withAction { - updateBuildFiles { buildFile -> - buildFile.modules.modules.mapSequence { module -> - applyTemplateToModule( - module.template, - module - ).map { result -> module.withIrs(result.librariesToAdd) to result } - }.map { - val (moduleIrs, results) = it.unzip() - val foldedResults = results.fold() - buildFile.copy( - modules = buildFile.modules.withModules(moduleIrs) - ).withIrs(foldedResults.irsToAddToBuildFile).let { buildFile -> - when (val structure = buildFile.modules) { - is MultiplatformModulesStructureIR -> - buildFile.copy(modules = structure.updateTargets(foldedResults.updateTarget)) - else -> buildFile + val addFileTemplate by task1(PATH) { + withAction { template -> + fileTemplatesToRender.update { success(it + template) } + } + } + + val addFileTemplates by task1, Unit>(PATH) { + withAction { templates -> + fileTemplatesToRender.addValues(templates) + } + } + + val renderFileTemplates by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runAfter(KotlinPlugin.createModules) + withAction { + val templateEngine = service() + fileTemplatesToRender.propertyValue.mapSequenceIgnore { template -> + with(templateEngine) { writeTemplate(template) } + } + } + } + + val addTemplatesToModules by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(BuildSystemPlugin.createModules) + runAfter(KotlinPlugin.createModules) + + withAction { + updateBuildFiles { buildFile -> + buildFile.modules.modules.mapSequence { module -> + applyTemplateToModule( + module.template, + module + ).map { result -> module.withIrs(result.librariesToAdd) to result } + }.map { + val (moduleIrs, results) = it.unzip() + val foldedResults = results.fold() + buildFile.copy( + modules = buildFile.modules.withModules(moduleIrs) + ).withIrs(foldedResults.irsToAddToBuildFile).let { buildFile -> + when (val structure = buildFile.modules) { + is MultiplatformModulesStructureIR -> + buildFile.copy(modules = structure.updateTargets(foldedResults.updateTarget)) + else -> buildFile + } } } } } } - } - val postApplyTemplatesToModules by pipelineTask(GenerationPhase.PROJECT_GENERATION) { - runBefore(BuildSystemPlugin::createModules) - runAfter(KotlinPlugin::createModules) - runAfter(TemplatesPlugin::addTemplatesToModules) + val postApplyTemplatesToModules by pipelineTask(PATH, GenerationPhase.PROJECT_GENERATION) { + runBefore(BuildSystemPlugin.createModules) + runAfter(KotlinPlugin.createModules) + runAfter(TemplatesPlugin.addTemplatesToModules) - withAction { - updateBuildFiles { buildFile -> - val modules = buildFile.modules.modules + withAction { + updateBuildFiles { buildFile -> + val modules = buildFile.modules.modules - val applicationState = modules.mapNotNull { module -> - module.template?.createInterceptors(module) - }.flatten() - .applyAll(TemplateInterceptionApplicationState(buildFile, emptyMap())) + val applicationState = modules.mapNotNull { module -> + module.template?.createInterceptors(module) + }.flatten() + .applyAll(TemplateInterceptionApplicationState(buildFile, emptyMap())) - val templateEngine = service() + val templateEngine = service() - val templatesApplicationResult = modules.map { module -> - val settings = applicationState.moduleToSettings[module.originalModule.identificator].orEmpty() - applyFileTemplatesFromSourceset(module, templateEngine, settings) - }.sequenceIgnore() + val templatesApplicationResult = modules.map { module -> + val settings = applicationState.moduleToSettings[module.originalModule.identificator].orEmpty() + applyFileTemplatesFromSourceset(module, templateEngine, settings) + }.sequenceIgnore() - templatesApplicationResult andThen applicationState.buildFileIR.asSuccess() - } - } - } - - private fun Writer.applyFileTemplatesFromSourceset( - module: ModuleIR, - templateEngine: TemplateEngineService, - interceptionPointSettings: Map, Any> - ): TaskResult { - val template = module.template ?: return UNIT_SUCCESS - val settings = with(template) { settingsAsMap(module.originalModule) } - val allSettings: Map = mutableMapOf().apply { - putAll(settings) - putAll(interceptionPointSettings.mapKeys { it.key.name }) - putAll(defaultSettings(module)) - } - return with(template) { getFileTemplates(module) }.mapNotNull { (fileTemplateDescriptor, filePath) -> - val path = generatePathForFileTemplate(module, filePath) ?: return@mapNotNull null - val fileTemplate = FileTemplate( - fileTemplateDescriptor, - module.path / path, - allSettings - ) - with(templateEngine) { writeTemplate(fileTemplate) } - }.sequenceIgnore() - } - - private fun Reader.defaultSettings(moduleIR: ModuleIR) = mapOf( - "projectName" to projectName, - "moduleName" to moduleIR.name - ) - - private fun Reader.generatePathForFileTemplate(module: ModuleIR, filePath: FilePath): Path? { - if (filePath is SrcFilePath - && filePath.sourcesetType == SourcesetType.test - && settingValue(module.originalModule, ModuleConfiguratorWithTests.testFramework)?.isPresent != true - ) return null - val moduleConfigurator = module.originalModule.configurator - return when (module) { - is SingleplatformModuleIR -> { - when (filePath) { - is SrcFilePath -> SRC_DIR / filePath.sourcesetType.toString() / moduleConfigurator.kotlinDirectoryName - is ResourcesFilePath -> SRC_DIR / filePath.sourcesetType.toString() / moduleConfigurator.resourcesDirectoryName + templatesApplicationResult andThen applicationState.buildFileIR.asSuccess() } } + } - is MultiplatformModuleIR -> { - val directory = when (filePath) { - is SrcFilePath -> moduleConfigurator.kotlinDirectoryName - is ResourcesFilePath -> moduleConfigurator.resourcesDirectoryName + private fun Writer.applyFileTemplatesFromSourceset( + module: ModuleIR, + templateEngine: TemplateEngineService, + interceptionPointSettings: Map, Any> + ): TaskResult { + val template = module.template ?: return UNIT_SUCCESS + val settings = with(template) { settingsAsMap(module.originalModule) } + val allSettings: Map = mutableMapOf().apply { + putAll(settings) + putAll(interceptionPointSettings.mapKeys { it.key.name }) + putAll(defaultSettings(module)) + } + return with(template) { getFileTemplates(module) }.mapNotNull { (fileTemplateDescriptor, filePath) -> + val path = generatePathForFileTemplate(module, filePath) ?: return@mapNotNull null + val fileTemplate = FileTemplate( + fileTemplateDescriptor, + module.path / path, + allSettings + ) + with(templateEngine) { writeTemplate(fileTemplate) } + }.sequenceIgnore() + } + + private fun Reader.defaultSettings(moduleIR: ModuleIR) = mapOf( + "projectName" to projectName, + "moduleName" to moduleIR.name + ) + + private fun Reader.generatePathForFileTemplate(module: ModuleIR, filePath: FilePath): Path? { + if (filePath is SrcFilePath + && filePath.sourcesetType == SourcesetType.test + && settingValue(module.originalModule, ModuleConfiguratorWithTests.testFramework)?.isPresent != true + ) return null + val moduleConfigurator = module.originalModule.configurator + return when (module) { + is SingleplatformModuleIR -> { + when (filePath) { + is SrcFilePath -> SRC_DIR / filePath.sourcesetType.toString() / moduleConfigurator.kotlinDirectoryName + is ResourcesFilePath -> SRC_DIR / filePath.sourcesetType.toString() / moduleConfigurator.resourcesDirectoryName + } + } + + is MultiplatformModuleIR -> { + val directory = when (filePath) { + is SrcFilePath -> moduleConfigurator.kotlinDirectoryName + is ResourcesFilePath -> moduleConfigurator.resourcesDirectoryName + } + SRC_DIR / "${module.name}${filePath.sourcesetType.name.capitalize()}" / directory } - SRC_DIR / "${module.name}${filePath.sourcesetType.name.capitalize()}" / directory } } } @@ -172,4 +178,9 @@ class TemplatesPlugin(context: Context) : Plugin(context) { addTemplatesToModules, postApplyTemplatesToModules ) + override val properties: List> = + listOf( + templates, + fileTemplatesToRender + ) } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index 6124d14d4e0..4b8eeb32dd5 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -27,7 +27,7 @@ sealed class ProjectTemplate : DisplayableSettingItem { abstract val id: String private val setsDefaultValues: List> - get() = listOf(KotlinPlugin::projectKind.reference withValue projectKind) + get() = listOf(KotlinPlugin.projectKind.reference withValue projectKind) protected open val setsPluginSettings: List> = emptyList() protected open val setsModules: List = emptyList() @@ -36,7 +36,7 @@ sealed class ProjectTemplate : DisplayableSettingItem { val setsValues: List> get() = buildList { setsModules.takeIf { it.isNotEmpty() }?.let { modules -> - +(KotlinPlugin::modules withValue modules) + +(KotlinPlugin.modules.reference withValue modules) } +setsDefaultValues +setsPluginSettings @@ -123,10 +123,6 @@ data class SettingWithValue>(val setting: SettingRef infix fun > PluginSettingReference.withValue(value: V): SettingWithValue = SettingWithValue(this, value) -inline infix fun > PluginSettingPropertyReference.withValue( - value: V -): SettingWithValue = reference.withValue(value) - private fun createDefaultSourcesets() = SourcesetType.values().map { sourcesetType -> Sourceset( @@ -150,7 +146,7 @@ object BackendApplicationProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( SingleplatformModule("mainModule", createDefaultSourcesets()) ) ) @@ -167,7 +163,7 @@ object MultiplatformApplicationProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( MultiplatformModule("mainModule", listOf(ModuleType.common.createDefaultTarget())) ) ) @@ -184,7 +180,7 @@ object ConsoleApplicationProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( SingleplatformModule( "consoleApp", createDefaultSourcesets() @@ -206,7 +202,7 @@ object MultiplatformLibraryProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( MultiplatformModule( "library", listOf( @@ -231,7 +227,7 @@ object FullStackWebApplicationProjectTemplate : ProjectTemplate() { override val suggestedProjectName: String = "myFullStackApplication" override val projectKind: ProjectKind = ProjectKind.Multiplatform override val setsPluginSettings: List> = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( MultiplatformModule( "application", listOf( @@ -261,7 +257,7 @@ object NativeApplicationProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( Module( "app", MppModuleConfigurator, @@ -288,7 +284,7 @@ object FrontendApplicationProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( Module( "frontend", BrowserJsSinglePlatformModuleConfigurator, @@ -365,7 +361,7 @@ object MultiplatformMobileLibraryProjectTemplate : ProjectTemplate() { override val setsPluginSettings: List> get() = listOf( - KotlinPlugin::modules withValue listOf( + KotlinPlugin.modules.reference withValue listOf( MultiplatformModule( "library", listOf( diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt index 015dad88713..22ff0278325 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/ModuleDependency.kt @@ -87,7 +87,7 @@ sealed class ModuleDependencyType( IOSSinglePlatformModuleConfigurator.dependentModule.reference .setValue(IOSSinglePlatformModuleConfigurator.DependentModuleReference(to)) val dummyFilePath = Defaults.SRC_DIR / "${to.iosTargetSafe()!!.name}Main" / to.configurator.kotlinDirectoryName / "dummyFile.kt" - TemplatesPlugin::addFileTemplate.execute( + TemplatesPlugin.addFileTemplate.execute( FileTemplate( FileTemplateDescriptor("ios/dummyFile.kt", dummyFilePath), projectPath / toModulePath diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt index 311e2761532..83d9ff557f3 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Sourceset.kt @@ -85,7 +85,7 @@ enum class SourcesetType : DisplayableSettingItem { fun Writer.updateBuildFiles(action: (BuildFileIR) -> TaskResult): TaskResult = - BuildSystemPlugin::buildFiles.update { buildFiles -> + BuildSystemPlugin.buildFiles.update { buildFiles -> buildFiles.mapSequence(action) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt index b62c96b2a35..c92ce48b8ce 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/KtorServerTemplate.kt @@ -41,13 +41,13 @@ class KtorServerTemplate : Template() { override fun Writer.getRequiredLibraries(module: ModuleIR): List = withSettingsOf(module.originalModule) { - val kotlinVersion = KotlinPlugin::version.propertyValue.version + val kotlinVersion = KotlinPlugin.version.propertyValue.version buildList { +ktorArtifactDependency(serverEngine.reference.settingValue.dependencyName, kotlinVersion) +ktorArtifactDependency("ktor-html-builder", kotlinVersion) +ArtifactBasedLibraryDependencyIR( MavenArtifact(Repositories.KOTLINX, "org.jetbrains.kotlinx", "kotlinx-html-jvm"), - Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin::version.propertyValue.version), + Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin.version.propertyValue.version), DependencyType.MAIN ) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt index 8df6f385ba5..15ba58d8edd 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt @@ -81,11 +81,11 @@ class SimpleJsClientTemplate : Template() { buildList { +ArtifactBasedLibraryDependencyIR( MavenArtifact(Repositories.KOTLINX, "org.jetbrains.kotlinx", "kotlinx-html-js"), - Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin::version.propertyValue.version), + Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin.version.propertyValue.version), DependencyType.MAIN ) - val kotlinVersion = KotlinPlugin::version.propertyValue + val kotlinVersion = KotlinPlugin.version.propertyValue if (renderEngine.reference.settingValue != RenderEngine.KOTLINX_HTML) { +Dependencies.KOTLIN_REACT(kotlinVersion.version) +Dependencies.KOTLIN_REACT_DOM(kotlinVersion.version) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt index d046eeedb07..82818845527 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt @@ -66,6 +66,7 @@ fun > Reader.settingValue(module: Module, setting: T abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSettingItem { final override fun > settingDelegate( + prefix: String, create: (path: String) -> SettingBuilder ): ReadOnlyProperty> = cached { name -> TemplateSetting(create(name).buildInternal()) @@ -126,7 +127,7 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet else -> idFunction() } - RunConfigurationsPlugin::configurations.addValues(createRunConfigurations(module)) + RunConfigurationsPlugin.configurations.addValues(createRunConfigurations(module)) val result = TemplateApplicationResult(librariesToAdd, irsToAddToBuildFile, targetsUpdater) return result.asSuccess() @@ -144,7 +145,7 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet private fun Reader.createDefaultSettings() = mapOf( - "projectName" to StructurePlugin::name.settingValue.capitalize() + "projectName" to StructurePlugin.name.settingValue.capitalize() ) override fun equals(other: Any?): Boolean = @@ -157,12 +158,14 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String, init: DropDownSettingType.Builder.() -> Unit ): ReadOnlyProperty>> = super.dropDownSetting( title, neededAtPhase, parser, + prefix, init ) as ReadOnlyProperty>> @@ -170,11 +173,13 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet final override fun stringSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: StringSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.stringSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -182,11 +187,13 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet final override fun booleanSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: BooleanSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.booleanSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -195,12 +202,14 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String, init: ValueSettingType.Builder.() -> Unit ): ReadOnlyProperty>> = super.valueSetting( title, neededAtPhase, parser, + prefix, init ) as ReadOnlyProperty>> @@ -208,11 +217,13 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet final override fun versionSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: VersionSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.versionSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -221,12 +232,14 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet title: String, neededAtPhase: GenerationPhase, parser: Parser, + prefix: String, init: ListSettingType.Builder.() -> Unit ): ReadOnlyProperty, ListSettingType>> = super.listSetting( title, neededAtPhase, parser, + prefix, init ) as ReadOnlyProperty, ListSettingType>> @@ -235,11 +248,13 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet final override fun pathSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String, init: PathSettingType.Builder.() -> Unit ): ReadOnlyProperty> = super.pathSetting( title, neededAtPhase, + prefix, init ) as ReadOnlyProperty> @@ -247,9 +262,10 @@ abstract class Template : SettingsOwner, EntitiesOwnerDescriptor, DisplayableSet inline fun enumSetting( title: String, neededAtPhase: GenerationPhase, + prefix: String = "", crossinline init: DropDownSettingType.Builder.() -> Unit = {} ): ReadOnlyProperty>> where E : Enum, E : DisplayableSettingItem = - enumSettingImpl(title, neededAtPhase, init) as ReadOnlyProperty>> + enumSettingImpl(title, neededAtPhase, prefix, init) as ReadOnlyProperty>> companion object { fun parser(templateId: Identificator): Parser