From e58c2abb979281c1f4a6530840e5a4ed0093bfb6 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 14:44:01 +0200 Subject: [PATCH] Implements #27399: Separate the task provider name from the task name in the task API --- extensions/grunt/src/main.ts | 4 +- extensions/gulp/src/main.ts | 2 +- extensions/jake/src/main.ts | 2 +- extensions/npm/src/main.ts | 4 +- .../typescript/src/features/taskProvider.ts | 3 +- src/vs/vscode.d.ts | 33 +++++++---- src/vs/workbench/api/node/extHostTask.ts | 6 +- src/vs/workbench/api/node/extHostTypes.ts | 58 +++++++++++-------- .../parts/tasks/browser/quickOpen.ts | 16 ++++- .../parts/tasks/common/taskConfiguration.ts | 1 + src/vs/workbench/parts/tasks/common/tasks.ts | 5 +- .../electron-browser/task.contribution.ts | 2 +- .../tasks/test/node/configuration.test.ts | 2 +- 13 files changed, 88 insertions(+), 50 deletions(-) diff --git a/extensions/grunt/src/main.ts b/extensions/grunt/src/main.ts index ff551f904ec..a90eff6c933 100644 --- a/extensions/grunt/src/main.ts +++ b/extensions/grunt/src/main.ts @@ -139,8 +139,8 @@ async function getGruntTasks(): Promise { if (matches && matches.length === 2) { let taskName = matches[1]; let task = taskName.indexOf(' ') === -1 - ? new vscode.ShellTask(`grunt: ${taskName}`, `${command} ${taskName}`) - : new vscode.ShellTask(`grunt: ${taskName}`, `${command} "${taskName}"`); + ? new vscode.ShellTask(taskName, `${command} ${taskName}`) + : new vscode.ShellTask(taskName, `${command} "${taskName}"`); task.identifier = `grunt.${taskName}`; result.push(task); let lowerCaseTaskName = taskName.toLowerCase(); diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index 666b66bf120..c75a8ce5d9c 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -114,7 +114,7 @@ async function getGulpTasks(): Promise { if (line.length === 0) { continue; } - let task = new vscode.ShellTask(`gulp: ${line}`, `${gulpCommand} ${line}`); + let task = new vscode.ShellTask(line, `${gulpCommand} ${line}`); task.identifier = `gulp.${line}`; result.push(task); let lowerCaseLine = line.toLowerCase(); diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts index 93b55873eab..25d93a29780 100644 --- a/extensions/jake/src/main.ts +++ b/extensions/jake/src/main.ts @@ -118,7 +118,7 @@ async function getJakeTasks(): Promise { let matches = regExp.exec(line); if (matches && matches.length === 2) { let taskName = matches[1]; - let task = new vscode.ShellTask(`jake: ${taskName}`, `${jakeCommand} ${taskName}`); + let task = new vscode.ShellTask(taskName, `${jakeCommand} ${taskName}`); task.identifier = `jake.${taskName}`; result.push(task); let lowerCaseLine = line.toLowerCase(); diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 9dc734a4ffe..beeddfa5a86 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -81,7 +81,7 @@ async function getNpmScriptsAsTasks(): Promise { const result: vscode.Task[] = []; Object.keys(json.scripts).forEach(each => { - const task = new vscode.ShellTask(`npm: run ${each}`, `npm run ${each}`); + const task = new vscode.ShellTask(`run ${each}`, `npm run ${each}`); const lowerCaseTaskName = each.toLowerCase(); if (lowerCaseTaskName === 'build') { task.group = vscode.TaskGroup.Build; @@ -91,7 +91,7 @@ async function getNpmScriptsAsTasks(): Promise { result.push(task); }); // add some 'well known' npm tasks - result.push(new vscode.ShellTask(`npm: install`, `npm install`)); + result.push(new vscode.ShellTask(`install`, `npm install`)); return Promise.resolve(result); } catch (e) { return Promise.resolve(emptyTasks); diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index 4d50b233294..9cb0a3a64a8 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -48,7 +48,8 @@ class TscTaskProvider implements vscode.TaskProvider { return projects.map(configFile => { const configFileName = path.relative(rootPath, configFile); - const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p "${configFile}"`, '$tsc'); + const buildTask = new vscode.ShellTask(`build ${configFileName}`, `${command} -p "${configFile}"`, '$tsc'); + buildTask.source = 'tsc'; buildTask.group = vscode.TaskGroup.Build; return buildTask; }); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index f9587fccbe0..979822a1f4d 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3580,11 +3580,6 @@ declare module 'vscode' { export const Test: 'test'; } - /** - * The supported task groups. - */ - export type TaskGroup = 'clean' | 'build' | 'rebuildAll' | 'test'; - /** * The ProblemMatchers type definition. */ @@ -3652,10 +3647,18 @@ declare module 'vscode' { args: string[]; /** - * The task group this tasks belongs to. Defaults to undefined meaning - * that the task doesn't belong to any special group. + * A human-readable string describing the source of this + * shell task, e.g. 'gulp' or 'npm'. */ - group?: TaskGroup; + source: string | undefined; + + /** + * The task group this tasks belongs to. See TaskGroup + * for a predefined set of available groups. + * Defaults to undefined meaning that the task doesn't + * belong to any special group. + */ + group: string | undefined; /** * The process options used when the process is executed. @@ -3772,10 +3775,18 @@ declare module 'vscode' { readonly commandLine: string; /** - * The task group this tasks belongs to. Defaults to undefined meaning - * that the task doesn't belong to any special group. + * A human-readable string describing the source of this + * shell task, e.g. 'gulp' or 'npm'. + */ + source: string | undefined; + + /** + * The task group this tasks belongs to. See TaskGroup + * for a predefined set of available groups. + * Defaults to undefined meaning that the task doesn't + * belong to any special group. */ - group?: TaskGroup; + group: string | undefined; /** * The shell options used when the shell is executed. Defaults to an diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 04836f73af8..99f5368de6f 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -310,7 +310,11 @@ namespace Tasks { } let result: TaskSystem.Task = { _id: uuidMap.getUUID(task.identifier), - _source: { kind: TaskSystem.TaskSourceKind.Extension, detail: extension.id }, + _source: { + kind: TaskSystem.TaskSourceKind.Extension, + label: typeof task.source === 'string' ? task.source : extension.name, + detail: extension.id + }, name: task.name, identifier: task.identifier, group: types.TaskGroup.is(task.group) ? task.group : undefined, diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index d78f0d8d75e..87509da1649 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1021,6 +1021,8 @@ export class BaseTask { private _problemMatchers: string[]; private _identifier: string; private _isBackground: boolean; + private _source: string; + private _group: string; private _terminal: vscode.TerminalBehaviour; constructor(name: string, problemMatchers: string[]) { @@ -1063,6 +1065,36 @@ export class BaseTask { this._isBackground = value; } + get source(): string { + return this._source; + } + + set source(value: string) { + if (value === void 0 || value === null) { + this._source = undefined; + return; + } + if (typeof value !== 'string' || value.length === 0) { + throw illegalArgument('source must be a string of length > 0'); + } + this._source = value; + } + + get group(): string { + return this._group; + } + + set group(value: string) { + if (value === void 0 || value === null) { + this._group = undefined; + return; + } + if (typeof value !== 'string' || value.length === 0) { + throw illegalArgument('group must be a string of length > 0'); + } + this._group = value; + } + get terminal(): vscode.TerminalBehaviour { return this._terminal; } @@ -1122,7 +1154,7 @@ export namespace TaskGroup { */ export const Test: 'test' = 'test'; - export function is(value: string): value is vscode.TaskGroup { + export function is(value: string): value is string { return value === Clean || value === Build || value === RebuildAll || value === Test; } } @@ -1131,7 +1163,6 @@ export class ProcessTask extends BaseTask { private _process: string; private _args: string[]; - private _group: vscode.TaskGroup; private _options: vscode.ProcessOptions; constructor(name: string, process: string, args?: string[], problemMatchers?: vscode.ProblemMatchers); @@ -1183,17 +1214,6 @@ export class ProcessTask extends BaseTask { this._args = value; } - get group(): vscode.TaskGroup { - return this._group; - } - - set group(value: vscode.TaskGroup) { - if (!TaskGroup.is(value)) { - throw illegalArgument('group'); - } - this._group = value; - } - get options(): vscode.ProcessOptions { return this._options; } @@ -1209,7 +1229,6 @@ export class ProcessTask extends BaseTask { export class ShellTask extends BaseTask implements vscode.ShellTask { private _commandLine: string; - private _group: vscode.TaskGroup; private _options: vscode.ShellOptions; constructor(name: string, commandLine: string, problemMatchers?: vscode.ProblemMatchers); @@ -1240,17 +1259,6 @@ export class ShellTask extends BaseTask implements vscode.ShellTask { return this._commandLine; } - get group(): vscode.TaskGroup { - return this._group; - } - - set group(value: vscode.TaskGroup) { - if (!TaskGroup.is(value)) { - throw illegalArgument('group'); - } - this._group = value; - } - get options(): vscode.ShellOptions { return this._options; } diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index fe5ec004ee4..15432e9c647 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -19,13 +19,19 @@ import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/ export class TaskEntry extends Model.QuickOpenEntry { + private _label: string; + constructor(protected taskService: ITaskService, protected _task: Task, highlights: Model.IHighlight[] = []) { super(highlights); - this._task = _task; + if (_task._source.kind === TaskSourceKind.Extension) { + this._label = nls.localize('taskEntry.label', '{0}: {1}', _task._source.label, _task.name); + } else { + this._label = _task.name; + } } public getLabel(): string { - return this._task.name; + return this._label; } public getAriaLabel(): string { @@ -76,6 +82,12 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { let aKind = a._source.kind; let bKind = b._source.kind; if (aKind === bKind) { + if (aKind === TaskSourceKind.Extension) { + let compare = a._source.label.localeCompare(b._source.label); + if (compare !== 0) { + return compare; + } + } return a.name.localeCompare(b.name); } if (aKind === TaskSourceKind.Workspace) { diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index 09fa78dfd77..a7ccb15f65e 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -764,6 +764,7 @@ namespace TaskDescription { export let source: Tasks.TaskSource = { kind: Tasks.TaskSourceKind.Workspace, + label: 'Workspace', detail: '.settins\tasks.json' }; diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index c3e90f83fb6..e7d54343b07 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -153,7 +153,7 @@ export namespace TaskGroup { export const Test: 'test' = 'test'; - export function is(value: string): value is TaskGroup { + export function is(value: string): value is string { return value === Clean || value === Build || value === RebuildAll || value === Test; } } @@ -168,6 +168,7 @@ export enum TaskSourceKind { export interface TaskSource { kind: TaskSourceKind; + label: string; detail?: string; } @@ -199,7 +200,7 @@ export interface Task { /** * the task's group; */ - group?: TaskGroup; + group?: string; /** * The command configuration 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 68b32dfc244..d94812a35bb 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -780,7 +780,7 @@ class TaskService extends EventEmitter implements ITaskService { let id: string = UUID.generateUuid(); let task: Task = { _id: id, - _source: { kind: TaskSourceKind.Generic }, + _source: { kind: TaskSourceKind.Generic, label: 'generic' }, name: id, identifier: id, dependsOn: extensionTasks.map(task => task._id), diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index cbccf978e9d..c958d68336b 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -144,7 +144,7 @@ class TaskBuilder { this.commandBuilder = new CommandConfigurationBuilder(this, command); this.result = { _id: name, - _source: { kind: Tasks.TaskSourceKind.Workspace }, + _source: { kind: Tasks.TaskSourceKind.Workspace, label: 'workspace' }, identifier: name, name: name, command: this.commandBuilder.result, -- GitLab