Allow workspace file and user tasks to be configured as build and test tasks

Fixes #89663
This commit is contained in:
Alex Ross 2020-01-30 12:30:32 +01:00
parent b6b9b8bf92
commit 333686e9b3

View file

@ -979,7 +979,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (!workspaceFolder) {
return Promise.resolve(undefined);
}
let configuration = this.getConfiguration(workspaceFolder);
let configuration = this.getConfiguration(workspaceFolder, task._source.kind);
if (configuration.hasParseErrors) {
this.notificationService.warn(nls.localize('customizeParseErrors', 'The current task configuration has errors. Please fix the errors first before customizing a task.'));
return Promise.resolve<void>(undefined);
@ -991,7 +991,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
let taskConfig = CustomTask.is(task) ? task._source.config : undefined;
if (taskConfig && taskConfig.element) {
index = taskConfig.index;
toCustomize = taskConfig.element;
toCustomize = { ...(taskConfig.element) };
} else if (ContributedTask.is(task)) {
toCustomize = {
};
@ -1041,10 +1041,10 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if ((index === -1) && properties) {
if (properties.problemMatcher !== undefined) {
fileConfig.problemMatcher = properties.problemMatcher;
promise = this.writeConfiguration(workspaceFolder, 'tasks.problemMatchers', fileConfig.problemMatcher);
promise = this.writeConfiguration(workspaceFolder, 'tasks.problemMatchers', fileConfig.problemMatcher, task._source.kind);
} else if (properties.group !== undefined) {
fileConfig.group = properties.group;
promise = this.writeConfiguration(workspaceFolder, 'tasks.group', fileConfig.group);
promise = this.writeConfiguration(workspaceFolder, 'tasks.group', fileConfig.group, task._source.kind);
}
} else {
if (!Array.isArray(fileConfig.tasks)) {
@ -1055,7 +1055,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
} else {
fileConfig.tasks[index] = toCustomize;
}
promise = this.writeConfiguration(workspaceFolder, 'tasks.tasks', fileConfig.tasks);
promise = this.writeConfiguration(workspaceFolder, 'tasks.tasks', fileConfig.tasks, task._source.kind);
}
}
if (!promise) {
@ -1072,16 +1072,24 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
*/
this.telemetryService.publicLog(AbstractTaskService.CustomizationTelemetryEventName, event);
if (openConfig) {
this.openEditorAtTask(workspaceFolder.toResource('.vscode/tasks.json'), toCustomize);
this.openEditorAtTask(this.getResourceForTask(task), toCustomize);
}
});
}
private writeConfiguration(workspaceFolder: IWorkspaceFolder, key: string, value: any): Promise<void> | undefined {
if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) {
return this.configurationService.updateValue(key, value, { resource: workspaceFolder.uri }, ConfigurationTarget.WORKSPACE);
} else if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) {
return this.configurationService.updateValue(key, value, { resource: workspaceFolder.uri }, ConfigurationTarget.WORKSPACE_FOLDER);
private writeConfiguration(workspaceFolder: IWorkspaceFolder, key: string, value: any, source?: string): Promise<void> | undefined {
let target: ConfigurationTarget | undefined = undefined;
switch (source) {
case TaskSourceKind.User: target = ConfigurationTarget.USER; break;
case TaskSourceKind.WorkspaceFile: target = ConfigurationTarget.WORKSPACE; break;
default: if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) {
target = ConfigurationTarget.WORKSPACE;
} else if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) {
target = ConfigurationTarget.WORKSPACE_FOLDER;
}
}
if (target) {
return this.configurationService.updateValue(key, value, { resource: workspaceFolder.uri }, target);
} else {
return undefined;
}
@ -1104,17 +1112,21 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
}
}
private getResourceForTask(task: CustomTask): URI {
let uri = this.getResourceForKind(task._source.kind);
if (!uri) {
const taskFolder = task.getWorkspaceFolder();
if (taskFolder) {
uri = taskFolder.toResource(task._source.config.file);
} else {
uri = this.workspaceFolders[0].uri;
private getResourceForTask(task: CustomTask | ContributedTask): URI {
if (CustomTask.is(task)) {
let uri = this.getResourceForKind(task._source.kind);
if (!uri) {
const taskFolder = task.getWorkspaceFolder();
if (taskFolder) {
uri = taskFolder.toResource(task._source.config.file);
} else {
uri = this.workspaceFolders[0].uri;
}
}
return uri;
} else {
return task.getWorkspaceFolder()!.toResource('.vscode/tasks.json');
}
return uri;
}
public openConfig(task: CustomTask | undefined): Promise<void> {
@ -1799,10 +1811,19 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
return TaskConfig.JsonSchemaVersion.from(config);
}
protected getConfiguration(workspaceFolder: IWorkspaceFolder): { config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; hasParseErrors: boolean } {
let result = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY
? Objects.deepClone(this.configurationService.inspect<TaskConfig.ExternalTaskRunnerConfiguration>('tasks', { resource: workspaceFolder.uri }).workspaceFolderValue)
: undefined;
protected getConfiguration(workspaceFolder: IWorkspaceFolder, source?: string): { config: TaskConfig.ExternalTaskRunnerConfiguration | undefined; hasParseErrors: boolean } {
let result;
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
result = undefined;
} else {
const wholeConfig = this.configurationService.inspect<TaskConfig.ExternalTaskRunnerConfiguration>('tasks', { resource: workspaceFolder.uri });
switch (source) {
case TaskSourceKind.User: result = Objects.deepClone(wholeConfig.userValue); break;
case TaskSourceKind.Workspace: result = Objects.deepClone(wholeConfig.workspaceFolderValue); break;
case TaskSourceKind.WorkspaceFile: result = Objects.deepClone(wholeConfig.workspaceValue); break;
default: result = Objects.deepClone(wholeConfig.workspaceFolderValue);
}
}
if (!result) {
return { config: undefined, hasParseErrors: false };
}
@ -2662,7 +2683,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (!InMemoryTask.is(task)) {
this.customize(task, { group: { kind: 'build', isDefault: true } }, true).then(() => {
if (selectedTask && (task !== selectedTask) && !InMemoryTask.is(selectedTask)) {
this.customize(selectedTask, { group: 'build' }, true);
this.customize(selectedTask, { group: 'build' }, false);
}
});
}
@ -2713,7 +2734,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
if (!InMemoryTask.is(task)) {
this.customize(task, { group: { kind: 'test', isDefault: true } }, true).then(() => {
if (selectedTask && (task !== selectedTask) && !InMemoryTask.is(selectedTask)) {
this.customize(selectedTask, { group: 'test' }, true);
this.customize(selectedTask, { group: 'test' }, false);
}
});
}