Skip to content

Commit e13f11d

Browse files
iterianiAndrewKushnir
authored andcommitted
refactor(core): Create a function convertToInjectOptions and convert back to an options. This allows seamless back and forth from bitflags and options. (angular#60192)
Note that we do have to keep converting back and forth, but we'll see if that's a problem. PR Close angular#60192
1 parent 92bb8d9 commit e13f11d

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

packages/core/src/di/injector_compatibility.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,11 @@ const DI_DECORATOR_FLAG = '__NG_DI_FLAG__';
5252
export class RetrievingInjector implements PrimitivesInjector {
5353
constructor(readonly injector: Injector) {}
5454
retrieve<T>(token: PrimitivesInjectionToken<T>, options: unknown): T | NotFound {
55-
let flags: InjectFlags;
56-
if (options && (options as {flags: InjectFlags}).flags) {
57-
flags = (options as {flags: InjectFlags}).flags;
58-
} else {
59-
flags = convertToBitFlags(options as InjectOptions | undefined) || InjectFlags.Default;
60-
}
55+
const flags: InjectFlags =
56+
convertToBitFlags(options as InjectOptions | undefined) || InjectFlags.Default;
6157
return this.injector.get(
6258
token as unknown as InjectionToken<T>,
59+
// When a dependency is requested with an optional flag, DI returns null as the default value.
6360
flags & InjectFlags.Optional ? null : undefined,
6461
flags,
6562
) as T;
@@ -88,7 +85,10 @@ export function injectInjectorOnly<T>(
8885
} else if (currentInjector === null) {
8986
return injectRootLimpMode(token, undefined, flags);
9087
} else {
91-
const value = currentInjector.retrieve(token as PrimitivesInjectionToken<T>, {flags}) as T;
88+
const value = currentInjector.retrieve(
89+
token as PrimitivesInjectionToken<T>,
90+
convertToInjectOptions(flags),
91+
) as T;
9292
ngDevMode && emitInjectEvent(token as Type<unknown>, value, flags);
9393
return value;
9494
}
@@ -301,6 +301,16 @@ export function convertToBitFlags(
301301
((flags.skipSelf && InternalInjectFlags.SkipSelf) as number)) as InjectFlags;
302302
}
303303

304+
// Converts bitflags to inject options
305+
function convertToInjectOptions(flags: InjectFlags): InjectOptions {
306+
return {
307+
optional: !!(flags & InternalInjectFlags.Optional),
308+
host: !!(flags & InternalInjectFlags.Host),
309+
self: !!(flags & InternalInjectFlags.Self),
310+
skipSelf: !!(flags & InternalInjectFlags.SkipSelf),
311+
};
312+
}
313+
304314
export function injectArgs(types: (ProviderToken<any> | any[])[]): any[] {
305315
const args: any[] = [];
306316
for (let i = 0; i < types.length; i++) {

packages/core/src/di/r3_injector.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,11 @@ export class R3Injector extends EnvironmentInjector implements PrimitivesInjecto
242242
}
243243

244244
retrieve<T>(token: PrimitivesInjectionToken<T>, options?: unknown): T | NotFound {
245-
let flags: InjectFlags;
246-
if (options && (options as {flags: InjectFlags}).flags) {
247-
flags = (options as {flags: InjectFlags}).flags;
248-
} else {
249-
flags = convertToBitFlags(options as InjectOptions | undefined) || InjectFlags.Default;
250-
}
245+
const flags: InjectFlags =
246+
convertToBitFlags(options as InjectOptions | undefined) || InjectFlags.Default;
251247
return this.get(
252248
token as unknown as InjectionToken<T>,
249+
// When a dependency is requested with an optional flag, DI returns null as the default value.
253250
flags & InjectFlags.Optional ? null : undefined,
254251
flags,
255252
);

0 commit comments

Comments
 (0)