diff --git a/src/main/kotlin/org/rust/cargo/runconfig/CargoTestCommandRunner.kt b/src/main/kotlin/org/rust/cargo/runconfig/CargoTestCommandRunner.kt index 39b24a8afd7..f7ec7233634 100644 --- a/src/main/kotlin/org/rust/cargo/runconfig/CargoTestCommandRunner.kt +++ b/src/main/kotlin/org/rust/cargo/runconfig/CargoTestCommandRunner.kt @@ -21,6 +21,7 @@ import org.jetbrains.concurrency.AsyncPromise import org.jetbrains.concurrency.Promise import org.rust.cargo.runconfig.buildtool.CargoBuildManager.getBuildConfiguration import org.rust.cargo.runconfig.buildtool.CargoBuildManager.isBuildToolWindowEnabled +import org.rust.cargo.runconfig.buildtool.isActivateToolWindowBeforeRun import org.rust.cargo.runconfig.command.CargoCommandConfiguration import org.rust.openapiext.saveAllDocuments @@ -57,8 +58,7 @@ class CargoTestCommandRunner : AsyncProgramRunner() { } val exitCode = AsyncPromise() - val activateToolWindow = environment.runnerAndConfigurationSettings?.isActivateToolWindowBeforeRun == true - if (activateToolWindow) { + if (environment.isActivateToolWindowBeforeRun) { RunContentExecutor(environment.project, buildProcessHandler) .apply { createFilters(state.cargoProject).forEach { withFilter(it) } } .withAfterCompletion { exitCode.setResult(buildProcessHandler.exitCode) } diff --git a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildAdapter.kt b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildAdapter.kt index 2f7edd4f13a..fb0ba636443 100644 --- a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildAdapter.kt +++ b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildAdapter.kt @@ -5,6 +5,7 @@ package org.rust.cargo.runconfig.buildtool +import com.intellij.build.BuildContentDescriptor import com.intellij.build.BuildProgressListener import com.intellij.build.DefaultBuildDescriptor import com.intellij.build.events.impl.* @@ -26,6 +27,7 @@ import com.intellij.openapi.util.text.StringUtil.convertLineSeparators import com.intellij.openapi.vfs.VfsUtil import org.rust.cargo.CargoConstants import org.rust.cargo.runconfig.createFilters +import javax.swing.JComponent @Suppress("UnstableApiUsage") class CargoBuildAdapter( @@ -42,16 +44,19 @@ class CargoBuildAdapter( init { val processHandler = checkNotNull(context.processHandler) { "Process handler can't be null" } context.environment.notifyProcessStarted(processHandler) - val descriptor = DefaultBuildDescriptor( - context.buildId, - "Run Cargo command", - context.workingDirectory.toString(), - context.started - ) - val buildStarted = StartBuildEventImpl(descriptor, "${context.taskName} running...") - .withExecutionFilters(*createFilters(context.cargoProject).toTypedArray()) + + val buildContentDescriptor = BuildContentDescriptor(null, null, object : JComponent() {}, "Build") + val activateToolWindow = context.environment.isActivateToolWindowBeforeRun + buildContentDescriptor.isActivateToolWindowWhenAdded = activateToolWindow + buildContentDescriptor.isActivateToolWindowWhenFailed = activateToolWindow + + val descriptor = DefaultBuildDescriptor(context.buildId, "Run Cargo command", context.workingDirectory.toString(), context.started) + .withContentDescriptor { buildContentDescriptor } .withRestartAction(createRerunAction(processHandler, context.environment)) .withRestartAction(createStopAction(processHandler)) + .apply { createFilters(context.cargoProject).forEach { withExecutionFilter(it) } } + + val buildStarted = StartBuildEventImpl(descriptor, "${context.taskName} running...") buildProgressListener.onEvent(context.buildId, buildStarted) } diff --git a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildManager.kt b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildManager.kt index d10d441c7a2..ec0b5420a5e 100644 --- a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildManager.kt +++ b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/CargoBuildManager.kt @@ -110,7 +110,9 @@ object CargoBuildManager { @Suppress("UsePropertyAccessSyntax") val buildToolWindow = BuildContentManager.getInstance(project).getOrCreateToolWindow() buildToolWindow.setAvailable(true, null) - buildToolWindow.show(null) + if (environment.isActivateToolWindowBeforeRun) { + buildToolWindow.activate(null) + } } processHandler = state.startProcess(processColors = false) @@ -233,14 +235,20 @@ object CargoBuildManager { return buildConfiguration } - fun createBuildEnvironment(buildConfiguration: CargoCommandConfiguration): ExecutionEnvironment? { + fun createBuildEnvironment( + buildConfiguration: CargoCommandConfiguration, + environment: ExecutionEnvironment? = null + ): ExecutionEnvironment? { require(isBuildConfiguration(buildConfiguration)) val project = buildConfiguration.project val runManager = RunManager.getInstance(project) as? RunManagerImpl ?: return null val executor = ExecutorRegistry.getInstance().getExecutorById(DefaultRunExecutor.EXECUTOR_ID) ?: return null val runner = ProgramRunner.findRunnerById(CargoCommandRunner.RUNNER_ID) ?: return null val settings = RunnerAndConfigurationSettingsImpl(runManager, buildConfiguration) - return ExecutionEnvironment(executor, runner, settings, project) + settings.isActivateToolWindowBeforeRun = environment.isActivateToolWindowBeforeRun + val buildEnvironment = ExecutionEnvironment(executor, runner, settings, project) + environment?.copyUserDataTo(buildEnvironment) + return buildEnvironment } fun showBuildNotification( diff --git a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/RsBuildTaskProvider.kt b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/RsBuildTaskProvider.kt index 89d7eaa1b61..0c9f7c17d82 100644 --- a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/RsBuildTaskProvider.kt +++ b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/RsBuildTaskProvider.kt @@ -22,9 +22,7 @@ abstract class RsBuildTaskProvider> : Befor override fun isSingleton(): Boolean = true protected fun doExecuteTask(buildConfiguration: CargoCommandConfiguration, environment: ExecutionEnvironment): Boolean { - val buildEnvironment = createBuildEnvironment(buildConfiguration) - ?.also { environment.copyUserDataTo(it) } - ?: return false + val buildEnvironment = createBuildEnvironment(buildConfiguration, environment) ?: return false val buildableElement = CargoBuildConfiguration(buildConfiguration, buildEnvironment) val result = CompletableFuture() diff --git a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/Utils.kt b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/Utils.kt index cf4bb0c670b..04a953747ce 100644 --- a/src/main/kotlin/org/rust/cargo/runconfig/buildtool/Utils.kt +++ b/src/main/kotlin/org/rust/cargo/runconfig/buildtool/Utils.kt @@ -49,6 +49,9 @@ fun ExecutionEnvironment.notifyProcessTerminating(handler: ProcessHandler) = fun ExecutionEnvironment.notifyProcessTerminated(handler: ProcessHandler, exitCode: Int) = executionListener.processTerminated(executor.id, this, handler, exitCode) +val ExecutionEnvironment?.isActivateToolWindowBeforeRun: Boolean + get() = this?.runnerAndConfigurationSettings?.isActivateToolWindowBeforeRun != false + class MockProgressIndicator : EmptyProgressIndicator() { private val _textHistory: MutableList = mutableListOf() val textHistory: List get() = _textHistory