From 76bdfc2500dc73f160ed42fa22a486fb9c4904fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Thu, 21 Jul 2022 12:16:57 +0200 Subject: [PATCH] chore: Add helper function --- src/tools/injection.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/tools/injection.ts diff --git a/src/tools/injection.ts b/src/tools/injection.ts new file mode 100644 index 00000000..f92de3c7 --- /dev/null +++ b/src/tools/injection.ts @@ -0,0 +1,25 @@ +import { BrandedService, IInstantiationService, _util } from 'vs/platform/instantiation/common/instantiation' + +function getInjectedParameters InstanceType> (instantiationService: IInstantiationService, ctor: Ctor) { + return instantiationService.invokeFunction((accessor) => { + return _util.getServiceDependencies(ctor).sort((a, b) => a.index - b.index).map(d => accessor.get(d.id)) + }) +} + +declare type GetLeadingNonServiceArgs = Args extends [...BrandedService[]] ? [] : Args extends [infer A, ...BrandedService[]] ? [A] : Args extends [infer A, ...infer R] ? [A, ...GetLeadingNonServiceArgs] : never + +/** + * Takes a class with injected services as parameters and returns a child class that only takes the injector as parameter + * @param ctor The class to inject + * @returns A class that only needs the injector + */ +export function createInjectedClass InstanceType>(ctor: Ctor): new (instantiationService: IInstantiationService, ...args: GetLeadingNonServiceArgs>) => InstanceType { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const _ctor = (ctor as (new (...args: any[]) => any)) + return class extends _ctor { + constructor (...args: any[]) { + super(...args.slice(1), ...getInjectedParameters(args[0], ctor)) + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any +}