diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index e11e8a81fc38f..856fdf6c36c6e 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -316,7 +316,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this._registerCommands().then(() => TaskCommandsRegistered.bindTo(this._contextKeyService).set(true)); ServerlessWebContext.bindTo(this._contextKeyService).set(Platform.isWeb && !remoteAgentService.getConnection()?.remoteAuthority); this._configurationResolverService.contributeVariable('defaultBuildTask', async (): Promise => { - let tasks = await this._getTasksForGroup(TaskGroup.Build); + // delay provider activation, we might find a default task in the tasks.json file + let tasks = await this._getTasksForGroup(TaskGroup.Build, true); if (tasks.length > 0) { const defaults = this._getDefaultTasks(tasks); if (defaults.length === 1) { @@ -324,6 +325,15 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } else if (defaults.length) { tasks = defaults; } + } else { + // activate all providers, we haven't found the default build task in the tasks.json file + tasks = await this._getTasksForGroup(TaskGroup.Build); + const defaults = this._getDefaultTasks(tasks); + if (defaults.length === 1) { + return defaults[0]._label; + } else if (defaults.length) { + tasks = defaults; + } } let entry: ITaskQuickPickEntry | null | undefined; @@ -608,6 +618,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer // We need to first wait for extensions to be registered because we might read // the `TaskDefinitionRegistry` in case `type` is `undefined` await this._extensionService.whenInstalledExtensionsRegistered(); + this._log('Activating task providers ' + type ?? 'all'); await raceTimeout( Promise.all(this._getActivationEvents(type).map(activationEvent => this._extensionService.activateByEvent(activationEvent))), 5000, @@ -1418,8 +1429,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return task; } - private async _getTasksForGroup(group: TaskGroup): Promise { - const groups = await this._getGroupedTasks(); + private async _getTasksForGroup(group: TaskGroup, waitToActivate?: boolean): Promise { + const groups = await this._getGroupedTasks(undefined, waitToActivate); const result: Task[] = []; groups.forEach(tasks => { for (const task of tasks) { @@ -2001,11 +2012,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return !definition || !definition.when || this._contextKeyService.contextMatchesRules(definition.when); } - private async _getGroupedTasks(filter?: ITaskFilter): Promise { + private async _getGroupedTasks(filter?: ITaskFilter, waitToActivate?: boolean): Promise { await this._waitForAllSupportedExecutions; const type = filter?.type; const needsRecentTasksMigration = this._needsRecentTasksMigration(); - await this._activateTaskProviders(filter?.type); + if (!waitToActivate) { + await this._activateTaskProviders(filter?.type); + } const validTypes: IStringDictionary = Object.create(null); TaskDefinitionRegistry.all().forEach(definition => validTypes[definition.taskType] = true); validTypes['shell'] = true;