From 6a7d2f523cbce6f7d0c59e2503b6f72b1bb73f09 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 27 Apr 2020 14:20:53 +0200 Subject: [PATCH] Show warnings when task types don't match Part of #95971 --- .../contrib/tasks/browser/abstractTaskService.ts | 16 +++++++++++++--- .../contrib/tasks/browser/taskQuickPick.ts | 15 +++++++++++---- .../contrib/tasks/browser/tasksQuickAccess.ts | 6 ++++-- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 4d3c55c941f..3b27dff72e2 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -600,7 +600,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer let result: Task[] = []; map.forEach((tasks) => { for (let task of tasks) { - if (ContributedTask.is(task) && task.defines.type === filter.type) { + if (ContributedTask.is(task) && ((task.defines.type === filter.type) || (task._source.label === filter.type))) { result.push(task); } else if (CustomTask.is(task)) { if (task.type === filter.type) { @@ -1574,7 +1574,17 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer for (const [handle, provider] of this._providers) { if ((type === undefined) || (type === this._providerTypes.get(handle))) { counter++; - provider.provideTasks(validTypes).then(done, error); + provider.provideTasks(validTypes).then((taskSet: TaskSet) => { + // Check that the tasks provided are of the correct type + for (const task of taskSet.tasks) { + if (task.type !== this._providerTypes.get(handle)) { + this._outputChannel.append(nls.localize('unexpectedTaskType', "The task provider for \"{0}\" tasks unexpectedly provided a task of type \"{1}\".\n", this._providerTypes.get(handle), task.type)); + this.showOutput(); + break; + } + } + return done(taskSet); + }, error); } } } else { @@ -2213,7 +2223,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } private async showTwoLevelQuickPick(placeHolder: string, defaultEntry?: TaskQuickPickEntry) { - return TaskQuickPick.show(this, this.configurationService, this.quickInputService, placeHolder, defaultEntry); + return TaskQuickPick.show(this, this.configurationService, this.quickInputService, this.notificationService, placeHolder, defaultEntry); } private async showQuickPick(tasks: Promise | Task[], placeHolder: string, defaultEntry?: TaskQuickPickEntry, group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, additionalEntries?: TaskQuickPickEntry[]): Promise { diff --git a/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts b/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts index 24ebde4a6cb..f0519eda5a8 100644 --- a/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts @@ -14,6 +14,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { Disposable } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; +import { INotificationService } from 'vs/platform/notification/common/notification'; export const QUICKOPEN_DETAIL_CONFIG = 'task.quickOpen.detail'; export const QUICKOPEN_SKIP_CONFIG = 'task.quickOpen.skip'; @@ -37,7 +38,8 @@ export class TaskQuickPick extends Disposable { constructor( private taskService: ITaskService, private configurationService: IConfigurationService, - private quickInputService: IQuickInputService) { + private quickInputService: IQuickInputService, + private notificationService: INotificationService) { super(); this.sorter = this.taskService.createSorter(); } @@ -262,11 +264,16 @@ export class TaskQuickPick extends Disposable { return task; } - return this.taskService.tryResolveTask(task); + const resolvedTask = await this.taskService.tryResolveTask(task); + + if (!resolvedTask) { + this.notificationService.error(nls.localize('noProviderForTask', "There is no task provider registered for tasks of type \"{0}\".", task.type)); + } + return resolvedTask; } - static async show(taskService: ITaskService, configurationService: IConfigurationService, quickInputService: IQuickInputService, placeHolder: string, defaultEntry?: TaskQuickPickEntry) { - const taskQuickPick = new TaskQuickPick(taskService, configurationService, quickInputService); + static async show(taskService: ITaskService, configurationService: IConfigurationService, quickInputService: IQuickInputService, notificationService: INotificationService, placeHolder: string, defaultEntry?: TaskQuickPickEntry) { + const taskQuickPick = new TaskQuickPick(taskService, configurationService, quickInputService, notificationService); return taskQuickPick.show(placeHolder, defaultEntry); } } diff --git a/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess.ts b/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess.ts index 8fc0b0f8ad2..89b4ff97692 100644 --- a/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess.ts +++ b/src/vs/workbench/contrib/tasks/browser/tasksQuickAccess.ts @@ -15,6 +15,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { TaskQuickPick, TaskTwoLevelQuickPickEntry } from 'vs/workbench/contrib/tasks/browser/taskQuickPick'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { isString } from 'vs/base/common/types'; +import { INotificationService } from 'vs/platform/notification/common/notification'; export class TasksQuickAccessProvider extends PickerQuickAccessProvider { @@ -26,7 +27,8 @@ export class TasksQuickAccessProvider extends PickerQuickAccessProvider = []; -- GitLab