Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(compiler): Resolvers now use DI to create reflector #7762

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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