Skip to content

Commit

Permalink
feat(compiler): Resolvers now use DI to create reflector
Browse files Browse the repository at this point in the history
Also introduced ReflectorReader when only read-only access to the reflector
is needed.

Closes angular#7762
  • Loading branch information
chuckjaz authored and mircoba committed Apr 10, 2016
1 parent c258548 commit 138b647
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 10 deletions.
17 changes: 14 additions & 3 deletions modules/angular2/src/core/linker/directive_resolver.ts
Expand Up @@ -16,6 +16,7 @@ import {
ViewChildMetadata
} from 'angular2/src/core/metadata';
import {reflector} from 'angular2/src/core/reflection/reflection';
import {ReflectorReader} from 'angular2/src/core/reflection/reflector_reader';

function _isDirectiveMetadata(type: any): boolean {
return type instanceof DirectiveMetadata;
Expand All @@ -30,15 +31,25 @@ function _isDirectiveMetadata(type: any): boolean {
*/
@Injectable()
export class DirectiveResolver {
private _reflector: ReflectorReader;

constructor(_reflector?: ReflectorReader) {
if (isPresent(_reflector)) {
this._reflector = _reflector;
} else {
this._reflector = reflector;
}
}

/**
* Return {@link DirectiveMetadata} for a given `Type`.
*/
resolve(type: Type): DirectiveMetadata {
var typeMetadata = reflector.annotations(resolveForwardRef(type));
var typeMetadata = this._reflector.annotations(resolveForwardRef(type));
if (isPresent(typeMetadata)) {
var metadata = typeMetadata.find(_isDirectiveMetadata);
if (isPresent(metadata)) {
var propertyMetadata = reflector.propMetadata(type);
var propertyMetadata = this._reflector.propMetadata(type);
return this._mergeWithPropertyMetadata(metadata, propertyMetadata, type);
}
}
Expand Down Expand Up @@ -155,4 +166,4 @@ export class DirectiveResolver {
}
}

export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver();
export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver(reflector);
14 changes: 12 additions & 2 deletions modules/angular2/src/core/linker/pipe_resolver.ts
Expand Up @@ -2,6 +2,7 @@ import {resolveForwardRef, Injectable} from 'angular2/src/core/di';
import {Type, isPresent, stringify} from 'angular2/src/facade/lang';
import {BaseException} from 'angular2/src/facade/exceptions';
import {PipeMetadata} from 'angular2/src/core/metadata';
import {ReflectorReader} from 'angular2/src/core/reflection/reflector_reader';
import {reflector} from 'angular2/src/core/reflection/reflection';

function _isPipeMetadata(type: any): boolean {
Expand All @@ -17,11 +18,20 @@ function _isPipeMetadata(type: any): boolean {
*/
@Injectable()
export class PipeResolver {
private _reflector: ReflectorReader;
constructor(_reflector?: ReflectorReader) {
if (isPresent(_reflector)) {
this._reflector = _reflector;
} else {
this._reflector = reflector;
}
}

/**
* Return {@link PipeMetadata} for a given `Type`.
*/
resolve(type: Type): PipeMetadata {
var metas = reflector.annotations(resolveForwardRef(type));
var metas = this._reflector.annotations(resolveForwardRef(type));
if (isPresent(metas)) {
var annotation = metas.find(_isPipeMetadata);
if (isPresent(annotation)) {
Expand All @@ -32,4 +42,4 @@ export class PipeResolver {
}
}

export var CODEGEN_PIPE_RESOLVER = new PipeResolver();
export var CODEGEN_PIPE_RESOLVER = new PipeResolver(reflector);
14 changes: 12 additions & 2 deletions modules/angular2/src/core/linker/view_resolver.ts
Expand Up @@ -6,17 +6,27 @@ import {Type, stringify, isBlank, isPresent} from 'angular2/src/facade/lang';
import {BaseException} from 'angular2/src/facade/exceptions';
import {Map} from 'angular2/src/facade/collection';

import {ReflectorReader} from 'angular2/src/core/reflection/reflector_reader';
import {reflector} from 'angular2/src/core/reflection/reflection';


/**
* Resolves types to {@link ViewMetadata}.
*/
@Injectable()
export class ViewResolver {
private _reflector: ReflectorReader;

/** @internal */
_cache = new Map<Type, ViewMetadata>();

constructor(_reflector?: ReflectorReader) {
if (isPresent(_reflector)) {
this._reflector = _reflector;
} else {
this._reflector = reflector;
}
}

resolve(component: Type): ViewMetadata {
var view = this._cache.get(component);

Expand All @@ -33,7 +43,7 @@ export class ViewResolver {
var compMeta: ComponentMetadata;
var viewMeta: ViewMetadata;

reflector.annotations(component).forEach(m => {
this._reflector.annotations(component).forEach(m => {
if (m instanceof ViewMetadata) {
viewMeta = m;
}
Expand Down
9 changes: 7 additions & 2 deletions modules/angular2/src/core/platform_common_providers.ts
Expand Up @@ -2,6 +2,7 @@ import {Type, isBlank, isPresent, assertionsEnabled, CONST_EXPR} from 'angular2/
import {provide, Provider, Injector, OpaqueToken} from 'angular2/src/core/di';
import {Console} from 'angular2/src/core/console';
import {Reflector, reflector} from './reflection/reflection';
import {ReflectorReader} from './reflection/reflector_reader';
import {TestabilityRegistry} from 'angular2/src/core/testability/testability';

function _reflector(): Reflector {
Expand All @@ -11,5 +12,9 @@ function _reflector(): Reflector {
/**
* A default set of providers which should be included in any Angular platform.
*/
export const PLATFORM_COMMON_PROVIDERS: Array<Type | Provider | any[]> = CONST_EXPR(
[new Provider(Reflector, {useFactory: _reflector, deps: []}), TestabilityRegistry, Console]);
export const PLATFORM_COMMON_PROVIDERS: Array<Type | Provider | any[]> = CONST_EXPR([
new Provider(Reflector, {useFactory: _reflector, deps: []}),
new Provider(ReflectorReader, {useExisting: Reflector}),
TestabilityRegistry,
Console
]);
4 changes: 3 additions & 1 deletion modules/angular2/src/core/reflection/reflector.ts
Expand Up @@ -9,6 +9,7 @@ import {
StringMapWrapper
} from 'angular2/src/facade/collection';
import {SetterFn, GetterFn, MethodFn} from './types';
import {ReflectorReader} from './reflector_reader';
import {PlatformReflectionCapabilities} from './platform_reflection_capabilities';
export {SetterFn, GetterFn, MethodFn} from './types';
export {PlatformReflectionCapabilities} from './platform_reflection_capabilities';
Expand All @@ -25,7 +26,7 @@ export class ReflectionInfo {
* Provides access to reflection data about symbols. Used internally by Angular
* to power dependency injection and compilation.
*/
export class Reflector {
export class Reflector extends ReflectorReader {
/** @internal */
_injectableInfo = new Map<any, ReflectionInfo>();
/** @internal */
Expand All @@ -39,6 +40,7 @@ export class Reflector {
reflectionCapabilities: PlatformReflectionCapabilities;

constructor(reflectionCapabilities: PlatformReflectionCapabilities) {
super();
this._usedKeys = null;
this.reflectionCapabilities = reflectionCapabilities;
}
Expand Down
9 changes: 9 additions & 0 deletions modules/angular2/src/core/reflection/reflector_reader.ts
@@ -0,0 +1,9 @@
/**
* Provides read-only access to reflection data about symbols. Used internally by Angular
* to power dependency injection and compilation.
*/
export abstract class ReflectorReader {
abstract parameters(typeOrFunc: /*Type*/ any): any[][];
abstract annotations(typeOrFunc: /*Type*/ any): any[];
abstract propMetadata(typeOrFunc: /*Type*/ any): {[key: string]: any[]};
}
2 changes: 2 additions & 0 deletions tools/public_api_guard/public_api_spec.ts
Expand Up @@ -169,6 +169,7 @@ const CORE = [
'DirectiveMetadata.queries:{[key:string]:any}',
'DirectiveMetadata.selector:string',
'DirectiveResolver',
'DirectiveResolver.constructor(_reflector:ReflectorReader)',
'DirectiveResolver.resolve(type:Type):DirectiveMetadata',
'DoCheck',
'DoCheck.ngDoCheck():any',
Expand Down Expand Up @@ -493,6 +494,7 @@ const CORE = [
'ViewRef.changeDetectorRef:ChangeDetectorRef',
'ViewRef.destroyed:boolean',
'ViewResolver',
'ViewResolver.constructor(_reflector:ReflectorReader)',
'ViewResolver.resolve(component:Type):ViewMetadata',
'WrappedException',
'WrappedException.constructor(_wrapperMessage:string, _originalException:any, _originalStack:any, _context:any)',
Expand Down

0 comments on commit 138b647

Please sign in to comment.