Merge from vscode 79a1f5a5ca0c6c53db617aa1fa5a2396d2caebe2

This commit is contained in:
ADS Merger
2020-05-31 19:47:51 +00:00
parent 84492049e8
commit 28be33cfea
913 changed files with 28242 additions and 15549 deletions

View File

@@ -11,7 +11,7 @@ import * as json from 'vs/base/common/json';
import { URI } from 'vs/base/common/uri';
import { IStringDictionary } from 'vs/base/common/collections';
import { Action } from 'vs/base/common/actions';
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
import { IDisposable, Disposable, IReference } from 'vs/base/common/lifecycle';
import { Event, Emitter } from 'vs/base/common/event';
import * as Types from 'vs/base/common/types';
import { TerminateResponseCode } from 'vs/base/common/processes';
@@ -19,7 +19,7 @@ import * as strings from 'vs/base/common/strings';
import { ValidationStatus, ValidationState } from 'vs/base/common/parsers';
import * as UUID from 'vs/base/common/uuid';
import * as Platform from 'vs/base/common/platform';
import { LRUCache } from 'vs/base/common/map';
import { LRUCache, Touch } from 'vs/base/common/map';
import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle';
import { IMarkerService } from 'vs/platform/markers/common/markers';
@@ -72,9 +72,9 @@ import { RunAutomaticTasks } from 'vs/workbench/contrib/tasks/browser/runAutomat
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
import { IPathService } from 'vs/workbench/services/path/common/pathService';
import { format } from 'vs/base/common/jsonFormatter';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService';
import { applyEdits } from 'vs/base/common/jsonEdit';
import { ITextEditorPane, SaveReason } from 'vs/workbench/common/editor';
import { SaveReason } from 'vs/workbench/common/editor';
import { ITextEditorSelection, TextEditorSelectionRevealType } from 'vs/platform/editor/common/editor';
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
import { find } from 'vs/base/common/arrays';
@@ -715,9 +715,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
const folderToTasksMap: Map<string, any> = new Map();
const recentlyUsedTasks = this.getRecentlyUsedTasks();
const tasks: (Task | ConfiguringTask)[] = [];
for (const key of recentlyUsedTasks.keys()) {
for (const entry of recentlyUsedTasks.entries()) {
const key = entry[0];
const task = JSON.parse(entry[1]);
const folder = this.getFolderFromTaskKey(key);
const task = JSON.parse(recentlyUsedTasks.get(key)!);
if (folder && !folderToTasksMap.has(folder)) {
folderToTasksMap.set(folder, []);
}
@@ -791,13 +792,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (quickOpenHistoryLimit === 0) {
return;
}
let keys = this._recentlyUsedTasks.keys();
let keys = [...this._recentlyUsedTasks.keys()];
if (keys.length > quickOpenHistoryLimit) {
keys = keys.slice(0, quickOpenHistoryLimit);
}
const keyValues: [string, string][] = [];
for (const key of keys) {
keyValues.push([key, this._recentlyUsedTasks.get(key)!]);
keyValues.push([key, this._recentlyUsedTasks.get(key, Touch.None)!]);
}
this.storageService.store(AbstractTaskService.RecentlyUsedTasks_KeyV2, JSON.stringify(keyValues), StorageScope.WORKSPACE);
}
@@ -1050,14 +1051,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return false;
}
private openEditorAtTask(resource: URI | undefined, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | string | undefined): Promise<ITextEditorPane | null | undefined> {
private openEditorAtTask(resource: URI | undefined, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | string | undefined): Promise<boolean> {
if (resource === undefined) {
return Promise.resolve(undefined);
return Promise.resolve(false);
}
let selection: ITextEditorSelection | undefined;
return this.fileService.readFile(resource).then(content => content.value).then(async content => {
if (!content) {
return undefined;
return false;
}
if (task) {
const contentValue = content.toString();
@@ -1065,15 +1066,23 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (typeof task === 'string') {
stringValue = task;
} else {
const model = (await this.textModelResolverService.createModelReference(resource)).object.textEditorModel;
const { tabSize, insertSpaces } = model.getOptions();
const eol = model.getEOL();
const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces });
let stringified = applyEdits(JSON.stringify(task), edits);
const regex = new RegExp(eol + '\\t', 'g');
stringified = stringified.replace(regex, eol + '\t\t\t');
const twoTabs = '\t\t';
stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1);
let reference: IReference<IResolvedTextEditorModel> | undefined;
try {
reference = await this.textModelResolverService.createModelReference(resource);
const model = reference.object.textEditorModel;
const { tabSize, insertSpaces } = model.getOptions();
const eol = model.getEOL();
const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces });
let stringified = applyEdits(JSON.stringify(task), edits);
const regex = new RegExp(eol + '\\t', 'g');
stringified = stringified.replace(regex, eol + '\t\t\t');
const twoTabs = '\t\t';
stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1);
} finally {
if (reference) {
reference.dispose();
}
}
}
const index = contentValue.indexOf(stringValue);
@@ -1100,13 +1109,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
selection,
selectionRevealType: TextEditorSelectionRevealType.CenterIfOutsideViewport
}
});
}).then(() => !!selection);
});
}
private createCustomizableTask(task: ContributedTask | CustomTask): TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined {
private createCustomizableTask(task: ContributedTask | CustomTask | ConfiguringTask): TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined {
let toCustomize: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | undefined;
let taskConfig = CustomTask.is(task) ? task._source.config : undefined;
let taskConfig = CustomTask.is(task) || ConfiguringTask.is(task) ? task._source.config : undefined;
if (taskConfig && taskConfig.element) {
toCustomize = { ...(taskConfig.element) };
} else if (ContributedTask.is(task)) {
@@ -1137,7 +1146,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return toCustomize;
}
public customize(task: ContributedTask | CustomTask, properties?: CustomizationProperties, openConfig?: boolean): Promise<void> {
public customize(task: ContributedTask | CustomTask | ConfiguringTask, properties?: CustomizationProperties, openConfig?: boolean): Promise<void> {
const workspaceFolder = task.getWorkspaceFolder();
if (!workspaceFolder) {
return Promise.resolve(undefined);
@@ -1271,14 +1280,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
}
public openConfig(task: CustomTask | ConfiguringTask | undefined): Promise<void> {
public openConfig(task: CustomTask | ConfiguringTask | undefined): Promise<boolean> {
let resource: URI | undefined;
if (task) {
resource = this.getResourceForTask(task);
} else {
resource = (this._workspaceFolders && (this._workspaceFolders.length > 0)) ? this._workspaceFolders[0].toResource('.vscode/tasks.json') : undefined;
}
return this.openEditorAtTask(resource, task ? task._label : undefined).then(() => undefined);
return this.openEditorAtTask(resource, task ? task._label : undefined);
}
private createRunnableTask(tasks: TaskMap, group: TaskGroup): { task: Task; resolver: ITaskResolver } | undefined {
@@ -2325,7 +2334,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
taskMap[key] = task;
}
});
const reversed = recentlyUsedTasks.keys().reverse();
const reversed = [...recentlyUsedTasks.keys()].reverse();
for (const key in reversed) {
let task = taskMap[key];
if (task) {
@@ -2364,10 +2373,13 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (identifier !== undefined) {
this.getGroupedTasks().then(async (grouped) => {
let resolver = this.createResolver(grouped);
let folders: (IWorkspaceFolder | string)[] = this.contextService.getWorkspace().folders;
folders = folders.concat([USER_TASKS_GROUP_KEY]);
for (let folder of folders) {
let task = await resolver.resolve(typeof folder === 'string' ? folder : folder.uri, identifier);
let folderURIs: (URI | string)[] = this.contextService.getWorkspace().folders.map(folder => folder.uri);
if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) {
folderURIs.push(this.contextService.getWorkspace().configuration!);
}
folderURIs.push(USER_TASKS_GROUP_KEY);
for (let uri of folderURIs) {
let task = await resolver.resolve(uri, identifier);
if (task) {
this.run(task).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
@@ -2503,38 +2515,58 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
location: ProgressLocation.Window,
title: nls.localize('TaskService.fetchingBuildTasks', 'Fetching build tasks...')
};
let promise = this.getTasksForGroup(TaskGroup.Build).then((tasks) => {
if (tasks.length > 0) {
let { defaults, users } = this.splitPerGroupType(tasks);
if (defaults.length === 1) {
this.run(defaults[0]).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
});
return;
} else if (defaults.length + users.length > 0) {
tasks = defaults.concat(users);
let promise = this.getWorkspaceTasks().then(tasks => {
const buildTasks: ConfiguringTask[] = [];
for (const taskSource of tasks) {
for (const task in taskSource[1].configurations?.byIdentifier) {
if ((taskSource[1].configurations?.byIdentifier[task].configurationProperties.group === TaskGroup.Build) &&
(taskSource[1].configurations?.byIdentifier[task].configurationProperties.groupType === GroupType.default)) {
buildTasks.push(taskSource[1].configurations.byIdentifier[task]);
}
}
}
this.showIgnoredFoldersMessage().then(() => {
this.showQuickPick(tasks,
nls.localize('TaskService.pickBuildTask', 'Select the build task to run'),
{
label: nls.localize('TaskService.noBuildTask', 'No build task to run found. Configure Build Task...'),
task: null
},
true).then((entry) => {
let task: Task | undefined | null = entry ? entry.task : undefined;
if (task === undefined) {
return;
}
if (task === null) {
this.runConfigureDefaultBuildTask();
return;
}
this.run(task, { attachProblemMatcher: true }).then(undefined, reason => {
if (buildTasks.length === 1) {
this.tryResolveTask(buildTasks[0]).then(resolvedTask => {
this.run(resolvedTask).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
});
});
return undefined; // {{SQL CARBON EDIT}} strict-null-check
}
return this.getTasksForGroup(TaskGroup.Build).then((tasks) => {
if (tasks.length > 0) {
let { defaults, users } = this.splitPerGroupType(tasks);
if (defaults.length === 1) {
this.run(defaults[0]).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
});
});
return;
} else if (defaults.length + users.length > 0) {
tasks = defaults.concat(users);
}
}
this.showIgnoredFoldersMessage().then(() => {
this.showQuickPick(tasks,
nls.localize('TaskService.pickBuildTask', 'Select the build task to run'),
{
label: nls.localize('TaskService.noBuildTask', 'No build task to run found. Configure Build Task...'),
task: null
},
true).then((entry) => {
let task: Task | undefined | null = entry ? entry.task : undefined;
if (task === undefined) {
return;
}
if (task === null) {
this.runConfigureDefaultBuildTask();
return;
}
this.run(task, { attachProblemMatcher: true }).then(undefined, reason => {
// eat the error, it has already been surfaced to the user and we don't care about it here
});
});
});
});
});
this.progressService.withProgress(options, () => promise);