From d6105f2f1f0bd006e2eb0e2c094af784145fdbe3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Sat, 23 Apr 2016 18:56:46 +0200 Subject: [PATCH] allow to create the instantiation service with a `strict` flag such that it throw on missing services, #5653 --- .../common/instantiationService.ts | 12 ++++++----- .../test/common/instantiationService.test.ts | 20 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 9a31d44c4e5..2ea01750fe7 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -19,9 +19,11 @@ export class InstantiationService implements IInstantiationService { serviceId: any; private _services: ServiceCollection; + private _strict: boolean; - constructor(services: ServiceCollection = new ServiceCollection()) { + constructor(services: ServiceCollection = new ServiceCollection(), strict: boolean = false) { this._services = services; + this._strict = strict; this._services.set(IInstantiationService, this); } @@ -32,7 +34,7 @@ export class InstantiationService implements IInstantiationService { services.set(id, thing); } }); - return new InstantiationService(services); + return new InstantiationService(services, this._strict); } invokeFunction(signature: (accessor: ServicesAccessor, ...more: any[]) => R, ...args: any[]): R { @@ -113,9 +115,9 @@ export class InstantiationService implements IInstantiationService { let serviceDependencies = _util.getServiceDependencies(desc.ctor).sort((a, b) => a.index - b.index); let serviceArgs = serviceDependencies.map(dependency => { let service = this._getOrCreateServiceInstance(dependency.id); - // if (!service && !dependency.optional) { - // throw new Error(`[createInstance] ${desc.ctor.name} depends on UNKNOWN service ${dependency.id}.`); - // } + if (!service && this._strict && !dependency.optional) { + throw new Error(`[createInstance] ${desc.ctor.name} depends on UNKNOWN service ${dependency.id}.`); + } return service; }); let firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : staticArgs.length; diff --git a/src/vs/platform/instantiation/test/common/instantiationService.test.ts b/src/vs/platform/instantiation/test/common/instantiationService.test.ts index 431db6e2699..3a5102c7005 100644 --- a/src/vs/platform/instantiation/test/common/instantiationService.test.ts +++ b/src/vs/platform/instantiation/test/common/instantiationService.test.ts @@ -87,12 +87,12 @@ class TargetWithStaticParam { } } -class TargetOptional1 { +class TargetNotOptional { constructor( @IService1 service1: IService1, @IService2 service2: IService2) { - assert.ok(false, 'should not be here'); + } } -class TargetOptional2 { +class TargetOptional { constructor( @IService1 service1: IService1, @optional(IService2) service2: IService2) { assert.ok(service1); assert.equal(service1.c, 1); @@ -200,13 +200,15 @@ suite('Instantiation Service', () => { }); test('@Param - optional', function () { - let collection = new ServiceCollection(); - let service = new InstantiationService(collection); - collection.set(IService1, new Service1()); - // service.addSingleton(IService2, new Service2()); + let collection = new ServiceCollection([IService1, new Service1()]); + let service = new InstantiationService(collection, true); - // assert.throws(() => service.createInstance(TargetOptional1)); - service.createInstance(TargetOptional2); + service.createInstance(TargetOptional); + assert.throws(() => service.createInstance(TargetNotOptional)); + + service = new InstantiationService(collection, false); + service.createInstance(TargetOptional); + service.createInstance(TargetNotOptional); }); // we made this a warning