From 0a4d45b3470795240188c45700a587ee2eece60d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 22 Jan 2020 19:37:30 +0300 Subject: [PATCH] Wizard: add support of creating run configurations #KT-36043 fixed --- .../service/IdeaRunConfigurationsService.kt | 45 +++++++++++++++++++ .../wizard/service/IdeaWizardService.kt | 3 +- .../projectWizard/IdeaRunConfiguration.kt | 16 +++++++ .../BuildSystemAvailabilityWizardService.kt | 4 ++ .../core/service/RunConfigurationsService.kt | 17 +++++++ .../core/service/WizardService.kt | 3 +- .../tools/projectWizard/plugins/Plugins.kt | 1 + .../plugins/RunConfigurationsPlugin.kt | 29 ++++++++++++ .../templates/SimpleJsClientTemplate.kt | 26 ++++++++--- .../tools/projectWizard/templates/Template.kt | 11 ++++- 10 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaRunConfigurationsService.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/IdeaRunConfiguration.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/RunConfigurationsService.kt create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/RunConfigurationsPlugin.kt diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaRunConfigurationsService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaRunConfigurationsService.kt new file mode 100644 index 00000000000..4cb73e70360 --- /dev/null +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaRunConfigurationsService.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.wizard.service + +import com.intellij.execution.RunManager +import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfiguration +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration +import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext +import org.jetbrains.kotlin.tools.projectWizard.core.service.RunConfigurationsService +import org.jetbrains.kotlin.tools.projectWizard.core.service.isBuildSystemAvailable +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType +import org.jetbrains.plugins.gradle.service.execution.GradleExternalTaskConfigurationType + +class IdeaRunConfigurationsService(private val project: Project) : RunConfigurationsService, IdeaWizardService { + override fun ValuesReadingContext.addRunConfigurations(configurations: List) { + configurations.forEach { wizardConfiguration -> + if (wizardConfiguration is WizardGradleRunConfiguration && isBuildSystemAvailable(BuildSystemType.GradleKotlinDsl)) { + addGradleRunConfiguration(wizardConfiguration) + } + } + } + + private fun addGradleRunConfiguration(wizardConfiguration: WizardGradleRunConfiguration) { + val runManager = RunManager.getInstance(project) + val configurationFactory = GradleExternalTaskConfigurationType().configurationFactories[0] + val ideaConfiguration = runManager.createConfiguration(wizardConfiguration.configurationName, configurationFactory) + val runConfiguration = ideaConfiguration.configuration + if (runConfiguration is ExternalSystemRunConfiguration) { + runConfiguration.settings.apply { + taskNames = listOf(wizardConfiguration.taskName) + scriptParameters = wizardConfiguration.parameters.joinToString(separator = " ") + externalProjectPath = project.basePath + } + runManager.apply { + addConfiguration(ideaConfiguration) + selectedConfiguration = ideaConfiguration + } + } + } +} \ No newline at end of file diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt index b2dae576c5f..9bfd45c4e44 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/service/IdeaWizardService.kt @@ -23,7 +23,8 @@ object IdeaServices { IdeaGradleWizardService(project), IdeaMavenWizardService(project), IdeaJpsWizardService(project, model), - IdeaFileFormattingService(project) + IdeaFileFormattingService(project), + IdeaRunConfigurationsService(project) ) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/IdeaRunConfiguration.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/IdeaRunConfiguration.kt new file mode 100644 index 00000000000..794621ca977 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/IdeaRunConfiguration.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard + +interface WizardRunConfiguration { + val configurationName: String +} + +data class WizardGradleRunConfiguration( + override val configurationName: String, + val taskName: String, + val parameters: List +) : WizardRunConfiguration \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt index c6813857dac..beef40683e5 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/BuildSystemAvailabilityWizardService.kt @@ -5,12 +5,16 @@ package org.jetbrains.kotlin.tools.projectWizard.core.service +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType interface BuildSystemAvailabilityWizardService : WizardService { fun isAvailable(buildSystemType: BuildSystemType): Boolean } +fun ValuesReadingContext.isBuildSystemAvailable(buildSystemType: BuildSystemType) = + service()!!.isAvailable(buildSystemType) + class BuildSystemAvailabilityWizardServiceImpl : BuildSystemAvailabilityWizardService, IdeaIndependentWizardService { override fun isAvailable(buildSystemType: BuildSystemType) = true } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/RunConfigurationsService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/RunConfigurationsService.kt new file mode 100644 index 00000000000..7e9f44432f9 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/RunConfigurationsService.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.core.service + +import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration +import org.jetbrains.kotlin.tools.projectWizard.core.ValuesReadingContext + +interface RunConfigurationsService : WizardService { + fun ValuesReadingContext.addRunConfigurations(configurations: List) +} + +class RunConfigurationsServiceImpl : RunConfigurationsService, IdeaIndependentWizardService { + override fun ValuesReadingContext.addRunConfigurations(configurations: List) = Unit +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt index 5c9752aacfe..db30e9176e1 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/core/service/WizardService.kt @@ -10,7 +10,8 @@ object Services { OsFileSystemWizardService(), BuildSystemAvailabilityWizardServiceImpl(), DummyFileFormattingService(), - KotlinVersionProviderServiceImpl() + KotlinVersionProviderServiceImpl(), + RunConfigurationsServiceImpl() ) } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt index 3b8793775ff..17d0bbe11e2 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/Plugins.kt @@ -22,6 +22,7 @@ object Plugins { KotlinPlugin(context), TemplatesPlugin(context), ProjectTemplatesPlugin(context), + RunConfigurationsPlugin(context), // templates ConsoleJvmApplicationTemplatePlugin(context), 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 new file mode 100644 index 00000000000..67ab971316d --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/RunConfigurationsPlugin.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.tools.projectWizard.plugins + +import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration +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.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) { + val configurations by listProperty() + + val createRunConfigurationsTask by pipelineTask(GenerationPhase.PROJECT_IMPORT) { + runBefore(BuildSystemPlugin::importProject) + + withAction { + service()!!.apply { + addRunConfigurations(RunConfigurationsPlugin::configurations.propertyValue) + } + UNIT_SUCCESS + } + } +} \ No newline at end of file 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 9d2b26eb41e..4792d09f47c 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 @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.tools.projectWizard.templates -import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext -import org.jetbrains.kotlin.tools.projectWizard.core.asPath -import org.jetbrains.kotlin.tools.projectWizard.core.buildList +import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration +import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration +import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting import org.jetbrains.kotlin.tools.projectWizard.core.safeAs import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* @@ -20,10 +20,7 @@ import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem -import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository -import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module -import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories -import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate @@ -43,6 +40,21 @@ class SimpleJsClientTemplate : Template() { override val settings: List> = listOf(renderEngine) + override fun ValuesReadingContext.createRunConfigurations(module: ModuleIR): List = buildList { + if (module.originalModule.kind == ModuleKind.singleplatformJs) { + +WizardGradleRunConfiguration( + "BrowserDevelopmentRun in continuous mode", + "browserDevelopmentRun", + listOf("--continuous") + ) + +WizardGradleRunConfiguration( + "BrowserProductionRun in continuous mode", + "browserProductionRun", + listOf("--continuous") + ) + } + } + override fun TaskRunningContext.getRequiredLibraries(module: ModuleIR): List = withSettingsOf(module.originalModule) { buildList { +ArtifactBasedLibraryDependencyIR( 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 a8b94ba1741..e6b206efa00 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 @@ -2,11 +2,16 @@ package org.jetbrains.kotlin.tools.projectWizard.templates import org.jetbrains.kotlin.tools.projectWizard.Identificator import org.jetbrains.kotlin.tools.projectWizard.SettingsOwner +import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.* -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.MultiplatformModuleIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.plugins.RunConfigurationsPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.StructurePlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem @@ -91,6 +96,8 @@ abstract class Template : SettingsOwner { open fun createInterceptors(module: ModuleIR): List = emptyList() + open fun ValuesReadingContext.createRunConfigurations(module: ModuleIR): List = emptyList() + fun TaskRunningContext.applyToSourceset( module: ModuleIR ): TaskResult { @@ -105,6 +112,8 @@ abstract class Template : SettingsOwner { else -> idFunction() } + RunConfigurationsPlugin::configurations.addValues(createRunConfigurations(module)) + val result = TemplateApplicationResult(librariesToAdd, irsToAddToBuildFile, targetsUpdater) return result.asSuccess() }