From 3de1f2eb67c9741a18fb6f07b4a1f7694198e838 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 5 Sep 2022 12:28:48 +0200 Subject: [PATCH 1/4] debt: lazy creation of services in config --- .../configuration/browser/configuration.ts | 4 +-- .../browser/configurationService.ts | 34 ++++++++----------- ...tingService.ts => configurationEditing.ts} | 2 +- ...e.test.ts => configurationEditing.test.ts} | 8 ++--- .../test/browser/configurationService.test.ts | 2 +- 5 files changed, 22 insertions(+), 28 deletions(-) rename src/vs/workbench/services/configuration/common/{configurationEditingService.ts => configurationEditing.ts} (99%) rename src/vs/workbench/services/configuration/test/browser/{configurationEditingService.test.ts => configurationEditing.test.ts} (98%) diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index e3c1a130ed4df..e887c0d4f63d5 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -13,7 +13,6 @@ import { ConfigurationModel, ConfigurationModelParser, ConfigurationParseOptions import { WorkspaceConfigurationModelParser, StandaloneConfigurationModelParser } from 'vs/workbench/services/configuration/common/configurationModels'; import { TASKS_CONFIGURATION_KEY, FOLDER_SETTINGS_NAME, LAUNCH_CONFIGURATION_KEY, IConfigurationCache, ConfigurationKey, REMOTE_MACHINE_SCOPES, FOLDER_SCOPES, WORKSPACE_SCOPES } from 'vs/workbench/services/configuration/common/configuration'; import { IStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; -import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { WorkbenchState, IWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ConfigurationScope, Extensions, IConfigurationRegistry, OVERRIDE_PROPERTY_REGEX } from 'vs/platform/configuration/common/configurationRegistry'; import { equals } from 'vs/base/common/objects'; @@ -27,6 +26,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { isObject } from 'vs/base/common/types'; import { DefaultConfiguration as BaseDefaultConfiguration } from 'vs/platform/configuration/common/configurations'; +import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; export class DefaultConfiguration extends BaseDefaultConfiguration { @@ -629,7 +629,7 @@ export class WorkspaceConfiguration extends Disposable { return this._workspaceConfiguration.getFolders(); } - setFolders(folders: IStoredWorkspaceFolder[], jsonEditingService: JSONEditingService): Promise { + setFolders(folders: IStoredWorkspaceFolder[], jsonEditingService: IJSONEditingService): Promise { if (this._workspaceIdentifier) { return jsonEditingService.write(this._workspaceIdentifier.configPath, [{ path: ['folders'], value: folders }], true) .then(() => this.reload()); diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index bda82bf51a317..5becbdc5f9efd 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -20,9 +20,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions, allSettings, windowSettings, resourceSettings, applicationSettings, machineSettings, machineOverridableSettings, ConfigurationScope, IConfigurationPropertySchema, keyFromOverrideIdentifiers, OVERRIDE_PROPERTY_PATTERN, resourceLanguageSettingsSchemaId, configurationDefaultsSchemaId } from 'vs/platform/configuration/common/configurationRegistry'; import { IStoredWorkspaceFolder, isStoredWorkspaceFolder, IWorkspaceFolderCreationData, getStoredWorkspaceFolder, toWorkspaceFolders } from 'vs/platform/workspaces/common/workspaces'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ConfigurationEditingService, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditingService'; +import { ConfigurationEditing, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { WorkspaceConfiguration, FolderConfiguration, RemoteUserConfiguration, UserConfiguration, DefaultConfiguration } from 'vs/workbench/services/configuration/browser/configuration'; -import { JSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditingService'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import { mark } from 'vs/base/common/performance'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; @@ -45,6 +44,7 @@ import { IPolicyService, NullPolicyService } from 'vs/platform/policy/common/pol import { IUserDataProfile, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { updateIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge'; import { VSBuffer } from 'vs/base/common/buffer'; +import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; function getLocalUserConfigurationScopes(userDataProfile: IUserDataProfile, hasRemote: boolean): ConfigurationScope[] | undefined { return userDataProfile.isDefault @@ -100,11 +100,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat private readonly configurationRegistry: IConfigurationRegistry; - // TODO@sandeep debt with cyclic dependencies - private configurationEditingService!: ConfigurationEditingService; - private jsonEditingService!: JSONEditingService; - private cyclicDependencyReady!: Function; - private cyclicDependency = new Promise(resolve => this.cyclicDependencyReady = resolve); + private instantiationService: IInstantiationService | undefined; constructor( { remoteAuthority, configurationCache }: { remoteAuthority?: string; configurationCache: IConfigurationCache }, @@ -207,7 +203,6 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat } public async updateFolders(foldersToAdd: IWorkspaceFolderCreationData[], foldersToRemove: URI[], index?: number): Promise { - await this.cyclicDependency; return this.workspaceEditingQueue.queue(() => this.doUpdateFolders(foldersToAdd, foldersToRemove, index)); } @@ -303,8 +298,11 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat } private async setFolders(folders: IStoredWorkspaceFolder[]): Promise { - await this.cyclicDependency; - await this.workspaceConfiguration.setFolders(folders, this.jsonEditingService); + if (!this.instantiationService) { + throw new Error('Cannot update workspace folders because workspace service is not yet read to accept writes.'); + } + + await this.instantiationService.invokeFunction(accessor => this.workspaceConfiguration.setFolders(folders, accessor.get(IJSONEditingService))); return this.onWorkspaceConfigurationChanged(false); } @@ -333,7 +331,6 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat updateValue(key: string, value: any, target: ConfigurationTarget): Promise; updateValue(key: string, value: any, overrides: IConfigurationOverrides | IConfigurationUpdateOverrides, target: ConfigurationTarget, donotNotifyError?: boolean): Promise; async updateValue(key: string, value: any, arg3?: any, arg4?: any, donotNotifyError?: any): Promise { - await this.cyclicDependency; const overrides: IConfigurationUpdateOverrides | undefined = isConfigurationUpdateOverrides(arg3) ? arg3 : isConfigurationOverrides(arg3) ? { resource: arg3.resource, overrideIdentifiers: arg3.overrideIdentifier ? [arg3.overrideIdentifier] : undefined } : undefined; const target: ConfigurationTarget | undefined = overrides ? arg4 : arg3; @@ -482,14 +479,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat } acquireInstantiationService(instantiationService: IInstantiationService): void { - this.configurationEditingService = instantiationService.createInstance(ConfigurationEditingService); - this.jsonEditingService = instantiationService.createInstance(JSONEditingService); - - if (this.cyclicDependencyReady) { - this.cyclicDependencyReady(); - } else { - this.cyclicDependency = Promise.resolve(undefined); - } + this.instantiationService = instantiationService; } private async createWorkspace(arg: IAnyWorkspaceIdentifier): Promise { @@ -981,6 +971,10 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat } private async writeConfigurationValue(key: string, value: any, target: ConfigurationTarget, overrides: IConfigurationUpdateOverrides | undefined, donotNotifyError: boolean): Promise { + if (!this.instantiationService) { + throw new Error('Cannot write configuration because the configuration service is not yet ready to accept writes.'); + } + if (target === ConfigurationTarget.DEFAULT) { throw new Error('Invalid configuration target'); } @@ -1001,7 +995,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat throw new Error('Invalid configuration target'); } - await this.configurationEditingService.writeConfiguration(editableConfigurationTarget, { key, value }, { scopes: overrides, donotNotifyError }); + await this.instantiationService.createInstance(ConfigurationEditing).writeConfiguration(editableConfigurationTarget, { key, value }, { scopes: overrides, donotNotifyError }); switch (editableConfigurationTarget) { case EditableConfigurationTarget.USER_LOCAL: if (this.applicationConfiguration && this.configurationRegistry.getConfigurationProperties()[key].scope === ConfigurationScope.APPLICATION) { diff --git a/src/vs/workbench/services/configuration/common/configurationEditingService.ts b/src/vs/workbench/services/configuration/common/configurationEditing.ts similarity index 99% rename from src/vs/workbench/services/configuration/common/configurationEditingService.ts rename to src/vs/workbench/services/configuration/common/configurationEditing.ts index fc5491281b105..369bc333449af 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditing.ts @@ -144,7 +144,7 @@ interface ConfigurationEditingOptions extends IConfigurationEditingOptions { handleDirtyFile?: 'save' | 'revert'; } -export class ConfigurationEditingService { +export class ConfigurationEditing { public _serviceBrand: undefined; diff --git a/src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts similarity index 98% rename from src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts rename to src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts index 867ff2532bf1c..2bd07c328ee8b 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts @@ -14,7 +14,7 @@ import { TestEnvironmentService, TestTextFileService, workbenchInstantiationServ import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; -import { ConfigurationEditingService, ConfigurationEditingErrorCode, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditingService'; +import { ConfigurationEditing, ConfigurationEditingErrorCode, EditableConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { WORKSPACE_STANDALONE_CONFIGURATIONS, FOLDER_SETTINGS_PATH, USER_STANDALONE_CONFIGURATIONS, IConfigurationCache } from 'vs/workbench/services/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; @@ -56,14 +56,14 @@ export class ConfigurationCache implements IConfigurationCache { async remove(): Promise { } } -suite('ConfigurationEditingService', () => { +suite('ConfigurationEditing', () => { let instantiationService: TestInstantiationService; let userDataProfileService: IUserDataProfileService; let environmentService: IWorkbenchEnvironmentService; let fileService: IFileService; let workspaceService: WorkspaceService; - let testObject: ConfigurationEditingService; + let testObject: ConfigurationEditing; const disposables = new DisposableStore(); @@ -130,7 +130,7 @@ suite('ConfigurationEditingService', () => { instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService))); instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService))); instantiationService.stub(ICommandService, CommandService); - testObject = instantiationService.createInstance(ConfigurationEditingService); + testObject = instantiationService.createInstance(ConfigurationEditing); }); teardown(() => disposables.clear()); diff --git a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts index fb05bed96f1e9..e74a817d1aed0 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts @@ -10,7 +10,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, keyFromOverrideIdentifiers } from 'vs/platform/configuration/common/configurationRegistry'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; -import { ConfigurationEditingErrorCode } from 'vs/workbench/services/configuration/common/configurationEditingService'; +import { ConfigurationEditingErrorCode } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent, ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace'; import { ConfigurationTarget, IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; From bf8b0469a866edf61ddf2c693613254a30256eed Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 5 Sep 2022 12:31:42 +0200 Subject: [PATCH 2/4] spell check --- .../services/configuration/browser/configurationService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 5becbdc5f9efd..b68cf8ab31029 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -299,7 +299,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat private async setFolders(folders: IStoredWorkspaceFolder[]): Promise { if (!this.instantiationService) { - throw new Error('Cannot update workspace folders because workspace service is not yet read to accept writes.'); + throw new Error('Cannot update workspace folders because workspace service is not yet ready to accept writes.'); } await this.instantiationService.invokeFunction(accessor => this.workspaceConfiguration.setFolders(folders, accessor.get(IJSONEditingService))); From 648a6ab42122f702ad10f32ebb6fa3ddb8ea5474 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 5 Sep 2022 12:37:50 +0200 Subject: [PATCH 3/4] use same instance of ConfigurationEditing --- .../services/configuration/browser/configurationService.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index b68cf8ab31029..d933dffbca5c8 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -101,6 +101,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat private readonly configurationRegistry: IConfigurationRegistry; private instantiationService: IInstantiationService | undefined; + private configurationEditing: ConfigurationEditing | undefined; constructor( { remoteAuthority, configurationCache }: { remoteAuthority?: string; configurationCache: IConfigurationCache }, @@ -995,7 +996,9 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat throw new Error('Invalid configuration target'); } - await this.instantiationService.createInstance(ConfigurationEditing).writeConfiguration(editableConfigurationTarget, { key, value }, { scopes: overrides, donotNotifyError }); + // Use same instance of ConfigurationEditing to make sure all writes go through the same queue + this.configurationEditing = this.configurationEditing ?? this.instantiationService.createInstance(ConfigurationEditing); + await this.configurationEditing.writeConfiguration(editableConfigurationTarget, { key, value }, { scopes: overrides, donotNotifyError }); switch (editableConfigurationTarget) { case EditableConfigurationTarget.USER_LOCAL: if (this.applicationConfiguration && this.configurationRegistry.getConfigurationProperties()[key].scope === ConfigurationScope.APPLICATION) { From 1aa855e259e0259ea08df4865f78db57c8f8276d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 5 Sep 2022 17:40:18 +0200 Subject: [PATCH 4/4] fix unit tests --- .../configuration/browser/configurationService.ts | 4 ++-- .../configuration/common/configurationEditing.ts | 9 +-------- .../test/browser/configurationEditing.test.ts | 2 +- .../test/browser/configurationService.test.ts | 5 ++++- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index d933dffbca5c8..ed219b3524285 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -109,7 +109,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat private readonly userDataProfileService: IUserDataProfileService, private readonly userDataProfilesService: IUserDataProfilesService, private readonly fileService: IFileService, - remoteAgentService: IRemoteAgentService, + private readonly remoteAgentService: IRemoteAgentService, private readonly uriIdentityService: IUriIdentityService, private readonly logService: ILogService, policyService: IPolicyService @@ -997,7 +997,7 @@ export class WorkspaceService extends Disposable implements IWorkbenchConfigurat } // Use same instance of ConfigurationEditing to make sure all writes go through the same queue - this.configurationEditing = this.configurationEditing ?? this.instantiationService.createInstance(ConfigurationEditing); + this.configurationEditing = this.configurationEditing ?? this.instantiationService.createInstance(ConfigurationEditing, (await this.remoteAgentService.getEnvironment())?.settingsPath ?? null); await this.configurationEditing.writeConfiguration(editableConfigurationTarget, { key, value }, { scopes: overrides, donotNotifyError }); switch (editableConfigurationTarget) { case EditableConfigurationTarget.USER_LOCAL: diff --git a/src/vs/workbench/services/configuration/common/configurationEditing.ts b/src/vs/workbench/services/configuration/common/configurationEditing.ts index 369bc333449af..73ca3d0bc65e2 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditing.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditing.ts @@ -21,7 +21,6 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IOpenSettingsOptions, IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { withUndefinedAsNull, withNullAsUndefined } from 'vs/base/common/types'; -import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { ITextModel } from 'vs/editor/common/model'; import { IReference } from 'vs/base/common/lifecycle'; @@ -149,9 +148,9 @@ export class ConfigurationEditing { public _serviceBrand: undefined; private queue: Queue; - private remoteSettingsResource: URI | null = null; constructor( + private readonly remoteSettingsResource: URI | null, @IConfigurationService private readonly configurationService: IConfigurationService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IUserDataProfileService private readonly userDataProfileService: IUserDataProfileService, @@ -162,15 +161,9 @@ export class ConfigurationEditing { @INotificationService private readonly notificationService: INotificationService, @IPreferencesService private readonly preferencesService: IPreferencesService, @IEditorService private readonly editorService: IEditorService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService, @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, ) { this.queue = new Queue(); - remoteAgentService.getEnvironment().then(environment => { - if (environment) { - this.remoteSettingsResource = environment.settingsPath; - } - }); } async writeConfiguration(target: EditableConfigurationTarget, value: IConfigurationValue, options: IConfigurationEditingOptions = {}): Promise { diff --git a/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts index 2bd07c328ee8b..f4d026d59e434 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationEditing.test.ts @@ -130,7 +130,7 @@ suite('ConfigurationEditing', () => { instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService))); instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService))); instantiationService.stub(ICommandService, CommandService); - testObject = instantiationService.createInstance(ConfigurationEditing); + testObject = instantiationService.createInstance(ConfigurationEditing, null); }); teardown(() => disposables.clear()); diff --git a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts index e74a817d1aed0..16385a9895a5f 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts @@ -271,6 +271,7 @@ suite('WorkspaceContextService - Workspace Editing', () => { await testObject.initialize(getWorkspaceIdentifier(configResource)); instantiationService.stub(ITextFileService, disposables.add(instantiationService.createInstance(TestTextFileService))); instantiationService.stub(ITextModelService, disposables.add(instantiationService.createInstance(TextModelResolverService))); + instantiationService.stub(IJSONEditingService, instantiationService.createInstance(JSONEditingService)); testObject.acquireInstantiationService(instantiationService); }); @@ -1636,10 +1637,11 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IKeybindingEditingService, instantiationService.createInstance(KeybindingsEditingService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); + jsonEditingServce = instantiationService.createInstance(JSONEditingService); + instantiationService.stub(IJSONEditingService, jsonEditingServce); workspaceService.acquireInstantiationService(instantiationService); workspaceContextService = workspaceService; - jsonEditingServce = instantiationService.createInstance(JSONEditingService); testObject = workspaceService; }); @@ -2299,6 +2301,7 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { await testObject.initialize(convertToWorkspacePayload(folder)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); + instantiationService.stub(IJSONEditingService, instantiationService.createInstance(JSONEditingService)); testObject.acquireInstantiationService(instantiationService); }