From 324f0ac20291f408bce94eb153441c70d1756279 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 28 Sep 2018 16:36:36 +0200 Subject: [PATCH] instat - use IdleValue and Proxy to delay service creations --- .../common/instantiationService.ts | 6 ++++- .../node/instantiationService.ts | 27 +++++++++++++++++++ src/vs/workbench/electron-browser/shell.ts | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/vs/platform/instantiation/node/instantiationService.ts diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 10b8b4161a0..a829e88f812 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -187,7 +187,7 @@ export class InstantiationService implements IInstantiationService { for (let { data } of roots) { // create instance and overwrite the service collections - const instance = this._createInstance(data.desc.ctor, data.desc.staticArguments, data._trace); + const instance = this._createServiceInstance(data.desc.ctor, data.desc.staticArguments, data._trace); this._setServiceInstance(data.id, instance); graph.removeNode(data); } @@ -195,6 +195,10 @@ export class InstantiationService implements IInstantiationService { return this._getServiceInstanceOrDescriptor(id); } + + protected _createServiceInstance(ctor: any, args: any[] = [], _trace: Trace): T { + return this._createInstance(ctor, args, _trace); + } } //#region -- tracing --- diff --git a/src/vs/platform/instantiation/node/instantiationService.ts b/src/vs/platform/instantiation/node/instantiationService.ts new file mode 100644 index 00000000000..d89da5291a4 --- /dev/null +++ b/src/vs/platform/instantiation/node/instantiationService.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { IdleValue } from 'vs/base/common/async'; +import { InstantiationService as BaseInstantiationService } from 'vs/platform/instantiation/common/instantiationService'; + +// 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 { + + protected _createServiceInstance(ctor: any, args: any[] = [], _trace): T { + return InstantiationService._newIdleProxyService(() => super._createServiceInstance(ctor, args, _trace)); + } + + private static _newIdleProxyService(executor: () => T): T { + const idle = new IdleValue(executor); + return new Proxy(Object.create(null), { + get(_target, prop) { + return idle.getValue()[prop]; + } + }); + } +} diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index f6f68725746..4654ca7b086 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -44,6 +44,7 @@ import { ExtensionService } from 'vs/workbench/services/extensions/electron-brow import { IStorageService } from 'vs/platform/storage/common/storage'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +// import { InstantiationService } from 'vs/platform/instantiation/node/instantiationService'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ILifecycleService, LifecyclePhase, ShutdownReason, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; -- GitLab