Skip to content

Commit 5bca175

Browse files
committed
JSONEditingService: update multiple value
1 parent 8fbdeb7 commit 5bca175

9 files changed

Lines changed: 35 additions & 31 deletions

File tree

src/vs/workbench/contrib/extensions/browser/extensionsActions.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,13 +2049,13 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio
20492049
removeFrom = removeFrom.filter(x => x.toLowerCase() !== extensionIdLowerCase);
20502050

20512051
return this.jsonEditingService.write(workspaceConfigurationFile,
2052-
{
2052+
[{
20532053
key: 'extensions',
20542054
value: {
20552055
recommendations: shouldRecommend ? insertInto : removeFrom,
20562056
unwantedRecommendations: shouldRecommend ? removeFrom : insertInto
20572057
}
2058-
},
2058+
}],
20592059
true);
20602060
});
20612061
}
@@ -2078,19 +2078,19 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio
20782078
if (removeFrom.some(e => e.toLowerCase() === extensionIdLowerCase)) {
20792079
removeFrom = removeFrom.filter(x => x.toLowerCase() !== extensionIdLowerCase);
20802080
removeFromPromise = this.jsonEditingService.write(extensionsFileResource,
2081-
{
2081+
[{
20822082
key: shouldRecommend ? 'unwantedRecommendations' : 'recommendations',
20832083
value: removeFrom
2084-
},
2084+
}],
20852085
true);
20862086
}
20872087

20882088
return removeFromPromise.then(() =>
20892089
this.jsonEditingService.write(extensionsFileResource,
2090-
{
2090+
[{
20912091
key: shouldRecommend ? 'recommendations' : 'unwantedRecommendations',
20922092
value: insertInto
2093-
},
2093+
}],
20942094
true)
20952095
);
20962096
});
@@ -2115,7 +2115,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio
21152115
.then(content => {
21162116
const workspaceRecommendations = <IExtensionsConfigContent>json.parse(content.value.toString())['extensions'];
21172117
if (!workspaceRecommendations || !workspaceRecommendations.recommendations) {
2118-
return this.jsonEditingService.write(workspaceConfigurationFile, { key: 'extensions', value: { recommendations: [] } }, true)
2118+
return this.jsonEditingService.write(workspaceConfigurationFile, [{ key: 'extensions', value: { recommendations: [] } }], true)
21192119
.then(() => this.fileService.readFile(workspaceConfigurationFile));
21202120
}
21212121
return content;

src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo
7979
[{
8080
label: updateAndRestart ? localize('yes', "Yes") : localize('restart now', "Restart Now"),
8181
run: () => {
82-
const updatePromise = updateAndRestart ? this.jsonEditingService.write(this.environmentService.localeResource, { key: 'locale', value: locale }, true) : Promise.resolve(undefined);
82+
const updatePromise = updateAndRestart ? this.jsonEditingService.write(this.environmentService.localeResource, [{ key: 'locale', value: locale }], true) : Promise.resolve(undefined);
8383
updatePromise.then(() => this.windowsService.relaunch({}), e => this.notificationService.error(e));
8484
}
8585
}],

src/vs/workbench/contrib/localizations/browser/localizationsActions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class ConfigureLocaleAction extends Action {
6565
}
6666

6767
if (selectedLanguage) {
68-
await this.jsonEditingService.write(this.environmentService.localeResource, { key: 'locale', value: selectedLanguage.label }, true);
68+
await this.jsonEditingService.write(this.environmentService.localeResource, [{ key: 'locale', value: selectedLanguage.label }], true);
6969
const restart = await this.dialogService.confirm({
7070
type: 'info',
7171
message: localize('relaunchDisplayLanguageMessage', "A restart is required for the change in display language to take effect."),

src/vs/workbench/services/configuration/browser/configuration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ export class WorkspaceConfiguration extends Disposable {
337337

338338
setFolders(folders: IStoredWorkspaceFolder[], jsonEditingService: JSONEditingService): Promise<void> {
339339
if (this._workspaceIdentifier) {
340-
return jsonEditingService.write(this._workspaceIdentifier.configPath, { key: 'folders', value: folders }, true)
340+
return jsonEditingService.write(this._workspaceIdentifier.configPath, [{ key: 'folders', value: folders }], true)
341341
.then(() => this.reload());
342342
}
343343
return Promise.resolve();

src/vs/workbench/services/configuration/common/jsonEditing.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ export interface IJSONEditingService {
3636

3737
_serviceBrand: undefined;
3838

39-
write(resource: URI, value: IJSONValue, save: boolean): Promise<void>;
39+
write(resource: URI, values: IJSONValue[], save: boolean): Promise<void>;
4040
}

src/vs/workbench/services/configuration/common/jsonEditingService.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,24 @@ export class JSONEditingService implements IJSONEditingService {
3535
this.queue = new Queue<void>();
3636
}
3737

38-
write(resource: URI, value: IJSONValue, save: boolean): Promise<void> {
39-
return Promise.resolve(this.queue.queue(() => this.doWriteConfiguration(resource, value, save))); // queue up writes to prevent race conditions
38+
write(resource: URI, values: IJSONValue[], save: boolean): Promise<void> {
39+
return Promise.resolve(this.queue.queue(() => this.doWriteConfiguration(resource, values, save))); // queue up writes to prevent race conditions
4040
}
4141

42-
private async doWriteConfiguration(resource: URI, value: IJSONValue, save: boolean): Promise<void> {
42+
private async doWriteConfiguration(resource: URI, values: IJSONValue[], save: boolean): Promise<void> {
4343
const reference = await this.resolveAndValidate(resource, save);
44-
await this.writeToBuffer(reference.object.textEditorModel, value);
44+
await this.writeToBuffer(reference.object.textEditorModel, values);
4545

4646
reference.dispose();
4747
}
4848

49-
private async writeToBuffer(model: ITextModel, value: IJSONValue): Promise<any> {
50-
const edit = this.getEdits(model, value)[0];
51-
if (this.applyEditsToBuffer(edit, model)) {
49+
private async writeToBuffer(model: ITextModel, values: IJSONValue[]): Promise<any> {
50+
let hasEdits: boolean = false;
51+
for (const value of values) {
52+
const edit = this.getEdits(model, value)[0];
53+
hasEdits = this.applyEditsToBuffer(edit, model);
54+
}
55+
if (hasEdits) {
5256
return this.textFileService.save(model.uri);
5357
}
5458
}
@@ -133,4 +137,4 @@ export class JSONEditingService implements IJSONEditingService {
133137
}
134138
}
135139

136-
registerSingleton(IJSONEditingService, JSONEditingService, true);
140+
registerSingleton(IJSONEditingService, JSONEditingService, true);

src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,21 +1161,21 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
11611161

11621162
test('application settings are not read from workspace', () => {
11631163
fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.applicationSetting": "userValue" }');
1164-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }, true)
1164+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }], true)
11651165
.then(() => testObject.reloadConfiguration())
11661166
.then(() => assert.equal(testObject.getValue('configurationService.workspace.applicationSetting'), 'userValue'));
11671167
});
11681168

11691169
test('machine settings are not read from workspace', () => {
11701170
fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.machineSetting": "userValue" }');
1171-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }, true)
1171+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }], true)
11721172
.then(() => testObject.reloadConfiguration())
11731173
.then(() => assert.equal(testObject.getValue('configurationService.workspace.machineSetting'), 'userValue'));
11741174
});
11751175

11761176
test('workspace settings override user settings after defaults are registered ', () => {
11771177
fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.newSetting": "userValue" }');
1178-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.newSetting': 'workspaceValue' } }, true)
1178+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.newSetting': 'workspaceValue' } }], true)
11791179
.then(() => testObject.reloadConfiguration())
11801180
.then(() => {
11811181
configurationRegistry.registerConfiguration({
@@ -1194,7 +1194,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
11941194

11951195
test('workspace settings override user settings after defaults are registered for machine overridable settings ', () => {
11961196
fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.newMachineOverridableSetting": "userValue" }');
1197-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.newMachineOverridableSetting': 'workspaceValue' } }, true)
1197+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.newMachineOverridableSetting': 'workspaceValue' } }], true)
11981198
.then(() => testObject.reloadConfiguration())
11991199
.then(() => {
12001200
configurationRegistry.registerConfiguration({
@@ -1268,7 +1268,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
12681268

12691269
test('resource setting in folder is read after it is registered later', () => {
12701270
fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewResourceSetting2": "workspaceFolderValue" }');
1271-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.testNewResourceSetting2': 'workspaceValue' } }, true)
1271+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testNewResourceSetting2': 'workspaceValue' } }], true)
12721272
.then(() => testObject.reloadConfiguration())
12731273
.then(() => {
12741274
configurationRegistry.registerConfiguration({
@@ -1288,7 +1288,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
12881288

12891289
test('machine overridable setting in folder is read after it is registered later', () => {
12901290
fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewMachineOverridableSetting2": "workspaceFolderValue" }');
1291-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.testNewMachineOverridableSetting2': 'workspaceValue' } }, true)
1291+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testNewMachineOverridableSetting2': 'workspaceValue' } }], true)
12921292
.then(() => testObject.reloadConfiguration())
12931293
.then(() => {
12941294
configurationRegistry.registerConfiguration({
@@ -1331,7 +1331,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
13311331
assert.equal(actual.workspaceFolder, undefined);
13321332
assert.equal(actual.value, 'userValue');
13331333

1334-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'settings', value: { 'configurationService.workspace.testResourceSetting': 'workspaceValue' } }, true)
1334+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testResourceSetting': 'workspaceValue' } }], true)
13351335
.then(() => testObject.reloadConfiguration())
13361336
.then(() => {
13371337
actual = testObject.inspect('configurationService.workspace.testResourceSetting');
@@ -1373,7 +1373,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
13731373
}
13741374
]
13751375
};
1376-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'launch', value: expectedLaunchConfiguration }, true)
1376+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'launch', value: expectedLaunchConfiguration }], true)
13771377
.then(() => testObject.reloadConfiguration())
13781378
.then(() => {
13791379
const actual = testObject.getValue('launch');
@@ -1398,7 +1398,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
13981398
}
13991399
]
14001400
};
1401-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'launch', value: expectedLaunchConfiguration }, true)
1401+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'launch', value: expectedLaunchConfiguration }], true)
14021402
.then(() => testObject.reloadConfiguration())
14031403
.then(() => {
14041404
const actual = testObject.inspect('launch').workspace;
@@ -1496,7 +1496,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => {
14961496
});
14971497

14981498
test('task configurations are not read from workspace', () => {
1499-
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, { key: 'tasks', value: { 'version': '1.0' } }, true)
1499+
return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'tasks', value: { 'version': '1.0' } }], true)
15001500
.then(() => testObject.reloadConfiguration())
15011501
.then(() => {
15021502
const actual = testObject.inspect('tasks.version');

src/vs/workbench/services/preferences/browser/preferencesService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
557557
return this.textFileService.read(workspaceConfig)
558558
.then(content => {
559559
if (Object.keys(parse(content.value)).indexOf('settings') === -1) {
560-
return this.jsonEditingService.write(resource, { key: 'settings', value: {} }, true).then(undefined, () => { });
560+
return this.jsonEditingService.write(resource, [{ key: 'settings', value: {} }], true).then(undefined, () => { });
561561
}
562562
return undefined;
563563
});

src/vs/workbench/services/workspace/browser/workspaceEditingService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService {
448448
}
449449
}
450450

451-
return this.jsonEditingService.write(toWorkspace.configPath, { key: 'settings', value: targetWorkspaceConfiguration }, true);
451+
return this.jsonEditingService.write(toWorkspace.configPath, [{ key: 'settings', value: targetWorkspaceConfiguration }], true);
452452
}
453453

454454
private getCurrentWorkspaceIdentifier(): IWorkspaceIdentifier | undefined {

0 commit comments

Comments
 (0)