diff --git a/src/vs/workbench/services/configuration/common/configurationEditing.ts b/src/vs/workbench/services/configuration/common/configurationEditing.ts index 96e9fb440daef34bdbc580d169be5b2ae9c6ebbc..5cd14ca32295643014d3c1f0cd3ae971a4458cc3 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditing.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditing.ts @@ -18,14 +18,19 @@ export enum ConfigurationEditingErrorCode { ERROR_UNKNOWN_KEY, /** - * Error when trying to write a configuration key that is not supported for provided target. + * Error when trying to write an invalid folder configuration key to folder settings. */ - ERROR_INVALID_KEY, + ERROR_INVALID_FOLDER_CONFIGURATION, /** * Error when trying to write to user target but not supported for provided key. */ - ERROR_INVALID_TARGET, + ERROR_INVALID_USER_TARGET, + + /** + * Error when trying to write a configuration key to folder target + */ + ERROR_INVALID_FOLDER_TARGET, /** * Error when trying to write to the workspace configuration without having a workspace opened. diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index 4a01ed7b6475aeb69e1bde96edfd7713f2b04927..259864baf1c5f95a200e386eb7390c21e1bea772 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -153,22 +153,23 @@ export class ConfigurationEditingService implements IConfigurationEditingService this.commandService.executeCommand(ConfigurationTarget.USER === target ? 'workbench.action.openGlobalSettings' : 'workbench.action.openWorkspaceSettings'); } - private wrapError(code: ConfigurationEditingErrorCode, target: ConfigurationTarget): TPromise { - const message = this.toErrorMessage(code, target); + private wrapError(code: ConfigurationEditingErrorCode, target: ConfigurationTarget, operation: IConfigurationEditOperation): TPromise { + const message = this.toErrorMessage(code, target, operation); return TPromise.wrapError(new ConfigurationEditingError(message, code)); } - private toErrorMessage(error: ConfigurationEditingErrorCode, target: ConfigurationTarget): string { + private toErrorMessage(error: ConfigurationEditingErrorCode, target: ConfigurationTarget, operation: IConfigurationEditOperation): string { switch (error) { // API constraints - case ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY: return nls.localize('errorUnknownKey', "Unable to write to the configuration file (Unknown Key)"); - case ConfigurationEditingErrorCode.ERROR_INVALID_KEY: return nls.localize('errorInvalidKey', "Unable to write to the configuration file (Invalid Key)"); - case ConfigurationEditingErrorCode.ERROR_INVALID_TARGET: return nls.localize('errorInvalidTarget', "Unable to write to the configuration file (Invalid Target)"); + case ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY: return nls.localize('errorUnknownKey', "Unable to write to {0} because {1} is not a registered configuration.", this.stringifyTarget(target), operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION: return nls.localize('errorInvalidFolderConfiguration', "Unable to write to Folder Settings because {0} does not support the folder resource scope.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET: return nls.localize('errorInvalidUserTarget', "Unable to write to User Settings because {0} does not support for global scope.", operation.key); + case ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET: return nls.localize('errorInvalidFolderTarget', "Unable to write to Folder Settings because no resource is provided."); + case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return nls.localize('errorNoWorkspaceOpened', "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", this.stringifyTarget(target)); // User issues - case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return nls.localize('errorNoWorkspaceOpened', "Unable to write into settings because no workspace is opened. Please open a workspace first and try again."); case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { if (target === ConfigurationTarget.USER) { return nls.localize('errorInvalidConfiguration', "Unable to write into settings. Please open **User Settings** to correct errors/warnings in the file and try again."); @@ -186,6 +187,17 @@ export class ConfigurationEditingService implements IConfigurationEditingService } } + private stringifyTarget(target: ConfigurationTarget): string { + switch (target) { + case ConfigurationTarget.USER: + return nls.localize('userTarget', "User Settings"); + case ConfigurationTarget.WORKSPACE: + return nls.localize('workspaceTarget', "Workspace Settings"); + case ConfigurationTarget.FOLDER: + return nls.localize('folderTarget', "Folder Settings"); + } + } + private getEdits(model: editorCommon.IModel, edit: IConfigurationEditOperation): Edit[] { const { tabSize, insertSpaces } = model.getOptions(); const eol = model.getEOL(); @@ -229,28 +241,28 @@ export class ConfigurationEditingService implements IConfigurationEditingService if (!operation.isWorkspaceStandalone) { const validKeys = this.configurationService.keys().default; if (validKeys.indexOf(operation.key) < 0 && !OVERRIDE_PROPERTY_PATTERN.test(operation.key)) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_UNKNOWN_KEY, target, operation); } } // Target cannot be user if is standalone if (operation.isWorkspaceStandalone && target === ConfigurationTarget.USER) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_TARGET, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET, target, operation); } // Target cannot be workspace or folder if no workspace opened if ((target === ConfigurationTarget.WORKSPACE || target === ConfigurationTarget.FOLDER) && !this.contextService.hasWorkspace()) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, target, operation); } if (target === ConfigurationTarget.FOLDER) { if (!operation.resource) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_TARGET, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_TARGET, target, operation); } const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); if (configurationProperties[operation.key].scope !== ConfigurationScope.RESOURCE) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_KEY, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_FOLDER_CONFIGURATION, target, operation); } } @@ -259,12 +271,12 @@ export class ConfigurationEditingService implements IConfigurationEditingService const model = reference.object.textEditorModel; if (this.hasParseErrors(model, operation)) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, target, operation); } // Target cannot be dirty if not writing into buffer if (checkDirty && this.textFileService.isDirty(operation.resource)) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target); + return this.wrapError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target, operation); } return TPromise.wrap(reference); }); diff --git a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts index b2b7246fe27fcdf8b62e91f53aa7fb4b630897af..7224039236d59c532a18ea96cba4012040ee4fc3 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts @@ -178,7 +178,7 @@ suite('ConfigurationEditingService', () => { test('errors cases - invalid target', () => { return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'tasks.something', value: 'value' }) .then(() => assert.fail('Should fail with ERROR_INVALID_TARGET'), - (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_TARGET)); + (error: ConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_INVALID_USER_TARGET)); }); test('errors cases - no workspace', () => {