diff --git a/CHANGELOG.md b/CHANGELOG.md index b4dec06303aea..ee36fc9281ee7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - [cpp] added new `cpp.clangdExecutable` and `cpp.clangdArgs` to customize language server start command. - [monaco] Fix document-saving that was taking too long. - [plug-in] added `tasks.onDidStartTask` Plug-in API +- [plug-in] added `tasks.onDidEndTask` Plug-in API - Enabled INI syntax highlighting for `.properties` and `.toml` files - [security] update xterm.js to 3.9.2 diff --git a/packages/plugin-ext/src/api/plugin-api.ts b/packages/plugin-ext/src/api/plugin-api.ts index d94b56f9e1024..fef0c0dea0a43 100644 --- a/packages/plugin-ext/src/api/plugin-api.ts +++ b/packages/plugin-ext/src/api/plugin-api.ts @@ -1028,6 +1028,7 @@ export interface TasksExt { $provideTasks(handle: number): Promise; $resolveTask(handle: number, task: TaskDto): Promise; $onDidStartTask(execution: TaskExecutionDto): void; + $onDidEndTask(id: number): void; } export interface TasksMain { diff --git a/packages/plugin-ext/src/main/browser/tasks-main.ts b/packages/plugin-ext/src/main/browser/tasks-main.ts index 2bf61347a3d0a..a1b7384879776 100644 --- a/packages/plugin-ext/src/main/browser/tasks-main.ts +++ b/packages/plugin-ext/src/main/browser/tasks-main.ts @@ -24,7 +24,7 @@ import { DisposableCollection } from '@theia/core'; import { TaskProviderRegistry, TaskResolverRegistry, TaskProvider, TaskResolver } from '@theia/task/lib/browser/task-contribution'; import { interfaces } from 'inversify'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; -import { TaskInfo } from '@theia/task/lib/common/task-protocol'; +import { TaskInfo, TaskExitedEvent } from '@theia/task/lib/common/task-protocol'; import { TaskWatcher } from '@theia/task/lib/common/task-watcher'; import { TaskService } from '@theia/task/lib/browser/task-service'; import { TaskConfiguration } from '@theia/task/lib/common'; @@ -63,6 +63,12 @@ export class TasksMainImpl implements TasksMain { }); } }); + + this.taskWatcher.onTaskExit((event: TaskExitedEvent) => { + if (event.ctx === this.workspaceRootUri) { + this.proxy.$onDidEndTask(event.taskId); + } + }); } $registerTaskProvider(handle: number, type: string): void { diff --git a/packages/plugin-ext/src/plugin/plugin-context.ts b/packages/plugin-ext/src/plugin/plugin-context.ts index afd89fdffa1ef..a923c2cddd054 100644 --- a/packages/plugin-ext/src/plugin/plugin-context.ts +++ b/packages/plugin-ext/src/plugin/plugin-context.ts @@ -582,6 +582,10 @@ export function createAPIFactory( onDidStartTask(listener, thisArg?, disposables?) { return tasksExt.onDidStartTask(listener, thisArg, disposables); + }, + + onDidEndTask(listener, thisArg?, disposables?) { + return tasksExt.onDidEndTask(listener, thisArg, disposables); } }; diff --git a/packages/plugin-ext/src/plugin/tasks/tasks.ts b/packages/plugin-ext/src/plugin/tasks/tasks.ts index 0cb4cdb90c5c5..80b818bf63383 100644 --- a/packages/plugin-ext/src/plugin/tasks/tasks.ts +++ b/packages/plugin-ext/src/plugin/tasks/tasks.ts @@ -36,6 +36,7 @@ export class TasksExtImpl implements TasksExt { private taskExecutions = new Map(); private readonly onDidExecuteTask: Emitter = new Emitter(); + private readonly onDidTerminateTask: Emitter = new Emitter(); constructor(rpc: RPCProtocol) { this.proxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.TASKS_MAIN); @@ -51,6 +52,23 @@ export class TasksExtImpl implements TasksExt { }); } + get onDidEndTask(): Event { + return this.onDidTerminateTask.event; + } + + $onDidEndTask(id: number): void { + const taskExecution = this.taskExecutions.get(id); + if (!taskExecution) { + throw new Error(`Task execution with id ${id} is not found`); + } + + this.taskExecutions.delete(id); + + this.onDidTerminateTask.fire({ + execution: taskExecution + }); + } + registerTaskProvider(type: string, provider: theia.TaskProvider): theia.Disposable { const callId = this.addNewAdapter(new TaskProviderAdapter(provider)); this.proxy.$registerTaskProvider(callId, type); diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index d6213085204f4..97d9302e900ca 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -7001,6 +7001,18 @@ declare module '@theia/plugin' { execution: TaskExecution; } + /** + * An event signaling the end of an executed task. + * + * This interface is not intended to be implemented. + */ + interface TaskEndEvent { + /** + * The task item representing the task that finished. + */ + execution: TaskExecution; + } + export namespace tasks { /** @@ -7014,6 +7026,9 @@ declare module '@theia/plugin' { /** Fires when a task starts. */ export const onDidStartTask: Event; + + /** Fires when a task ends. */ + export const onDidEndTask: Event; } /**