diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index 49011bf7d68aea47d10aed7f88f2bc013cfa240a..ddc07a2f5c5b745e7e358294aeace4c116e8641b 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -67,6 +67,24 @@ function showError() { }); } +async function findGulpCommand(rootPath: string): Promise { + let gulpCommand: string; + let platform = process.platform; + if (platform === 'win32' && await exists(path.join(rootPath, 'node_modules', '.bin', 'gulp.cmd'))) { + const globalGulp = path.join(process.env.APPDATA ? process.env.APPDATA : '', 'npm', 'gulp.cmd'); + if (await exists(globalGulp)) { + gulpCommand = '"' + globalGulp + '"'; + } else { + gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp.cmd'); + } + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(rootPath, 'node_modules', '.bin', 'gulp'))) { + gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp'); + } else { + gulpCommand = 'gulp'; + } + return gulpCommand; +} + interface GulpTaskDefinition extends vscode.TaskDefinition { task: string; file?: string; @@ -77,7 +95,9 @@ class FolderDetector { private fileWatcher: vscode.FileSystemWatcher | undefined; private promise: Thenable | undefined; - constructor(private _workspaceFolder: vscode.WorkspaceFolder) { + constructor( + private _workspaceFolder: vscode.WorkspaceFolder, + private _gulpCommand: Promise) { } public get workspaceFolder(): vscode.WorkspaceFolder { @@ -97,10 +117,28 @@ class FolderDetector { } public async getTasks(): Promise { - if (!this.promise) { - this.promise = this.computeTasks(); + if (this.isEnabled()) { + if (!this.promise) { + this.promise = this.computeTasks(); + } + return this.promise; + } else { + return []; + } + } + + public async getTask(_task: vscode.Task): Promise { + const gulpTask = (_task.definition).task; + if (gulpTask) { + let kind: GulpTaskDefinition = { + type: 'gulp', + task: gulpTask + }; + let options: vscode.ShellExecutionOptions = { cwd: this.workspaceFolder.uri.fsPath }; + let task = new vscode.Task(kind, this.workspaceFolder, gulpTask, 'gulp', new vscode.ShellExecution(await this._gulpCommand, [gulpTask], options)); + return task; } - return this.promise; + return undefined; } private async computeTasks(): Promise { @@ -117,22 +155,7 @@ class FolderDetector { } } - let gulpCommand: string; - let platform = process.platform; - if (platform === 'win32' && await exists(path.join(rootPath!, 'node_modules', '.bin', 'gulp.cmd'))) { - const globalGulp = path.join(process.env.APPDATA ? process.env.APPDATA : '', 'npm', 'gulp.cmd'); - if (await exists(globalGulp)) { - gulpCommand = '"' + globalGulp + '"'; - } else { - gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp.cmd'); - } - } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(rootPath!, 'node_modules', '.bin', 'gulp'))) { - gulpCommand = path.join('.', 'node_modules', '.bin', 'gulp'); - } else { - gulpCommand = 'gulp'; - } - - let commandLine = `${gulpCommand} --tasks-simple --no-color`; + let commandLine = `${await this._gulpCommand} --tasks-simple --no-color`; try { let { stdout, stderr } = await exec(commandLine, { cwd: rootPath }); if (stderr && stderr.length > 0) { @@ -151,7 +174,7 @@ class FolderDetector { task: line }; let options: vscode.ShellExecutionOptions = { cwd: this.workspaceFolder.uri.fsPath }; - let task = new vscode.Task(kind, this.workspaceFolder, line, 'gulp', new vscode.ShellExecution(gulpCommand, [line], options)); + let task = new vscode.Task(kind, this.workspaceFolder, line, 'gulp', new vscode.ShellExecution(await this._gulpCommand, [line], options)); result.push(task); let lowerCaseLine = line.toLowerCase(); if (isBuildTask(lowerCaseLine)) { @@ -218,9 +241,9 @@ class TaskDetector { } } for (let add of added) { - let detector = new FolderDetector(add); + let detector = new FolderDetector(add, findGulpCommand(add.uri.fsPath)); + this.detectors.set(add.uri.toString(), detector); if (detector.isEnabled()) { - this.detectors.set(add.uri.toString(), detector); detector.start(); } } @@ -229,18 +252,16 @@ class TaskDetector { private updateConfiguration(): void { for (let detector of this.detectors.values()) { - if (!detector.isEnabled()) { - detector.dispose(); - this.detectors.delete(detector.workspaceFolder.uri.toString()); - } + detector.dispose(); + this.detectors.delete(detector.workspaceFolder.uri.toString()); } let folders = vscode.workspace.workspaceFolders; if (folders) { for (let folder of folders) { if (!this.detectors.has(folder.uri.toString())) { - let detector = new FolderDetector(folder); + let detector = new FolderDetector(folder, findGulpCommand(folder.uri.fsPath)); + this.detectors.set(folder.uri.toString(), detector); if (detector.isEnabled()) { - this.detectors.set(folder.uri.toString(), detector); detector.start(); } } @@ -251,12 +272,13 @@ class TaskDetector { private updateProvider(): void { if (!this.taskProvider && this.detectors.size > 0) { + const thisCapture = this; this.taskProvider = vscode.workspace.registerTaskProvider('gulp', { - provideTasks: () => { - return this.getTasks(); + provideTasks(): Promise { + return thisCapture.getTasks(); }, - resolveTask(_task: vscode.Task): vscode.Task | undefined { - return undefined; + resolveTask(_task: vscode.Task): Promise { + return thisCapture.getTask(_task); } }); } @@ -291,6 +313,25 @@ class TaskDetector { }); } } + + public async getTask(task: vscode.Task): Promise { + if (this.detectors.size === 0) { + return undefined; + } else if (this.detectors.size === 1) { + return this.detectors.values().next().value.getTask(task); + } else { + if ((task.scope === vscode.TaskScope.Workspace) || (task.scope === vscode.TaskScope.Global)) { + // Not supported, we don't have enough info to create the task. + return undefined; + } else if (task.scope) { + const detector = this.detectors.get(task.scope.uri.toString()); + if (detector) { + return detector.getTask(task); + } + } + return undefined; + } + } } let detector: TaskDetector; diff --git a/src/vs/workbench/api/browser/mainThreadTask.ts b/src/vs/workbench/api/browser/mainThreadTask.ts index 2b774c47ce6e673834671a8c74dffee52384621a..16553729ee499dcb21f79b17fb4abaca31c3daec 100644 --- a/src/vs/workbench/api/browser/mainThreadTask.ts +++ b/src/vs/workbench/api/browser/mainThreadTask.ts @@ -16,7 +16,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { - ContributedTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, + ContributedTask, ConfiguringTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, PresentationOptions, CommandOptions, CommandConfiguration, RuntimeType, CustomTask, TaskScope, TaskSource, TaskSourceKind, ExtensionTaskSource, RunOptions, TaskSet, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; @@ -304,8 +304,8 @@ namespace TaskHandleDTO { } namespace TaskDTO { - export function from(task: Task): TaskDTO | undefined { - if (task === undefined || task === null || (!CustomTask.is(task) && !ContributedTask.is(task))) { + export function from(task: Task | ConfiguringTask): TaskDTO | undefined { + if (task === undefined || task === null || (!CustomTask.is(task) && !ContributedTask.is(task) && !ConfiguringTask.is(task))) { return undefined; } const result: TaskDTO = { @@ -314,7 +314,7 @@ namespace TaskDTO { definition: TaskDefinitionDTO.from(task.getDefinition()), source: TaskSourceDTO.from(task._source), execution: undefined, - presentationOptions: task.command ? TaskPresentationOptionsDTO.from(task.command.presentation) : undefined, + presentationOptions: !ConfiguringTask.is(task) && task.command ? TaskPresentationOptionsDTO.from(task.command.presentation) : undefined, isBackground: task.configurationProperties.isBackground, problemMatchers: [], hasDefinedMatchers: ContributedTask.is(task) ? task.hasDefinedMatchers : false, @@ -323,7 +323,7 @@ namespace TaskDTO { if (task.configurationProperties.group) { result.group = task.configurationProperties.group; } - if (task.command) { + if (!ConfiguringTask.is(task) && task.command) { if (task.command.runtime === RuntimeType.Process) { result.execution = ProcessExecutionDTO.from(task.command); } else if (task.command.runtime === RuntimeType.Shell) { @@ -442,7 +442,7 @@ export class MainThreadTask implements MainThreadTaskShape { }); } - public $registerTaskProvider(handle: number): Promise { + public $registerTaskProvider(handle: number, type: string): Promise { const provider: ITaskProvider = { provideTasks: (validTypes: IStringDictionary) => { return Promise.resolve(this._proxy.$provideTasks(handle, validTypes)).then((value) => { @@ -460,9 +460,24 @@ export class MainThreadTask implements MainThreadTaskShape { extension: value.extension } as TaskSet; }); + }, + resolveTask: (task: ConfiguringTask) => { + const dto = TaskDTO.from(task); + + if (dto) { + dto.name = ((dto.name === undefined) ? '' : dto.name); // Using an empty name causes the name to default to the one given by the provider. + return Promise.resolve(this._proxy.$resolveTask(handle, dto)).then(resolvedTask => { + if (resolvedTask) { + return TaskDTO.to(resolvedTask, this._workspaceContextServer, true); + } + + return undefined; + }); + } + return Promise.resolve(undefined); } }; - const disposable = this._taskService.registerTaskProvider(provider); + const disposable = this._taskService.registerTaskProvider(provider, type); this._providers.set(handle, { disposable, provider }); return Promise.resolve(undefined); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 603fe598cfed308c950f25f5734f9c1d6780c619..1f2802ea390640dbf05abaeedab376128982d3a3 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -635,7 +635,7 @@ export interface MainThreadSearchShape extends IDisposable { export interface MainThreadTaskShape extends IDisposable { $createTaskId(task: tasks.TaskDTO): Promise; - $registerTaskProvider(handle: number): Promise; + $registerTaskProvider(handle: number, type: string): Promise; $unregisterTaskProvider(handle: number): Promise; $fetchTasks(filter?: tasks.TaskFilterDTO): Promise; $executeTask(task: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; @@ -1183,6 +1183,7 @@ export interface ExtHostSCMShape { export interface ExtHostTaskShape { $provideTasks(handle: number, validTypes: { [key: string]: boolean; }): Thenable; + $resolveTask(handle: number, taskDTO: tasks.TaskDTO): Thenable; $onDidStartTask(execution: tasks.TaskExecutionDTO, terminalId: number): void; $onDidStartTaskProcess(value: tasks.TaskProcessStartedDTO): void; $onDidEndTaskProcess(value: tasks.TaskProcessEndedDTO): void; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 090aae113224f8b13069463f37c2eeeef79f9c2c..bbb26a719e9ee341648444c67ae107c9be0072d1 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -675,7 +675,7 @@ export function createApiFactory( return extHostDocumentContentProviders.registerTextDocumentContentProvider(scheme, provider); }, registerTaskProvider: (type: string, provider: vscode.TaskProvider) => { - return extHostTask.registerTaskProvider(extension, provider); + return extHostTask.registerTaskProvider(extension, type, provider); }, registerFileSystemProvider(scheme, provider, options) { return extHostFileSystem.registerFileSystemProvider(scheme, provider, options); @@ -776,7 +776,7 @@ export function createApiFactory( const tasks: typeof vscode.tasks = { registerTaskProvider: (type: string, provider: vscode.TaskProvider) => { - return extHostTask.registerTaskProvider(extension, provider); + return extHostTask.registerTaskProvider(extension, type, provider); }, fetchTasks: (filter?: vscode.TaskFilter): Thenable => { return extHostTask.fetchTasks(filter); diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index ca88785c082ea86cbfdd7f582ab4f5e89c3a07de..cac5d242ad9dc66ae928203fa5f459067902501b 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -347,6 +347,7 @@ namespace TaskExecutionDTO { } interface HandlerData { + type: string; provider: vscode.TaskProvider; extension: IExtensionDescription; } @@ -492,13 +493,13 @@ export class ExtHostTask implements ExtHostTaskShape { this._activeCustomExecutions = new Map(); } - public registerTaskProvider(extension: IExtensionDescription, provider: vscode.TaskProvider): vscode.Disposable { + public registerTaskProvider(extension: IExtensionDescription, type: string, provider: vscode.TaskProvider): vscode.Disposable { if (!provider) { return new types.Disposable(() => { }); } const handle = this.nextHandle(); - this._handlers.set(handle, { provider, extension }); - this._proxy.$registerTaskProvider(handle); + this._handlers.set(handle, { type, provider, extension }); + this._proxy.$registerTaskProvider(handle, type); return new types.Disposable(() => { this._handlers.delete(handle); this._proxy.$unregisterTaskProvider(handle); @@ -652,15 +653,10 @@ export class ExtHostTask implements ExtHostTaskShape { taskDTOs.push(taskDTO); if (CustomExecutionDTO.is(taskDTO.execution)) { - taskIdPromises.push(new Promise((resolve) => { - // The ID is calculated on the main thread task side, so, let's call into it here. - // We need the task id's pre-computed for custom task executions because when OnDidStartTask - // is invoked, we have to be able to map it back to our data. - this._proxy.$createTaskId(taskDTO).then((taskId) => { - this._providedCustomExecutions.set(taskId, new CustomExecutionData((task).execution2, this._terminalService)); - resolve(); - }); - })); + // The ID is calculated on the main thread task side, so, let's call into it here. + // We need the task id's pre-computed for custom task executions because when OnDidStartTask + // is invoked, we have to be able to map it back to our data. + taskIdPromises.push(this.addCustomExecution(taskDTO, task)); } } } @@ -680,6 +676,38 @@ export class ExtHostTask implements ExtHostTaskShape { }); } + public async $resolveTask(handle: number, taskDTO: TaskDTO): Promise { + const handler = this._handlers.get(handle); + if (!handler) { + return Promise.reject(new Error('no handler found')); + } + + if (taskDTO.definition.type !== handler.type) { + throw new Error(`Unexpected: Task of type [${taskDTO.definition.type}] cannot be resolved by provider of type [${handler.type}].`); + } + + const task = await TaskDTO.to(taskDTO, this._workspaceProvider); + if (!task) { + throw new Error('Unexpected: Task cannot be resolved.'); + } + + const resolvedTask = await handler.provider.resolveTask(task, CancellationToken.None); + if (!resolvedTask) { + return; + } + + const resolvedTaskDTO: TaskDTO | undefined = TaskDTO.from(resolvedTask, handler.extension); + if (!resolvedTaskDTO) { + throw new Error('Unexpected: Task cannot be resolved.'); + } + + if (CustomExecutionDTO.is(resolvedTaskDTO.execution)) { + await this.addCustomExecution(taskDTO, task); + } + + return resolvedTaskDTO; + } + public async $resolveVariables(uriComponents: UriComponents, toResolve: { process?: { name: string; cwd?: string; path?: string }, variables: string[] }): Promise<{ process?: string, variables: { [key: string]: string; } }> { const configProvider = await this._configurationService.getConfigProvider(); const uri: URI = URI.revive(uriComponents); @@ -725,6 +753,11 @@ export class ExtHostTask implements ExtHostTaskShape { return this._handleCounter++; } + private async addCustomExecution(taskDTO: TaskDTO, task: vscode.Task2): Promise { + const taskId = await this._proxy.$createTaskId(taskDTO); + this._providedCustomExecutions.set(taskId, new CustomExecutionData((task).execution2, this._terminalService)); + } + private async getTaskExecution(execution: TaskExecutionDTO | string, task?: vscode.Task): Promise { if (typeof execution === 'string') { const taskExecution = this._taskExecutions.get(execution); diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 13c49ee0fb10410889428ac81dad9aa7fef78d25..e235b3821ccd4513fafd82add1ce3d9a12526e8a 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -182,6 +182,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer private _ignoredWorkspaceFolders: IWorkspaceFolder[]; private _showIgnoreMessage?: boolean; private _providers: Map; + private _providerTypes: Map; protected _taskSystemInfos: Map; protected _workspaceTasksPromise?: Promise>; @@ -230,6 +231,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this._taskSystemListener = undefined; this._outputChannel = this.outputService.getChannel(AbstractTaskService.OutputChannelId)!; this._providers = new Map(); + this._providerTypes = new Map(); this._taskSystemInfos = new Map(); this._register(this.contextService.onDidChangeWorkspaceFolders(() => { if (!this._taskSystem && !this._workspaceTasksPromise) { @@ -443,7 +445,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } - public registerTaskProvider(provider: ITaskProvider): IDisposable { + public registerTaskProvider(provider: ITaskProvider, type: string): IDisposable { if (!provider) { return { dispose: () => { } @@ -451,9 +453,11 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } let handle = AbstractTaskService.nextHandle++; this._providers.set(handle, provider); + this._providerTypes.set(handle, type); return { dispose: () => { this._providers.delete(handle); + this._providerTypes.delete(handle); } }; } @@ -1154,6 +1158,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer }).then((contributedTaskSets) => { let result: TaskMap = new TaskMap(); let contributedTasks: TaskMap = new TaskMap(); + for (let set of contributedTaskSets) { for (let task of set.tasks) { let workspaceFolder = task.getWorkspaceFolder(); @@ -1162,8 +1167,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } } - return this.getWorkspaceTasks().then((customTasks) => { - customTasks.forEach((folderTasks, key) => { + + return this.getWorkspaceTasks().then(async (customTasks) => { + const customTasksKeyValuePairs = Array.from(customTasks); + const customTasksPromises = customTasksKeyValuePairs.map(async ([key, folderTasks]) => { let contributed = contributedTasks.get(key); if (!folderTasks.set) { if (contributed) { @@ -1221,8 +1228,26 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } else { result.add(key, ...folderTasks.set.tasks); } - unUsedConfigurations.forEach((value) => { + + const unUsedConfigurationsAsArray = Array.from(unUsedConfigurations); + + const unUsedConfigurationPromises = unUsedConfigurationsAsArray.map(async (value) => { let configuringTask = configurations!.byIdentifier[value]; + + for (const [handle, provider] of this._providers) { + if (configuringTask.type === this._providerTypes.get(handle)) { + try { + const resolvedTask = await provider.resolveTask(configuringTask); + if (resolvedTask) { + result.add(key, TaskConfig.createCustomTask(resolvedTask, configuringTask)); + return; + } + } catch (error) { + // Ignore errors. The task could not be provided by any of the providers. + } + } + } + this._outputChannel.append(nls.localize( 'TaskService.noConfiguration', 'Error: The {0} task detection didn\'t contribute a task for the following configuration:\n{1}\nThe task will be ignored.\n', @@ -1231,12 +1256,17 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer )); this.showOutput(); }); + + await Promise.all(unUsedConfigurationPromises); } else { result.add(key, ...folderTasks.set.tasks); result.add(key, ...contributed); } } }); + + await Promise.all(customTasksPromises); + return result; }, () => { // If we can't read the tasks.json file provide at least the contributed tasks diff --git a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts index 28f45c4edf7ca81597505c5c2322d059249de7ef..515edd44738b6d86d559aa8eeb43067f3c46bddf 100644 --- a/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts @@ -7,6 +7,7 @@ import * as nls from 'vs/nls'; import * as Objects from 'vs/base/common/objects'; import { IStringDictionary } from 'vs/base/common/collections'; +import { IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { Platform } from 'vs/base/common/platform'; import * as Types from 'vs/base/common/types'; import * as UUID from 'vs/base/common/uuid'; @@ -22,6 +23,7 @@ import * as Tasks from './tasks'; import { TaskDefinitionRegistry } from './taskDefinitionRegistry'; import { ConfiguredInput } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; + export const enum ShellQuoting { /** * Default is character escaping. @@ -1240,11 +1242,20 @@ namespace ConfigurationProperties { { property: 'presentation', type: CommandConfiguration.PresentationOptions }, { property: 'problemMatchers' } ]; - export function from(this: void, external: ConfigurationProperties, context: ParseContext, includeCommandOptions: boolean): Tasks.ConfigurationProperties | undefined { + export function from(this: void, external: ConfigurationProperties, context: ParseContext, includeCommandOptions: boolean, properties?: IJSONSchemaMap): Tasks.ConfigurationProperties | undefined { if (!external) { return undefined; } let result: Tasks.ConfigurationProperties = {}; + + if (properties) { + for (const propertyName of Object.keys(properties)) { + if (external[propertyName] !== undefined) { + result[propertyName] = Objects.deepClone(external[propertyName]); + } + } + } + if (Types.isString(external.taskName)) { result.name = external.taskName; } @@ -1380,7 +1391,7 @@ namespace ConfiguringTask { RunOptions.fromConfiguration(external.runOptions), {} ); - let configuration = ConfigurationProperties.from(external, context, true); + let configuration = ConfigurationProperties.from(external, context, true, typeDeclaration.properties); if (configuration) { result.configurationProperties = Objects.assign(result.configurationProperties, configuration); if (result.configurationProperties.name) { diff --git a/src/vs/workbench/contrib/tasks/common/taskService.ts b/src/vs/workbench/contrib/tasks/common/taskService.ts index e8235e7877e4102741c94e545c13b604e7eab10f..b154aed1cbe583c35847d763079f0fac59d3d0e4 100644 --- a/src/vs/workbench/contrib/tasks/common/taskService.ts +++ b/src/vs/workbench/contrib/tasks/common/taskService.ts @@ -20,6 +20,7 @@ export const ITaskService = createDecorator('taskService'); export interface ITaskProvider { provideTasks(validTypes: IStringDictionary): Promise; + resolveTask(task: ConfiguringTask): Promise; } export interface ProblemMatcherRunOptions { @@ -79,7 +80,7 @@ export interface ITaskService { customize(task: ContributedTask | CustomTask, properties?: {}, openConfig?: boolean): Promise; openConfig(task: CustomTask | undefined): Promise; - registerTaskProvider(taskProvider: ITaskProvider): IDisposable; + registerTaskProvider(taskProvider: ITaskProvider, type: string): IDisposable; registerTaskSystem(scheme: string, taskSystemInfo: TaskSystemInfo): void; diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index a9bab79d9ceed372e819e0cc5b896fee24cdf6f5..0b9ff835776dee0fa8987d5a697ae66191d13756 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -745,6 +745,9 @@ export class ConfiguringTask extends CommonTask { return object; } + public getDefinition(): KeyedTaskIdentifier { + return this.configures; + } } export class ContributedTask extends CommonTask {