From 489dfec1e94fcce83f165351f1b0f840d8b60104 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 4 Mar 2019 11:18:23 +0100 Subject: [PATCH] fix #69141 --- src/vs/code/electron-main/main.ts | 2 +- .../common/instantiationService.ts | 29 +++++++++++++- .../node/instantiationService.ts | 39 ------------------- src/vs/workbench/electron-browser/main.ts | 2 +- 4 files changed, 29 insertions(+), 43 deletions(-) delete mode 100644 src/vs/platform/instantiation/node/instantiationService.ts diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 49668099824..f89af11d2aa 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -16,7 +16,7 @@ import { LifecycleService, ILifecycleService } from 'vs/platform/lifecycle/elect import { Server, serve, connect } from 'vs/base/parts/ipc/node/ipc.net'; import { LaunchChannelClient } from 'vs/platform/launch/electron-main/launchService'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { InstantiationService } from 'vs/platform/instantiation/node/instantiationService'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ILogService, ConsoleLogMainService, MultiplexLogService, getLogLevel } from 'vs/platform/log/common/log'; diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 231666949c4..a0141e4853f 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -9,10 +9,17 @@ import { Graph } from 'vs/platform/instantiation/common/graph'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ServiceIdentifier, IInstantiationService, ServicesAccessor, _util, optional } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { IdleValue } from 'vs/base/common/async'; // TRACING const _enableTracing = false; +// PROXY +// Ghetto-declare of the global Proxy object. This isn't the proper way +// but allows us to run this code in the browser without IE11. +declare var Proxy: any; +const _canUseProxy = typeof Proxy === 'function'; + export class InstantiationService implements IInstantiationService { _serviceBrand: any; @@ -205,8 +212,26 @@ export class InstantiationService implements IInstantiationService { } } - protected _createServiceInstance(ctor: any, args: any[] = [], _supportsDelayedInstantiation: boolean, _trace: Trace): T { - return this._createInstance(ctor, args, _trace); + private _createServiceInstance(ctor: any, args: any[] = [], _supportsDelayedInstantiation: boolean, _trace: Trace): T { + if (!_supportsDelayedInstantiation || !_canUseProxy) { + // eager instantiation or no support JS proxies (e.g. IE11) + return this._createInstance(ctor, args, _trace); + + } else { + // Return a proxy object that's backed by an idle value. That + // strategy is to instantiate services in our idle time or when actually + // needed but not when injected into a consumer + const idle = new IdleValue(() => this._createInstance(ctor, args, _trace)); + return new Proxy(Object.create(null), { + get(_target: T, prop: PropertyKey): any { + return idle.getValue()[prop]; + }, + set(_target: T, p: PropertyKey, value: any): boolean { + idle.getValue()[p] = value; + return true; + } + }); + } } } diff --git a/src/vs/platform/instantiation/node/instantiationService.ts b/src/vs/platform/instantiation/node/instantiationService.ts deleted file mode 100644 index c888491b365..00000000000 --- a/src/vs/platform/instantiation/node/instantiationService.ts +++ /dev/null @@ -1,39 +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 { IdleValue } from 'vs/base/common/async'; -import { InstantiationService as BaseInstantiationService } from 'vs/platform/instantiation/common/instantiationService'; -import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; - -// this is in the /node/-layer because it depends on Proxy which isn't available -// in IE11 and therefore not in the /common/-layer - -export class InstantiationService extends BaseInstantiationService { - - createChild(services: ServiceCollection): IInstantiationService { - return new InstantiationService(services, this._strict, this); - } - - protected _createServiceInstance(ctor: any, args: any[] = [], supportsDelayedInstantiation: boolean, _trace): T { - if (supportsDelayedInstantiation) { - return InstantiationService._newIdleProxyService(() => super._createServiceInstance(ctor, args, supportsDelayedInstantiation, _trace)); - } else { - return super._createServiceInstance(ctor, args, supportsDelayedInstantiation, _trace); - } - } - - private static _newIdleProxyService(executor: () => T): T { - const idle = new IdleValue(executor); - return new Proxy(Object.create(null), { - get(_target: T, prop: PropertyKey): any { - return idle.getValue()[prop]; - }, - set(_target: T, p: PropertyKey, value: any): boolean { - idle.getValue()[p] = value; - return true; - } - }); - } -} diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 518080ab90d..258e2733a3f 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -47,7 +47,7 @@ import { GlobalStorageDatabaseChannelClient } from 'vs/platform/storage/node/sto import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { InstantiationService } from 'vs/platform/instantiation/node/instantiationService'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { Disposable } from 'vs/base/common/lifecycle'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; -- GitLab