Wizard: add support of creating run configurations

#KT-36043 fixed
This commit is contained in:
Ilya Kirillov
2020-01-22 19:37:30 +03:00
parent d330652eee
commit 0a4d45b347
10 changed files with 145 additions and 10 deletions
@@ -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<WizardRunConfiguration>) {
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
}
}
}
}
@@ -23,7 +23,8 @@ object IdeaServices {
IdeaGradleWizardService(project),
IdeaMavenWizardService(project),
IdeaJpsWizardService(project, model),
IdeaFileFormattingService(project)
IdeaFileFormattingService(project),
IdeaRunConfigurationsService(project)
)
}
@@ -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<String>
) : WizardRunConfiguration
@@ -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<BuildSystemAvailabilityWizardService>()!!.isAvailable(buildSystemType)
class BuildSystemAvailabilityWizardServiceImpl : BuildSystemAvailabilityWizardService, IdeaIndependentWizardService {
override fun isAvailable(buildSystemType: BuildSystemType) = true
}
@@ -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<WizardRunConfiguration>)
}
class RunConfigurationsServiceImpl : RunConfigurationsService, IdeaIndependentWizardService {
override fun ValuesReadingContext.addRunConfigurations(configurations: List<WizardRunConfiguration>) = Unit
}
@@ -10,7 +10,8 @@ object Services {
OsFileSystemWizardService(),
BuildSystemAvailabilityWizardServiceImpl(),
DummyFileFormattingService(),
KotlinVersionProviderServiceImpl()
KotlinVersionProviderServiceImpl(),
RunConfigurationsServiceImpl()
)
}
@@ -22,6 +22,7 @@ object Plugins {
KotlinPlugin(context),
TemplatesPlugin(context),
ProjectTemplatesPlugin(context),
RunConfigurationsPlugin(context),
// templates
ConsoleJvmApplicationTemplatePlugin(context),
@@ -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<WizardRunConfiguration>()
val createRunConfigurationsTask by pipelineTask(GenerationPhase.PROJECT_IMPORT) {
runBefore(BuildSystemPlugin::importProject)
withAction {
service<RunConfigurationsService>()!!.apply {
addRunConfigurations(RunConfigurationsPlugin::configurations.propertyValue)
}
UNIT_SUCCESS
}
}
}
@@ -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<TemplateSetting<*, *>> = listOf(renderEngine)
override fun ValuesReadingContext.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = 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<DependencyIR> = withSettingsOf(module.originalModule) {
buildList {
+ArtifactBasedLibraryDependencyIR(
@@ -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<TemplateInterceptor> = emptyList()
open fun ValuesReadingContext.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = emptyList()
fun TaskRunningContext.applyToSourceset(
module: ModuleIR
): TaskResult<TemplateApplicationResult> {
@@ -105,6 +112,8 @@ abstract class Template : SettingsOwner {
else -> idFunction()
}
RunConfigurationsPlugin::configurations.addValues(createRunConfigurations(module))
val result = TemplateApplicationResult(librariesToAdd, irsToAddToBuildFile, targetsUpdater)
return result.asSuccess()
}