Merge from vscode 27ada910e121e23a6d95ecca9cae595fb98ab568

This commit is contained in:
ADS Merger
2020-04-30 00:53:43 +00:00
parent 87e5239713
commit 93f35ca321
413 changed files with 7190 additions and 8756 deletions

View File

@@ -84,6 +84,7 @@ import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQui
const QUICKOPEN_HISTORY_LIMIT_CONFIG = 'task.quickOpen.history';
const PROBLEM_MATCHER_NEVER_CONFIG = 'task.problemMatchers.neverPrompt';
const USE_SLOW_PICKER = 'task.quickOpen.showAll';
export namespace ConfigureTaskAction {
export const ID = 'workbench.action.tasks.configureTaskRunner';
@@ -599,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) {
@@ -1402,12 +1403,52 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
private executeTask(task: Task, resolver: ITaskResolver): Promise<ITaskSummary> {
return ProblemMatcherRegistry.onReady().then(() => {
return this.editorService.saveAll().then(() => { // make sure all dirty editors are saved
enum SaveBeforeRunConfigOptions {
Always = 'always',
Never = 'never',
Prompt = 'prompt'
}
const saveBeforeRunTaskConfig: SaveBeforeRunConfigOptions = this.configurationService.getValue('task.saveBeforeRun');
const execTask = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
return ProblemMatcherRegistry.onReady().then(() => {
let executeResult = this.getTaskSystem().run(task, resolver);
return this.handleExecuteResult(executeResult);
});
});
};
const saveAllEditorsAndExecTask = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
return this.editorService.saveAll().then(() => {
return execTask(task, resolver);
});
};
const promptAsk = async (task: Task, resolver: ITaskResolver): Promise<ITaskSummary> => {
const dialogOptions = await this.dialogService.show(
Severity.Info,
nls.localize('TaskSystem.saveBeforeRun.prompt.title', 'Save all editors?'),
[nls.localize('saveBeforeRun.save', 'Save'), nls.localize('saveBeforeRun.dontSave', 'Don\'t save')],
{
detail: nls.localize('detail', "Do you want to save all editors before running the task?"),
cancelId: 1
}
);
if (dialogOptions.choice === 0) {
return saveAllEditorsAndExecTask(task, resolver);
} else {
return execTask(task, resolver);
}
};
if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Never) {
return execTask(task, resolver);
} else if (saveBeforeRunTaskConfig === SaveBeforeRunConfigOptions.Prompt) {
return promptAsk(task, resolver);
} else {
return saveAllEditorsAndExecTask(task, resolver);
}
}
private async handleExecuteResult(executeResult: ITaskExecuteResult): Promise<ITaskSummary> {
@@ -1533,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 {
@@ -2088,7 +2139,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return this.configurationService.getValue<boolean>(QUICKOPEN_DETAIL_CONFIG);
}
private createTaskQuickPickEntries(tasks: Task[], group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, includeRecents: boolean = true): TaskQuickPickEntry[] {
private async createTaskQuickPickEntries(tasks: Task[], group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, includeRecents: boolean = true): Promise<TaskQuickPickEntry[]> {
let count: { [key: string]: number; } = {};
if (tasks === undefined || tasks === null || tasks.length === 0) {
return [];
@@ -2124,26 +2175,31 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (tasks.length === 1) {
entries.push(TaskQuickPickEntry(tasks[0]));
} else {
let recentlyUsedTasks = this.getRecentlyUsedTasks();
let recentlyUsedTasks = await this.readRecentTasks();
let recent: Task[] = [];
let recentSet: Set<string> = new Set();
let configured: Task[] = [];
let detected: Task[] = [];
let taskMap: IStringDictionary<Task> = Object.create(null);
tasks.forEach(task => {
let key = task.getRecentlyUsedKey();
let key = task.getCommonTaskId();
if (key) {
taskMap[key] = task;
}
});
recentlyUsedTasks.keys().reverse().forEach(key => {
let task = taskMap[key];
if (task) {
recent.push(task);
recentlyUsedTasks.reverse().forEach(recentTask => {
const key = recentTask.getCommonTaskId();
if (key) {
recentSet.add(key);
let task = taskMap[key];
if (task) {
recent.push(task);
}
}
});
for (let task of tasks) {
let key = task.getRecentlyUsedKey();
if (!key || !recentlyUsedTasks.has(key)) {
let key = task.getCommonTaskId();
if (!key || !recentSet.has(key)) {
if ((task._source.kind === TaskSourceKind.Workspace) || (task._source.kind === TaskSourceKind.User)) {
configured.push(task);
} else {
@@ -2172,7 +2228,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[]> | Task[], placeHolder: string, defaultEntry?: TaskQuickPickEntry, group: boolean = false, sort: boolean = false, selectedEntry?: TaskQuickPickEntry, additionalEntries?: TaskQuickPickEntry[]): Promise<TaskQuickPickEntry | undefined | null> {
@@ -2215,7 +2271,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
const picker: IQuickPick<TaskQuickPickEntry> = this.quickInputService.createQuickPick();
picker.placeholder = placeHolder;
picker.matchOnDescription = true;
picker.ignoreFocusOut = true;
picker.onDidTriggerItemButton(context => {
let task = context.item.task;
@@ -2327,26 +2382,76 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
}
private tasksAndGroupedTasks(filter?: TaskFilter): { tasks: Promise<Task[]>, grouped: Promise<TaskMap> } {
if (!this.versionAndEngineCompatible(filter)) {
return { tasks: Promise.resolve<Task[]>([]), grouped: Promise.resolve(new TaskMap()) };
}
const grouped = this.getGroupedTasks(filter ? filter.type : undefined);
const tasks = grouped.then((map) => {
if (!filter || !filter.type) {
return map.all();
}
let result: Task[] = [];
map.forEach((tasks) => {
for (let task of tasks) {
if (ContributedTask.is(task) && task.defines.type === filter.type) {
result.push(task);
} else if (CustomTask.is(task)) {
if (task.type === filter.type) {
result.push(task);
} else {
let customizes = task.customizes();
if (customizes && customizes.type === filter.type) {
result.push(task);
}
}
}
}
});
return result;
});
return { tasks, grouped };
}
private doRunTaskCommand(tasks?: Task[]): void {
this.showIgnoredFoldersMessage().then(() => {
this.showTwoLevelQuickPick(
nls.localize('TaskService.pickRunTask', 'Select the task to run'),
{
label: nls.localize('TaskService.noEntryToRun', 'No configured tasks. Configure Tasks...'),
task: null
}).
then((task) => {
if (task === undefined) {
return;
}
if (task === null) {
this.runConfigureTasks();
} else {
this.run(task, { attachProblemMatcher: true }, TaskRunSource.User).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
});
}
const pickThen = (task: Task | undefined | null) => {
if (task === undefined) {
return;
}
if (task === null) {
this.runConfigureTasks();
} else {
this.run(task, { attachProblemMatcher: true }, TaskRunSource.User).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
});
}
};
const placeholder = nls.localize('TaskService.pickRunTask', 'Select the task to run');
this.showIgnoredFoldersMessage().then(() => {
if (this.configurationService.getValue(USE_SLOW_PICKER)) {
let taskResult: { tasks: Promise<Task[]>, grouped: Promise<TaskMap> } | undefined = undefined;
if (!tasks) {
taskResult = this.tasksAndGroupedTasks();
}
this.showQuickPick(tasks ? tasks : taskResult!.tasks, placeholder,
{
label: nls.localize('TaskService.noEntryToRunSlow', 'No task to run found. Configure Tasks...'),
task: null
},
true).
then((entry) => {
return pickThen(entry ? entry.task : undefined);
});
} else {
this.showTwoLevelQuickPick(placeholder,
{
label: nls.localize('TaskService.noEntryToRun', 'No configured tasks. Configure Tasks...'),
task: null
}).
then(pickThen);
}
});
}