in src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts [2030:2170]
private runConfigureTasks(): void {
if (!this.canRunCommand()) {
return undefined;
}
let taskPromise: Promise<TaskMap>;
if (this.schemaVersion === JsonSchemaVersion.V2_0_0) {
taskPromise = this.getGroupedTasks();
} else {
taskPromise = Promise.resolve(new TaskMap());
}
let openTaskFile = (workspaceFolder: IWorkspaceFolder): void => {
let resource = workspaceFolder.toResource('.vscode/tasks.json');
let configFileCreated = false;
this.fileService.resolve(resource).then((stat) => stat, () => undefined).then((stat) => {
if (stat) {
return stat.resource;
}
return this.quickInputService.pick(getTaskTemplates(), { placeHolder: nls.localize('TaskService.template', 'Select a Task Template') }).then((selection) => {
if (!selection) {
return Promise.resolve(undefined);
}
let content = selection.content;
let editorConfig = this.configurationService.getValue<any>();
if (editorConfig.editor.insertSpaces) {
content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + strings.repeat(' ', s2.length * editorConfig.editor.tabSize));
}
configFileCreated = true;
type TaskServiceTemplateClassification = {
templateId?: { classification: 'SystemMetaData', purpose: 'FeatureInsight' };
autoDetect: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true };
};
type TaskServiceEvent = {
templateId?: string;
autoDetect: boolean;
};
return this.textFileService.create(resource, content).then((result): URI => {
this.telemetryService.publicLog2<TaskServiceEvent, TaskServiceTemplateClassification>('taskService.template', {
templateId: selection.id,
autoDetect: selection.autoDetect
});
return result.resource;
});
});
}).then((resource) => {
if (!resource) {
return;
}
this.editorService.openEditor({
resource,
options: {
pinned: configFileCreated // pin only if config file is created #8727
}
});
});
};
let configureTask = (task: Task): void => {
if (ContributedTask.is(task)) {
this.customize(task, undefined, true);
} else if (CustomTask.is(task)) {
this.openConfig(task);
} else if (ConfiguringTask.is(task)) {
// Do nothing.
}
};
function isTaskEntry(value: IQuickPickItem): value is IQuickPickItem & { task: Task } {
let candidate: IQuickPickItem & { task: Task } = value as any;
return candidate && !!candidate.task;
}
let stats = this.contextService.getWorkspace().folders.map<Promise<IFileStat | undefined>>((folder) => {
return this.fileService.resolve(folder.toResource('.vscode/tasks.json')).then(stat => stat, () => undefined);
});
let createLabel = nls.localize('TaskService.createJsonFile', 'Create tasks.json file from template');
let openLabel = nls.localize('TaskService.openJsonFile', 'Open tasks.json file');
let entries = Promise.all(stats).then((stats) => {
return taskPromise.then((taskMap) => {
type EntryType = (IQuickPickItem & { task: Task; }) | (IQuickPickItem & { folder: IWorkspaceFolder; });
let entries: QuickPickInput<EntryType>[] = [];
if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) {
let tasks = taskMap.all();
let needsCreateOrOpen: boolean = true;
if (tasks.length > 0) {
tasks = tasks.sort((a, b) => a._label.localeCompare(b._label));
for (let task of tasks) {
entries.push({ label: task._label, task });
if (!ContributedTask.is(task)) {
needsCreateOrOpen = false;
}
}
}
if (needsCreateOrOpen) {
let label = stats[0] !== undefined ? openLabel : createLabel;
if (entries.length) {
entries.push({ type: 'separator' });
}
entries.push({ label, folder: this.contextService.getWorkspace().folders[0] });
}
} else {
let folders = this.contextService.getWorkspace().folders;
let index = 0;
for (let folder of folders) {
let tasks = taskMap.get(folder);
if (tasks.length > 0) {
tasks = tasks.slice().sort((a, b) => a._label.localeCompare(b._label));
for (let i = 0; i < tasks.length; i++) {
let entry: EntryType = { label: tasks[i]._label, task: tasks[i], description: folder.name };
if (i === 0) {
entries.push({ type: 'separator', label: folder.name });
}
entries.push(entry);
}
} else {
let label = stats[index] !== undefined ? openLabel : createLabel;
let entry: EntryType = { label, folder: folder };
entries.push({ type: 'separator', label: folder.name });
entries.push(entry);
}
index++;
}
}
return entries;
});
});
this.quickInputService.pick(entries,
{ placeHolder: nls.localize('TaskService.pickTask', 'Select a task to configure') }).
then((selection) => {
if (!selection) {
return;
}
if (isTaskEntry(selection)) {
configureTask(selection.task);
} else {
openTaskFile(selection.folder);
}
});
}