提交 5f8c14ed 编写于 作者: D Dirk Baeumer

Code clean up on how to detect new terminal runner

上级 dcc0d3ae
......@@ -165,7 +165,7 @@ export interface TaskDescription extends PlatformTaskDescription {
/**
* The base task runner configuration
*/
export interface BaseTaskRunnerConfiguration extends TaskSystem.TaskConfiguration {
export interface BaseTaskRunnerConfiguration {
/**
* The command to be executed. Can be an external program or a shell
......@@ -265,6 +265,8 @@ export interface BaseTaskRunnerConfiguration extends TaskSystem.TaskConfiguratio
*/
export interface ExternalTaskRunnerConfiguration extends BaseTaskRunnerConfiguration {
_runner?: string;
/**
* The config's version number
*/
......@@ -980,9 +982,35 @@ namespace Globals {
}
}
export enum ExecutionEngine {
Unknown = 0,
Terminal = 1,
OutputPanel = 2
}
export namespace ExecutionEngine {
export function from(config: ExternalTaskRunnerConfiguration): ExecutionEngine {
return isTerminalConfig(config)
? ExecutionEngine.Terminal
: isRunnerConfig(config)
? ExecutionEngine.OutputPanel
: ExecutionEngine.Unknown;
}
function isRunnerConfig(config: ExternalTaskRunnerConfiguration): boolean {
return (!config._runner || config._runner === 'program') && (config.version === '0.1.0' || !config.version);
}
function isTerminalConfig(config: ExternalTaskRunnerConfiguration): boolean {
return config._runner === 'terminal' || config.version === '2.0.0';
}
}
export interface ParseResult {
validationStatus: ValidationStatus;
configuration: TaskSystem.TaskRunnerConfiguration;
engine: ExecutionEngine;
}
export interface ILogger {
......@@ -1001,10 +1029,12 @@ class ConfigurationParser {
}
public run(fileConfig: ExternalTaskRunnerConfiguration): ParseResult {
let context: ParseContext = { logger: this.logger, validationStatus: this.validationStatus, namedProblemMatchers: undefined, isTermnial: fileConfig._runner === 'terminal' };
let engine = ExecutionEngine.from(fileConfig);
let context: ParseContext = { logger: this.logger, validationStatus: this.validationStatus, namedProblemMatchers: undefined, isTermnial: engine === ExecutionEngine.Terminal };
return {
validationStatus: this.validationStatus,
configuration: this.createTaskRunnerConfiguration(fileConfig, context),
engine
};
}
......
......@@ -290,15 +290,4 @@ export interface ITaskSystem extends IEventEmitter {
canAutoTerminate(): boolean;
terminate(): TPromise<TerminateResponse>;
tasks(): TPromise<TaskDescription[]>;
}
/**
* Build configuration settings shared between program and
* service build systems.
*/
export interface TaskConfiguration {
/**
* The build system to use. If omitted program is used.
*/
_runner?: string;
}
\ No newline at end of file
......@@ -65,7 +65,7 @@ import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutpu
import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal';
import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TaskRunnerConfiguration, TaskConfiguration, TaskDescription, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem';
import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TaskRunnerConfiguration, TaskDescription, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem';
import { ITaskService, TaskServiceEvents } from 'vs/workbench/parts/tasks/common/taskService';
import { templates as taskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates';
......@@ -515,8 +515,9 @@ class TaskService extends EventEmitter implements ITaskService {
return;
}
if (this._inTerminal !== void 0) {
let config = this.configurationService.getConfiguration<TaskConfiguration>('tasks');
if (this._inTerminal && this.isRunnerConfig(config) || !this._inTerminal && this.isTerminalConfig(config)) {
let config = this.configurationService.getConfiguration<TaskConfig.ExternalTaskRunnerConfiguration>('tasks');
let engine = TaskConfig.ExecutionEngine.from(config);
if (this._inTerminal && engine === TaskConfig.ExecutionEngine.OutputPanel || !this._inTerminal && engine === TaskConfig.ExecutionEngine.Terminal) {
this.messageService.show(Severity.Info, nls.localize('TaskSystem.noHotSwap', 'Changing the task execution engine requires to restart VS Code. The change is ignored.'));
}
}
......@@ -613,7 +614,7 @@ class TaskService extends EventEmitter implements ITaskService {
this._taskSystemPromise = TPromise.as(this._taskSystem);
} else {
let hasError = false;
this._taskSystemPromise = TPromise.as(this.configurationService.getConfiguration<TaskConfiguration>('tasks')).then((config: TaskConfiguration) => {
this._taskSystemPromise = TPromise.as(this.configurationService.getConfiguration<TaskConfig.ExternalTaskRunnerConfiguration>('tasks')).then((config) => {
let parseErrors: string[] = config ? (<any>config).$parseErrors : null;
if (parseErrors) {
let isAffected = false;
......@@ -629,17 +630,17 @@ class TaskService extends EventEmitter implements ITaskService {
return TPromise.wrapError({});
}
}
let configPromise: TPromise<TaskConfiguration>;
let configPromise: TPromise<TaskConfig.ExternalTaskRunnerConfiguration>;
if (config) {
if (this.isRunnerConfig(config) && this.hasDetectorSupport(<TaskConfig.ExternalTaskRunnerConfiguration>config)) {
let fileConfig = <TaskConfig.ExternalTaskRunnerConfiguration>config;
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService, fileConfig).detect(true).then((value) => {
let engine = TaskConfig.ExecutionEngine.from(config);
if (engine === TaskConfig.ExecutionEngine.OutputPanel && this.hasDetectorSupport(config)) {
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService, config).detect(true).then((value) => {
hasError = this.printStderr(value.stderr);
let detectedConfig = value.config;
if (!detectedConfig) {
return config;
}
let result: TaskConfig.ExternalTaskRunnerConfiguration = Objects.clone(fileConfig);
let result: TaskConfig.ExternalTaskRunnerConfiguration = Objects.clone(config);
let configuredTasks: IStringDictionary<TaskConfig.TaskDescription> = Object.create(null);
if (!result.tasks) {
if (detectedConfig.tasks) {
......@@ -656,7 +657,7 @@ class TaskService extends EventEmitter implements ITaskService {
return result;
});
} else {
configPromise = TPromise.as<TaskConfiguration>(config);
configPromise = TPromise.as(config);
}
} else {
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => {
......@@ -670,7 +671,7 @@ class TaskService extends EventEmitter implements ITaskService {
throw new TaskError(Severity.Info, nls.localize('TaskSystem.noConfiguration', 'No task runner configured.'), TaskErrors.NotConfigured);
}
let result: ITaskSystem = null;
let parseResult = TaskConfig.parse(<TaskConfig.ExternalTaskRunnerConfiguration>config, this);
let parseResult = TaskConfig.parse(config, this);
if (!parseResult.validationStatus.isOK()) {
this.outputChannel.show(true);
hasError = true;
......@@ -678,11 +679,11 @@ class TaskService extends EventEmitter implements ITaskService {
if (parseResult.validationStatus.isFatal()) {
throw new TaskError(Severity.Error, nls.localize('TaskSystem.fatalError', 'The provided task configuration has validation errors. See tasks output log for details.'), TaskErrors.ConfigValidationError);
}
if (this.isRunnerConfig(config)) {
if (parseResult.engine === TaskConfig.ExecutionEngine.OutputPanel) {
this._inTerminal = false;
result = new ProcessRunnerSystem(parseResult.configuration, this.markerService, this.modelService,
this.telemetryService, this.outputService, this.configurationResolverService, TaskService.OutputChannelId, hasError);
} else if (this.isTerminalConfig(config)) {
} else if (parseResult.engine === TaskConfig.ExecutionEngine.Terminal) {
this._inTerminal = true;
result = new TerminalTaskSystem(
parseResult.configuration,
......@@ -710,7 +711,7 @@ class TaskService extends EventEmitter implements ITaskService {
}
private createConfiguration(): TPromise<TaskRunnerConfiguration> {
let config = this.configurationService.getConfiguration<TaskConfiguration>('tasks');
let config = this.configurationService.getConfiguration<TaskConfig.ExternalTaskRunnerConfiguration>('tasks');
let parseErrors: string[] = config ? (<any>config).$parseErrors : null;
if (parseErrors) {
let isAffected = false;
......@@ -726,17 +727,17 @@ class TaskService extends EventEmitter implements ITaskService {
return TPromise.wrapError(undefined);
}
}
let configPromise: TPromise<TaskConfiguration>;
let configPromise: TPromise<TaskConfig.ExternalTaskRunnerConfiguration>;
if (config) {
if (this.isRunnerConfig(config) && this.hasDetectorSupport(<TaskConfig.ExternalTaskRunnerConfiguration>config)) {
let fileConfig = <TaskConfig.ExternalTaskRunnerConfiguration>config;
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService, fileConfig).detect(true).then((value) => {
let engine = TaskConfig.ExecutionEngine.from(config);
if (engine === TaskConfig.ExecutionEngine.OutputPanel && this.hasDetectorSupport(config)) {
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService, config).detect(true).then((value) => {
this.printStderr(value.stderr);
let detectedConfig = value.config;
if (!detectedConfig) {
return config;
}
let result: TaskConfig.ExternalTaskRunnerConfiguration = Objects.clone(fileConfig);
let result: TaskConfig.ExternalTaskRunnerConfiguration = Objects.clone(config);
let configuredTasks: IStringDictionary<TaskConfig.TaskDescription> = Object.create(null);
if (!result.tasks) {
if (detectedConfig.tasks) {
......@@ -753,7 +754,7 @@ class TaskService extends EventEmitter implements ITaskService {
return result;
});
} else {
configPromise = TPromise.as<TaskConfiguration>(config);
configPromise = TPromise.as(config);
}
} else {
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => {
......@@ -765,7 +766,7 @@ class TaskService extends EventEmitter implements ITaskService {
if (!config) {
return undefined;
}
let parseResult = TaskConfig.parse(<TaskConfig.ExternalTaskRunnerConfiguration>config, this);
let parseResult = TaskConfig.parse(config, this);
if (!parseResult.validationStatus.isOK()) {
this.showOutput();
}
......@@ -789,14 +790,6 @@ class TaskService extends EventEmitter implements ITaskService {
return result;
}
private isRunnerConfig(config: TaskConfiguration): boolean {
return !config._runner || config._runner === 'program';
}
private isTerminalConfig(config: TaskConfiguration): boolean {
return config._runner === 'terminal';
}
public inTerminal(): boolean {
return this._inTerminal !== void 0 && this._inTerminal;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册