diff --git a/src/vs/workbench/api/electron-browser/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts index 9357fc0a0e1..2b774c47ce6 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -17,15 +17,14 @@ import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspac import { ContributedTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, - PresentationOptions, CommandOptions, CommandConfiguration, RuntimeType, CustomTask, TaskScope, TaskSource, TaskSourceKind, ExtensionTaskSource, RunOptions, TaskSet + PresentationOptions, CommandOptions, CommandConfiguration, RuntimeType, CustomTask, TaskScope, TaskSource, + TaskSourceKind, ExtensionTaskSource, RunOptions, TaskSet, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; import { ResolveSet, ResolvedVariables } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { ITaskService, TaskFilter, ITaskProvider } from 'vs/workbench/contrib/tasks/common/taskService'; -import { TaskDefinition } from 'vs/workbench/contrib/tasks/node/tasks'; - import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape, MainContext, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { diff --git a/src/vs/workbench/contrib/tasks/node/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts similarity index 99% rename from src/vs/workbench/contrib/tasks/node/taskConfiguration.ts rename to src/vs/workbench/contrib/tasks/common/taskConfiguration.ts index 87abcf0e24f..dad7b3896f5 100644 --- a/src/vs/workbench/contrib/tasks/node/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/common/taskConfiguration.ts @@ -18,11 +18,8 @@ import { } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; - -import * as Tasks from '../common/tasks'; -import { TaskDefinitionRegistry } from '../common/taskDefinitionRegistry'; - -import { TaskDefinition } from 'vs/workbench/contrib/tasks/node/tasks'; +import * as Tasks from './tasks'; +import { TaskDefinitionRegistry } from './taskDefinitionRegistry'; import { ConfiguredInput } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; export const enum ShellQuoting { @@ -1200,7 +1197,7 @@ namespace TaskDependency { if (Types.isString(external)) { return { workspaceFolder: context.workspaceFolder, task: external }; } else if (TaskIdentifier.is(external)) { - return { workspaceFolder: context.workspaceFolder, task: TaskDefinition.createTaskIdentifier(external as Tasks.TaskIdentifier, context.problemReporter) }; + return { workspaceFolder: context.workspaceFolder, task: Tasks.TaskDefinition.createTaskIdentifier(external as Tasks.TaskIdentifier, context.problemReporter) }; } else { return undefined; } @@ -1332,7 +1329,7 @@ namespace ConfiguringTask { )); return undefined; } - let taskIdentifier: Tasks.KeyedTaskIdentifier | undefined = TaskDefinition.createTaskIdentifier(identifier, context.problemReporter); + let taskIdentifier: Tasks.KeyedTaskIdentifier | undefined = Tasks.TaskDefinition.createTaskIdentifier(identifier, context.problemReporter); if (taskIdentifier === undefined) { context.problemReporter.error(nls.localize( 'ConfigurationParser.incorrectType', diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index 8290dacb207..4a75e83f7ae 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import * as Types from 'vs/base/common/types'; import { IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import * as Objects from 'vs/base/common/objects'; @@ -12,6 +13,7 @@ import { ProblemMatcher } from 'vs/workbench/contrib/tasks/common/problemMatcher import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; export const TASK_RUNNING_STATE = new RawContextKey('taskRunning', false); @@ -921,4 +923,76 @@ export namespace TaskEvent { return Object.freeze({ kind: TaskEventKind.Changed }); } } -} \ No newline at end of file +} + +export namespace KeyedTaskIdentifier { + function sortedStringify(literal: any): string { + const keys = Object.keys(literal).sort(); + let result: string = ''; + for (let position in keys) { + let stringified = literal[keys[position]]; + if (stringified instanceof Object) { + stringified = sortedStringify(test); + } else if (typeof stringified === 'string') { + stringified = stringified.replace(/,/g, ',,'); + } + result += keys[position] + ',' + stringified + ','; + } + return result; + } + export function create(value: TaskIdentifier): KeyedTaskIdentifier { + const resultKey = sortedStringify(value); + console.log(resultKey); + return { _key: resultKey, type: value.taskType }; + } +} + +export namespace TaskDefinition { + export function createTaskIdentifier(external: TaskIdentifier, reporter: { error(message: string): void; }): KeyedTaskIdentifier | undefined { + let definition = TaskDefinitionRegistry.get(external.type); + if (definition === undefined) { + // We have no task definition so we can't sanitize the literal. Take it as is + let copy = Objects.deepClone(external); + delete copy._key; + return KeyedTaskIdentifier.create(copy); + } + + let literal: { type: string;[name: string]: any } = Object.create(null); + literal.type = definition.taskType; + let required: Set = new Set(); + definition.required.forEach(element => required.add(element)); + + let properties = definition.properties; + for (let property of Object.keys(properties)) { + let value = external[property]; + if (value !== undefined && value !== null) { + literal[property] = value; + } else if (required.has(property)) { + let schema = properties[property]; + if (schema.default !== undefined) { + literal[property] = Objects.deepClone(schema.default); + } else { + switch (schema.type) { + case 'boolean': + literal[property] = false; + break; + case 'number': + case 'integer': + literal[property] = 0; + break; + case 'string': + literal[property] = ''; + break; + default: + reporter.error(nls.localize( + 'TaskDefinition.missingRequiredProperty', + 'Error: the task identifier \'{0}\' is missing the required property \'{1}\'. The task identifier will be ignored.', JSON.stringify(external, undefined, 0), property + )); + return undefined; + } + } + } + } + return KeyedTaskIdentifier.create(literal); + } +} diff --git a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts index 8051af8d1ff..1d3b93e0bb6 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts @@ -73,14 +73,13 @@ import { ITaskSystem, ITaskResolver, ITaskSummary, TaskExecuteKind, TaskError, T import { Task, CustomTask, ConfiguringTask, ContributedTask, InMemoryTask, TaskEvent, TaskEventKind, TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind, - TaskSorter, TaskIdentifier, KeyedTaskIdentifier, TASK_RUNNING_STATE, TaskRunSource + TaskSorter, TaskIdentifier, KeyedTaskIdentifier, TASK_RUNNING_STATE, TaskRunSource, + KeyedTaskIdentifier as NKeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; import { ITaskService, ITaskProvider, ProblemMatcherRunOptions, CustomizationProperties, TaskFilter, WorkspaceFolderTaskResult } from 'vs/workbench/contrib/tasks/common/taskService'; import { getTemplates as getTaskTemplates } from 'vs/workbench/contrib/tasks/common/taskTemplates'; -import { KeyedTaskIdentifier as NKeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/contrib/tasks/node/tasks'; - -import * as TaskConfig from '../node/taskConfiguration'; +import * as TaskConfig from '../common/taskConfiguration'; import { ProcessTaskSystem } from 'vs/workbench/contrib/tasks/node/processTaskSystem'; import { TerminalTaskSystem } from './terminalTaskSystem'; import { ProcessRunnerDetector } from 'vs/workbench/contrib/tasks/node/processRunnerDetector'; diff --git a/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts b/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts index 5399ba2ab23..eeb8a9774e2 100644 --- a/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts +++ b/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts @@ -14,7 +14,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import * as Tasks from '../common/tasks'; -import * as TaskConfig from './taskConfiguration'; +import * as TaskConfig from '../common/taskConfiguration'; const build = 'build'; const test = 'test'; diff --git a/src/vs/workbench/contrib/tasks/node/tasks.ts b/src/vs/workbench/contrib/tasks/node/tasks.ts deleted file mode 100644 index 49097ae2563..00000000000 --- a/src/vs/workbench/contrib/tasks/node/tasks.ts +++ /dev/null @@ -1,85 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; - -import * as Objects from 'vs/base/common/objects'; - -import { TaskIdentifier, KeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; -import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; - -namespace KeyedTaskIdentifier { - function sortedStringify(literal: any): string { - const keys = Object.keys(literal).sort(); - let result: string = ''; - for (let position in keys) { - let stringified = literal[keys[position]]; - if (stringified instanceof Object) { - stringified = sortedStringify(test); - } else if (typeof stringified === 'string') { - stringified = stringified.replace(/,/g, ',,'); - } - result += keys[position] + ',' + stringified + ','; - } - return result; - } - export function create(value: TaskIdentifier): KeyedTaskIdentifier { - const resultKey = sortedStringify(value); - console.log(resultKey); - return { _key: resultKey, type: value.taskType }; - } -} - -namespace TaskDefinition { - export function createTaskIdentifier(external: TaskIdentifier, reporter: { error(message: string): void; }): KeyedTaskIdentifier | undefined { - let definition = TaskDefinitionRegistry.get(external.type); - if (definition === undefined) { - // We have no task definition so we can't sanitize the literal. Take it as is - let copy = Objects.deepClone(external); - delete copy._key; - return KeyedTaskIdentifier.create(copy); - } - - let literal: { type: string;[name: string]: any } = Object.create(null); - literal.type = definition.taskType; - let required: Set = new Set(); - definition.required.forEach(element => required.add(element)); - - let properties = definition.properties; - for (let property of Object.keys(properties)) { - let value = external[property]; - if (value !== undefined && value !== null) { - literal[property] = value; - } else if (required.has(property)) { - let schema = properties[property]; - if (schema.default !== undefined) { - literal[property] = Objects.deepClone(schema.default); - } else { - switch (schema.type) { - case 'boolean': - literal[property] = false; - break; - case 'number': - case 'integer': - literal[property] = 0; - break; - case 'string': - literal[property] = ''; - break; - default: - reporter.error(nls.localize( - 'TaskDefinition.missingRequiredProperty', - 'Error: the task identifier \'{0}\' is missing the required property \'{1}\'. The task identifier will be ignored.', JSON.stringify(external, undefined, 0), property - )); - return undefined; - } - } - } - } - return KeyedTaskIdentifier.create(literal); - } -} - -export { KeyedTaskIdentifier, TaskDefinition }; diff --git a/src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts b/src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts index 181f65485d3..de2442738e2 100644 --- a/src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts +++ b/src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts @@ -13,7 +13,7 @@ import { ProblemMatcher, FileLocationKind, ProblemPattern, ApplyToKind } from 'v import { IWorkspaceFolder, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import * as Tasks from 'vs/workbench/contrib/tasks/common/tasks'; -import { parse, ParseResult, IProblemReporter, ExternalTaskRunnerConfiguration, CustomTask } from 'vs/workbench/contrib/tasks/node/taskConfiguration'; +import { parse, ParseResult, IProblemReporter, ExternalTaskRunnerConfiguration, CustomTask } from 'vs/workbench/contrib/tasks/common/taskConfiguration'; const workspaceFolder: IWorkspaceFolder = new WorkspaceFolder({ uri: URI.file('/workspace/folderOne'),