First cut of #45664: Add API to query and execute tasks

This commit is contained in:
Dirk Baeumer 2018-03-15 17:42:56 +01:00
parent 055ac07ca7
commit a4cf2abe7e
4 changed files with 82 additions and 3 deletions

View file

@ -739,4 +739,31 @@ declare module 'vscode' {
}
//#endregion
//#region Tasks
/**
* A task handle represents a task in the system. It can be used to
* present task and to execute them.
*/
export interface TaskHandle {
/**
* A unique ID.
*/
id: string;
/**
* A human readable label of the task.
*/
label: string;
/**
* The workspace folder the task belongs to. Is undefined
* to tasks that aren't scoped to a workspace folder.
*/
workspaceFolder: WorkspaceFolder | undefined;
}
//#endregion
}

View file

@ -17,6 +17,7 @@ import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands';
import { IWorkspaceSymbolProvider } from 'vs/workbench/parts/search/common/search';
import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/editor/common/editor';
import { CustomCodeAction } from 'vs/workbench/api/node/extHostLanguageFeatures';
import * as TaskSystem from 'vs/workbench/parts/tasks/common/tasks';
export class ExtHostApiCommands {
@ -169,6 +170,11 @@ export class ExtHostApiCommands {
],
returns: 'A promise that resolves to an array of DocumentLink-instances.'
});
this._register('vscode.executeTaskProvider', this._executeTaskProvider, {
description: 'Execute task provider',
args: [],
returns: 'An array of task handles'
});
this._register('vscode.previewHtml', (uri: URI, position?: vscode.ViewColumn, label?: string, options?: any) => {
return this._commands.executeCommand('_workbench.previewHtml',
@ -465,6 +471,22 @@ export class ExtHostApiCommands {
return this._commands.executeCommand<modes.ILink[]>('_executeLinkProvider', resource)
.then(tryMapWith(typeConverters.DocumentLink.to));
}
private _executeTaskProvider(): Thenable<vscode.TaskHandle[]> {
return this._commands.executeCommand<TaskSystem.TaskHandleTransfer[]>('_executeTaskProvider').then<vscode.TaskHandle[]>((values) => {
return values.map(handle => {
return {
id: handle.id,
label: handle.label,
workspaceFolder: {
name: handle.workspaceFolder.name,
index: handle.workspaceFolder.index,
uri: URI.revive(handle.workspaceFolder.uri)
}
};
});
});
}
}
function tryMapWith<T, R>(f: (x: T) => R) {

View file

@ -11,7 +11,7 @@ import * as Objects from 'vs/base/common/objects';
import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
import { ProblemMatcher } from 'vs/workbench/parts/tasks/common/problemMatcher';
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
import { IWorkspaceFolder, IWorkspaceFolderData } from 'vs/platform/workspace/common/workspace';
export enum ShellQuoting {
@ -594,6 +594,11 @@ export namespace Task {
}
}
export interface TaskHandleTransfer {
id: string;
label: string;
workspaceFolder: IWorkspaceFolderData;
}
export enum ExecutionEngine {
Process = 1,

View file

@ -62,7 +62,7 @@ import Constants from 'vs/workbench/parts/markers/electron-browser/constants';
import { IPartService } from 'vs/workbench/services/part/common/partService';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver';
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder, IWorkspaceFolderData } from 'vs/platform/workspace/common/workspace';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/parts/output/common/output';
@ -71,7 +71,11 @@ import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs
import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal';
import { ITaskSystem, ITaskResolver, ITaskSummary, TaskExecuteKind, TaskError, TaskErrors, TaskTerminateResponse } from 'vs/workbench/parts/tasks/common/taskSystem';
import { Task, CustomTask, ConfiguringTask, ContributedTask, InMemoryTask, TaskEvent, TaskEventKind, TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind, TaskIdentifier, TaskSorter } from 'vs/workbench/parts/tasks/common/tasks';
import {
Task, CustomTask, ConfiguringTask, ContributedTask, InMemoryTask, TaskEvent,
TaskEventKind, TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind,
TaskIdentifier, TaskSorter, TaskHandleTransfer
} from 'vs/workbench/parts/tasks/common/tasks';
import { ITaskService, ITaskProvider, RunOptions, CustomizationProperties } from 'vs/workbench/parts/tasks/common/taskService';
import { getTemplates as getTaskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates';
@ -575,6 +579,27 @@ class TaskService implements ITaskService {
CommandsRegistry.registerCommand('workbench.action.tasks.showTasks', () => {
this.runShowTasks();
});
CommandsRegistry.registerCommand('_executeTaskProvider', (accessor, args) => {
return this.tasks().then((tasks) => {
let result: TaskHandleTransfer[] = [];
for (let task of tasks) {
let folder = Task.getWorkspaceFolder(task);
let folderData: IWorkspaceFolderData = folder ? {
name: folder.name,
uri: folder.uri,
index: folder.index
} : undefined;
let handle: TaskHandleTransfer = {
id: task._id,
label: task._label,
workspaceFolder: folderData
};
result.push(handle);
}
return result;
});
});
}
private get workspaceFolders(): IWorkspaceFolder[] {