diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 2de312e716f..e4d6cfa0911 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -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 } diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index f8ddedac861..4406a22b153 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -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('_executeLinkProvider', resource) .then(tryMapWith(typeConverters.DocumentLink.to)); } + + private _executeTaskProvider(): Thenable { + return this._commands.executeCommand('_executeTaskProvider').then((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(f: (x: T) => R) { diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 1409c5b9701..bcefab54238 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -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, diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 2e146f15556..b1fc107fca9 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -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[] {