| 
									
										
										
										
											2016-06-23 09:47:54 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 17:50:03 -07:00
										 |  |  | import {reflector} from '../reflection/reflection'; | 
					
						
							| 
									
										
										
										
											2016-08-10 18:21:28 -07:00
										 |  |  | import {Type} from '../type'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | import {resolveForwardRef} from './forward_ref'; | 
					
						
							| 
									
										
										
										
											2017-02-20 16:20:45 -08:00
										 |  |  | import {InjectionToken} from './injection_token'; | 
					
						
							|  |  |  | import {Inject, Optional, Self, SkipSelf} from './metadata'; | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | import {ClassProvider, ExistingProvider, FactoryProvider, Provider, TypeProvider, ValueProvider} from './provider'; | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  | import {invalidProviderError, mixingMultiProvidersWithRegularProvidersError, noAnnotationError} from './reflective_errors'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {ReflectiveKey} from './reflective_key'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | interface NormalizedProvider extends TypeProvider, ValueProvider, ClassProvider, ExistingProvider, | 
					
						
							|  |  |  |     FactoryProvider {} | 
					
						
							| 
									
										
										
										
											2016-08-10 18:21:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * `Dependency` is used by the framework to extend DI. | 
					
						
							|  |  |  |  * This is internal to Angular and should not be used directly. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export class ReflectiveDependency { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   constructor( | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |       public key: ReflectiveKey, public optional: boolean, public visibility: Self|SkipSelf|null) {} | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   static fromKey(key: ReflectiveKey): ReflectiveDependency { | 
					
						
							| 
									
										
										
										
											2017-01-25 17:21:54 -08:00
										 |  |  |     return new ReflectiveDependency(key, false, null); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 19:18:14 -07:00
										 |  |  | const _EMPTY_LIST: any[] = []; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * An internal resolved representation of a {@link Provider} used by the {@link Injector}. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * It is usually created automatically by `Injector.resolveAndCreate`. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * It can be created manually, as follows: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ### Example ([live demo](http://plnkr.co/edit/RfEnhh8kUEI0G3qsnIeT?p%3Dpreview&p=preview))
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ```typescript
 | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  |  * var resolvedProviders = Injector.resolve([{ provide: 'message', useValue: 'Hello' }]); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |  * var injector = Injector.fromResolvedProviders(resolvedProviders); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * expect(injector.get('message')).toEqual('Hello'); | 
					
						
							|  |  |  |  * ```
 | 
					
						
							| 
									
										
										
										
											2016-06-27 12:27:23 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @experimental | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | export interface ResolvedReflectiveProvider { | 
					
						
							|  |  |  |   /** | 
					
						
							| 
									
										
										
										
											2016-08-10 18:21:28 -07:00
										 |  |  |    * A key, usually a `Type<any>`. | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |    */ | 
					
						
							|  |  |  |   key: ReflectiveKey; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Factory function which can return an instance of an object represented by a key. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   resolvedFactories: ResolvedReflectiveFactory[]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Indicates if the provider is a multi-provider or a regular provider. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   multiProvider: boolean; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 16:53:09 -07:00
										 |  |  | export class ResolvedReflectiveProvider_ implements ResolvedReflectiveProvider { | 
					
						
							| 
									
										
										
										
											2017-09-15 16:12:02 -07:00
										 |  |  |   readonly resolvedFactory: ResolvedReflectiveFactory; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   constructor( | 
					
						
							|  |  |  |       public key: ReflectiveKey, public resolvedFactories: ResolvedReflectiveFactory[], | 
					
						
							| 
									
										
										
										
											2017-09-15 16:12:02 -07:00
										 |  |  |       public multiProvider: boolean) { | 
					
						
							|  |  |  |     this.resolvedFactory = this.resolvedFactories[0]; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  |  * An internal resolved representation of a factory function created by resolving {@link | 
					
						
							|  |  |  |  * Provider}. | 
					
						
							| 
									
										
										
										
											2016-05-25 15:00:05 -07:00
										 |  |  |  * @experimental | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | export class ResolvedReflectiveFactory { | 
					
						
							|  |  |  |   constructor( | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * Factory function which can return an instance of an object represented by a key. | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       public factory: Function, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * Arguments (dependencies) to the `factory` function. | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       public dependencies: ReflectiveDependency[]) {} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Resolve a single provider. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | function resolveReflectiveFactory(provider: NormalizedProvider): ResolvedReflectiveFactory { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   let factoryFn: Function; | 
					
						
							|  |  |  |   let resolvedDeps: ReflectiveDependency[]; | 
					
						
							|  |  |  |   if (provider.useClass) { | 
					
						
							|  |  |  |     const useClass = resolveForwardRef(provider.useClass); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     factoryFn = reflector.factory(useClass); | 
					
						
							|  |  |  |     resolvedDeps = _dependenciesFor(useClass); | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   } else if (provider.useExisting) { | 
					
						
							| 
									
										
										
										
											2016-06-28 11:35:59 -07:00
										 |  |  |     factoryFn = (aliasInstance: any) => aliasInstance; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     resolvedDeps = [ReflectiveDependency.fromKey(ReflectiveKey.get(provider.useExisting))]; | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   } else if (provider.useFactory) { | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     factoryFn = provider.useFactory; | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  |     resolvedDeps = constructDependencies(provider.useFactory, provider.deps); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     factoryFn = () => provider.useValue; | 
					
						
							|  |  |  |     resolvedDeps = _EMPTY_LIST; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return new ResolvedReflectiveFactory(factoryFn, resolvedDeps); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Converts the {@link Provider} into {@link ResolvedProvider}. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * {@link Injector} internally only uses {@link ResolvedProvider}, {@link Provider} contains | 
					
						
							|  |  |  |  * convenience provider syntax. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | function resolveReflectiveProvider(provider: NormalizedProvider): ResolvedReflectiveProvider { | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  |   return new ResolvedReflectiveProvider_( | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |       ReflectiveKey.get(provider.provide), [resolveReflectiveFactory(provider)], | 
					
						
							|  |  |  |       provider.multi || false); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Resolve a list of Providers. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | export function resolveReflectiveProviders(providers: Provider[]): ResolvedReflectiveProvider[] { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   const normalized = _normalizeProviders(providers, []); | 
					
						
							|  |  |  |   const resolved = normalized.map(resolveReflectiveProvider); | 
					
						
							|  |  |  |   const resolvedProviderMap = mergeResolvedReflectiveProviders(resolved, new Map()); | 
					
						
							|  |  |  |   return Array.from(resolvedProviderMap.values()); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Merges a list of ResolvedProviders into a list where | 
					
						
							|  |  |  |  * each key is contained exactly once and multi providers | 
					
						
							|  |  |  |  * have been merged. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export function mergeResolvedReflectiveProviders( | 
					
						
							|  |  |  |     providers: ResolvedReflectiveProvider[], | 
					
						
							|  |  |  |     normalizedProvidersMap: Map<number, ResolvedReflectiveProvider>): | 
					
						
							|  |  |  |     Map<number, ResolvedReflectiveProvider> { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   for (let i = 0; i < providers.length; i++) { | 
					
						
							|  |  |  |     const provider = providers[i]; | 
					
						
							|  |  |  |     const existing = normalizedProvidersMap.get(provider.key.id); | 
					
						
							|  |  |  |     if (existing) { | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |       if (provider.multiProvider !== existing.multiProvider) { | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |         throw mixingMultiProvidersWithRegularProvidersError(existing, provider); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |       if (provider.multiProvider) { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |         for (let j = 0; j < provider.resolvedFactories.length; j++) { | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |           existing.resolvedFactories.push(provider.resolvedFactories[j]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         normalizedProvidersMap.set(provider.key.id, provider); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |       let resolvedProvider: ResolvedReflectiveProvider; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |       if (provider.multiProvider) { | 
					
						
							|  |  |  |         resolvedProvider = new ResolvedReflectiveProvider_( | 
					
						
							| 
									
										
										
										
											2016-10-21 15:14:44 -07:00
										 |  |  |             provider.key, provider.resolvedFactories.slice(), provider.multiProvider); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         resolvedProvider = provider; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       normalizedProvidersMap.set(provider.key.id, resolvedProvider); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return normalizedProvidersMap; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  | function _normalizeProviders(providers: Provider[], res: Provider[]): Provider[] { | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |   providers.forEach(b => { | 
					
						
							|  |  |  |     if (b instanceof Type) { | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  |       res.push({provide: b, useClass: b}); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 11:12:06 -07:00
										 |  |  |     } else if (b && typeof b == 'object' && (b as any).provide !== undefined) { | 
					
						
							| 
									
										
										
										
											2016-08-15 19:37:42 -07:00
										 |  |  |       res.push(b as NormalizedProvider); | 
					
						
							| 
									
										
										
										
											2016-04-25 21:04:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     } else if (b instanceof Array) { | 
					
						
							|  |  |  |       _normalizeProviders(b, res); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |       throw invalidProviderError(b); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | export function constructDependencies( | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |     typeOrFunc: any, dependencies?: any[]): ReflectiveDependency[] { | 
					
						
							| 
									
										
										
										
											2016-09-30 09:26:53 -07:00
										 |  |  |   if (!dependencies) { | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     return _dependenciesFor(typeOrFunc); | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |     const params: any[][] = dependencies.map(t => [t]); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     return dependencies.map(t => _extractToken(typeOrFunc, t, params)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function _dependenciesFor(typeOrFunc: any): ReflectiveDependency[] { | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   const params = reflector.parameters(typeOrFunc); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 09:26:53 -07:00
										 |  |  |   if (!params) return []; | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   if (params.some(p => p == null)) { | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |     throw noAnnotationError(typeOrFunc, params); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   return params.map(p => _extractToken(typeOrFunc, p, params)); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | function _extractToken( | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |     typeOrFunc: any, metadata: any[] | any, params: any[][]): ReflectiveDependency { | 
					
						
							|  |  |  |   let token: any = null; | 
					
						
							|  |  |  |   let optional = false; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-19 13:42:39 -07:00
										 |  |  |   if (!Array.isArray(metadata)) { | 
					
						
							| 
									
										
										
										
											2016-09-12 19:14:17 -07:00
										 |  |  |     if (metadata instanceof Inject) { | 
					
						
							| 
									
										
										
										
											2017-05-23 10:52:40 -07:00
										 |  |  |       return _createDependency(metadata.token, optional, null); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2017-01-25 17:21:54 -08:00
										 |  |  |       return _createDependency(metadata, optional, null); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |   let visibility: Self|SkipSelf|null = null; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   for (let i = 0; i < metadata.length; ++i) { | 
					
						
							| 
									
										
										
										
											2016-11-12 14:08:58 +01:00
										 |  |  |     const paramMetadata = metadata[i]; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (paramMetadata instanceof Type) { | 
					
						
							|  |  |  |       token = paramMetadata; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-12 19:14:17 -07:00
										 |  |  |     } else if (paramMetadata instanceof Inject) { | 
					
						
							| 
									
										
										
										
											2017-05-23 10:52:40 -07:00
										 |  |  |       token = paramMetadata.token; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-12 19:14:17 -07:00
										 |  |  |     } else if (paramMetadata instanceof Optional) { | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |       optional = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 17:21:54 -08:00
										 |  |  |     } else if (paramMetadata instanceof Self || paramMetadata instanceof SkipSelf) { | 
					
						
							|  |  |  |       visibility = paramMetadata; | 
					
						
							| 
									
										
										
										
											2017-02-20 16:20:45 -08:00
										 |  |  |     } else if (paramMetadata instanceof InjectionToken) { | 
					
						
							|  |  |  |       token = paramMetadata; | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   token = resolveForwardRef(token); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 16:58:27 -07:00
										 |  |  |   if (token != null) { | 
					
						
							| 
									
										
										
										
											2017-01-25 17:21:54 -08:00
										 |  |  |     return _createDependency(token, optional, visibility); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |     throw noAnnotationError(typeOrFunc, params); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 16:38:52 -07:00
										 |  |  | function _createDependency( | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |     token: any, optional: boolean, visibility: Self | SkipSelf | null): ReflectiveDependency { | 
					
						
							| 
									
										
										
										
											2017-01-25 17:21:54 -08:00
										 |  |  |   return new ReflectiveDependency(ReflectiveKey.get(token), optional, visibility); | 
					
						
							| 
									
										
										
										
											2016-04-14 12:35:24 -07:00
										 |  |  | } |