Skip to content

Commit 72f9748

Browse files
authored
1 parent 2206e09 commit 72f9748

File tree

1 file changed

+60
-17
lines changed

1 file changed

+60
-17
lines changed

src/vs/workbench/services/extensionRecommendations/common/workspaceExtensionsConfig.ts

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { distinct, flatten } from 'vs/base/common/arrays';
77
import { Emitter, Event } from 'vs/base/common/event';
8-
import { parse } from 'vs/base/common/json';
8+
import { JSONPath, parse } from 'vs/base/common/json';
99
import { Disposable } from 'vs/base/common/lifecycle';
1010
import { getIconClasses } from 'vs/editor/common/services/getIconClasses';
1111
import { FileKind, IFileService } from 'vs/platform/files/common/files';
@@ -145,12 +145,20 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
145145
private async addOrRemoveWorkspaceFolderRecommendation(extensionId: string, workspaceFolder: IWorkspaceFolder, extensionsConfigContent: IExtensionsConfigContent, add: boolean): Promise<void> {
146146
const values: IJSONValue[] = [];
147147
if (add) {
148-
values.push({ path: ['recommendations'], value: [...extensionsConfigContent.recommendations || [], extensionId] });
149-
if (extensionsConfigContent.unwantedRecommendations && extensionsConfigContent.unwantedRecommendations.some(e => e === extensionId)) {
150-
values.push({ path: ['unwantedRecommendations'], value: extensionsConfigContent.unwantedRecommendations.filter(e => e !== extensionId) });
148+
if (Array.isArray(extensionsConfigContent.recommendations)) {
149+
values.push({ path: ['recommendations', -1], value: extensionId });
150+
} else {
151+
values.push({ path: ['recommendations'], value: [extensionId] });
152+
}
153+
const unwantedRecommendationEdit = this.getEditToRemoveValueFromArray(['unwantedRecommendations'], extensionsConfigContent.unwantedRecommendations, extensionId);
154+
if (unwantedRecommendationEdit) {
155+
values.push(unwantedRecommendationEdit);
151156
}
152157
} else if (extensionsConfigContent.recommendations) {
153-
values.push({ path: ['recommendations'], value: extensionsConfigContent.recommendations.filter(e => e !== extensionId) });
158+
const recommendationEdit = this.getEditToRemoveValueFromArray(['recommendations'], extensionsConfigContent.recommendations, extensionId);
159+
if (recommendationEdit) {
160+
values.push(recommendationEdit);
161+
}
154162
}
155163

156164
if (values.length) {
@@ -162,12 +170,21 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
162170
const values: IJSONValue[] = [];
163171
if (extensionsConfigContent) {
164172
if (add) {
165-
values.push({ path: ['extensions', 'recommendations'], value: [...extensionsConfigContent.recommendations || [], extensionId] });
166-
if (extensionsConfigContent.unwantedRecommendations && extensionsConfigContent.unwantedRecommendations.some(e => e === extensionId)) {
167-
values.push({ path: ['extensions', 'unwantedRecommendations'], value: extensionsConfigContent.unwantedRecommendations.filter(e => e !== extensionId) });
173+
const path: JSONPath = ['extensions', 'recommendations'];
174+
if (Array.isArray(extensionsConfigContent.recommendations)) {
175+
values.push({ path: [...path, -1], value: extensionId });
176+
} else {
177+
values.push({ path, value: [extensionId] });
178+
}
179+
const unwantedRecommendationEdit = this.getEditToRemoveValueFromArray(['extensions', 'unwantedRecommendations'], extensionsConfigContent.unwantedRecommendations, extensionId);
180+
if (unwantedRecommendationEdit) {
181+
values.push(unwantedRecommendationEdit);
168182
}
169183
} else if (extensionsConfigContent.recommendations) {
170-
values.push({ path: ['extensions', 'recommendations'], value: extensionsConfigContent.recommendations.filter(e => e !== extensionId) });
184+
const recommendationEdit = this.getEditToRemoveValueFromArray(['extensions', 'recommendations'], extensionsConfigContent.recommendations, extensionId);
185+
if (recommendationEdit) {
186+
values.push(recommendationEdit);
187+
}
171188
}
172189
} else if (add) {
173190
values.push({ path: ['extensions'], value: { recommendations: [extensionId] } });
@@ -181,12 +198,21 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
181198
private async addOrRemoveWorkspaceFolderUnwantedRecommendation(extensionId: string, workspaceFolder: IWorkspaceFolder, extensionsConfigContent: IExtensionsConfigContent, add: boolean): Promise<void> {
182199
const values: IJSONValue[] = [];
183200
if (add) {
184-
values.push({ path: ['unwantedRecommendations'], value: [...extensionsConfigContent.unwantedRecommendations || [], extensionId] });
185-
if (extensionsConfigContent.recommendations && extensionsConfigContent.recommendations.some(e => e === extensionId)) {
186-
values.push({ path: ['recommendations'], value: extensionsConfigContent.recommendations.filter(e => e !== extensionId) });
201+
const path: JSONPath = ['unwantedRecommendations'];
202+
if (Array.isArray(extensionsConfigContent.unwantedRecommendations)) {
203+
values.push({ path: [...path, -1], value: extensionId });
204+
} else {
205+
values.push({ path, value: [extensionId] });
206+
}
207+
const recommendationEdit = this.getEditToRemoveValueFromArray(['recommendations'], extensionsConfigContent.recommendations, extensionId);
208+
if (recommendationEdit) {
209+
values.push(recommendationEdit);
187210
}
188211
} else if (extensionsConfigContent.unwantedRecommendations) {
189-
values.push({ path: ['unwantedRecommendations'], value: extensionsConfigContent.unwantedRecommendations.filter(e => e !== extensionId) });
212+
const unwantedRecommendationEdit = this.getEditToRemoveValueFromArray(['unwantedRecommendations'], extensionsConfigContent.unwantedRecommendations, extensionId);
213+
if (unwantedRecommendationEdit) {
214+
values.push(unwantedRecommendationEdit);
215+
}
190216
}
191217
if (values.length) {
192218
return this.jsonEditingService.write(workspaceFolder.toResource(EXTENSIONS_CONFIG), values, true);
@@ -197,12 +223,21 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
197223
const values: IJSONValue[] = [];
198224
if (extensionsConfigContent) {
199225
if (add) {
200-
values.push({ path: ['extensions', 'unwantedRecommendations'], value: [...extensionsConfigContent.unwantedRecommendations || [], extensionId] });
201-
if (extensionsConfigContent.recommendations && extensionsConfigContent.recommendations.some(e => e === extensionId)) {
202-
values.push({ path: ['extensions', 'recommendations'], value: extensionsConfigContent.recommendations.filter(e => e !== extensionId) });
226+
const path: JSONPath = ['extensions', 'unwantedRecommendations'];
227+
if (Array.isArray(extensionsConfigContent.recommendations)) {
228+
values.push({ path: [...path, -1], value: extensionId });
229+
} else {
230+
values.push({ path, value: [extensionId] });
231+
}
232+
const recommendationEdit = this.getEditToRemoveValueFromArray(['extensions', 'recommendations'], extensionsConfigContent.recommendations, extensionId);
233+
if (recommendationEdit) {
234+
values.push(recommendationEdit);
203235
}
204236
} else if (extensionsConfigContent.unwantedRecommendations) {
205-
values.push({ path: ['extensions', 'unwantedRecommendations'], value: extensionsConfigContent.unwantedRecommendations.filter(e => e !== extensionId) });
237+
const unwantedRecommendationEdit = this.getEditToRemoveValueFromArray(['extensions', 'unwantedRecommendations'], extensionsConfigContent.unwantedRecommendations, extensionId);
238+
if (unwantedRecommendationEdit) {
239+
values.push(unwantedRecommendationEdit);
240+
}
206241
}
207242
} else if (add) {
208243
values.push({ path: ['extensions'], value: { unwantedRecommendations: [extensionId] } });
@@ -265,6 +300,14 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
265300
};
266301
}
267302

303+
private getEditToRemoveValueFromArray(path: JSONPath, array: string[] | undefined, value: string): IJSONValue | undefined {
304+
const index = array?.indexOf(value);
305+
if (index !== undefined && index !== -1) {
306+
return { path: [...path, index], value: undefined };
307+
}
308+
return undefined;
309+
}
310+
268311
}
269312

270313
registerSingleton(IWorkspaceExtensionsConfigService, WorkspaceExtensionsConfigService, InstantiationType.Delayed);

0 commit comments

Comments
 (0)