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.
  • Loading branch information
chuckjaz committed Mar 24, 2016
1 parent d272f96 commit a41dee7
Show file tree
Hide file tree
Showing 17 changed files with 66 additions and 21 deletions.
9 changes: 6 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,17 @@ function _isDirectiveMetadata(type: any): boolean {
*/
@Injectable()
export class DirectiveResolver {
constructor(private _reflector: ReflectorReader) {}

/**
* 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 +158,4 @@ export class DirectiveResolver {
}
}

export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver();
export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver(reflector);
7 changes: 5 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,13 @@ function _isPipeMetadata(type: any): boolean {
*/
@Injectable()
export class PipeResolver {
constructor(private _reflector: ReflectorReader) {}

/**
* 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 +35,4 @@ export class PipeResolver {
}
}

export var CODEGEN_PIPE_RESOLVER = new PipeResolver();
export var CODEGEN_PIPE_RESOLVER = new PipeResolver(reflector);
7 changes: 4 additions & 3 deletions modules/angular2/src/core/linker/view_resolver.ts
Expand Up @@ -6,8 +6,7 @@ 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 {reflector} from 'angular2/src/core/reflection/reflection';

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

/**
* Resolves types to {@link ViewMetadata}.
Expand All @@ -17,6 +16,8 @@ export class ViewResolver {
/** @internal */
_cache = new Map<Type, ViewMetadata>();

constructor(private _reflector: ReflectorReader) {}

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

Expand All @@ -33,7 +34,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[]};
}
4 changes: 4 additions & 0 deletions modules/angular2/src/mock/directive_resolver_mock.ts
Expand Up @@ -4,6 +4,8 @@ import {Type, isPresent, stringify, isBlank, print} from 'angular2/src/facade/la
import {DirectiveMetadata, ComponentMetadata} from '../core/metadata';
import {DirectiveResolver} from 'angular2/src/core/linker/directive_resolver';

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

/**
* An implementation of {@link DirectiveResolver} that allows overriding
* various properties of directives.
Expand All @@ -13,6 +15,8 @@ export class MockDirectiveResolver extends DirectiveResolver {
private _providerOverrides = new Map<Type, any[]>();
private viewProviderOverrides = new Map<Type, any[]>();

constructor() { super(reflector); }

resolve(type: Type): DirectiveMetadata {
var dm = super.resolve(type);

Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/src/mock/view_resolver_mock.ts
Expand Up @@ -6,6 +6,8 @@ import {BaseException, WrappedException} from 'angular2/src/facade/exceptions';
import {ViewMetadata} from '../core/metadata';
import {ViewResolver} from 'angular2/src/core/linker/view_resolver';

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

@Injectable()
export class MockViewResolver extends ViewResolver {
/** @internal */
Expand All @@ -17,7 +19,7 @@ export class MockViewResolver extends ViewResolver {
/** @internal */
_directiveOverrides = new Map<Type, Map<Type, Type>>();

constructor() { super(); }
constructor() { super(reflector); }

/**
* Overrides the {@link ViewMetadata} for a component.
Expand Down
4 changes: 2 additions & 2 deletions modules/angular2/src/upgrade/metadata.ts
@@ -1,9 +1,9 @@
import {Type, DirectiveResolver, DirectiveMetadata} from 'angular2/core';
import {Type, DirectiveResolver, DirectiveMetadata, reflector} from 'angular2/core';
import {stringify} from './util';

var COMPONENT_SELECTOR = /^[\w|-]*$/;
var SKEWER_CASE = /-(\w)/g;
var directiveResolver = new DirectiveResolver();
var directiveResolver = new DirectiveResolver(reflector);

export interface AttrProp {
prop: string;
Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/test/common/pipes/date_pipe_spec.ts
Expand Up @@ -14,6 +14,8 @@ import {DatePipe} from 'angular2/common';
import {DateWrapper} from 'angular2/src/facade/lang';
import {PipeResolver} from 'angular2/src/core/linker/pipe_resolver';

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

export function main() {
describe("DatePipe", () => {
var date;
Expand All @@ -25,7 +27,7 @@ export function main() {
});

it('should be marked as pure',
() => { expect(new PipeResolver().resolve(DatePipe).pure).toEqual(true); });
() => { expect(new PipeResolver(reflector).resolve(DatePipe).pure).toEqual(true); });

describe("supports", () => {
it("should support date", () => { expect(pipe.supports(date)).toBe(true); });
Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/test/common/pipes/i18n_plural_pipe_spec.ts
Expand Up @@ -12,6 +12,8 @@ import {
import {I18nPluralPipe} from 'angular2/common';
import {PipeResolver} from 'angular2/src/core/linker/pipe_resolver';

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

export function main() {
describe("I18nPluralPipe", () => {
var pipe;
Expand All @@ -22,7 +24,7 @@ export function main() {
beforeEach(() => { pipe = new I18nPluralPipe(); });

it('should be marked as pure',
() => { expect(new PipeResolver().resolve(I18nPluralPipe).pure).toEqual(true); });
() => { expect(new PipeResolver(reflector).resolve(I18nPluralPipe).pure).toEqual(true); });

describe("transform", () => {
it("should return 0 text if value is 0", () => {
Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/test/common/pipes/i18n_select_pipe_spec.ts
Expand Up @@ -12,6 +12,8 @@ import {
import {I18nSelectPipe} from 'angular2/common';
import {PipeResolver} from 'angular2/src/core/linker/pipe_resolver';

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

export function main() {
describe("I18nSelectPipe", () => {
var pipe;
Expand All @@ -20,7 +22,7 @@ export function main() {
beforeEach(() => { pipe = new I18nSelectPipe(); });

it('should be marked as pure',
() => { expect(new PipeResolver().resolve(I18nSelectPipe).pure).toEqual(true); });
() => { expect(new PipeResolver(reflector).resolve(I18nSelectPipe).pure).toEqual(true); });

describe("transform", () => {
it("should return male text if value is male", () => {
Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/test/core/linker/directive_resolver_spec.ts
Expand Up @@ -17,6 +17,8 @@ import {
ViewChildMetadata
} from 'angular2/src/core/metadata';

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

@Directive({selector: 'someDirective'})
class SomeDirective {
}
Expand Down Expand Up @@ -115,7 +117,7 @@ export function main() {
describe("DirectiveResolver", () => {
var resolver: DirectiveResolver;

beforeEach(() => { resolver = new DirectiveResolver(); });
beforeEach(() => { resolver = new DirectiveResolver(reflector); });

it('should read out the Directive metadata', () => {
var directiveMetadata = resolver.resolve(SomeDirective);
Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/test/core/linker/element_spec.ts
Expand Up @@ -51,6 +51,8 @@ import {QueryList} from 'angular2/src/core/linker/query_list';
import {AppView, AppProtoView} from "angular2/src/core/linker/view";
import {ViewType} from "angular2/src/core/linker/view_type";

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

@Directive({selector: ''})
class SimpleDirective {}

Expand Down Expand Up @@ -312,7 +314,7 @@ export function main() {

function init() {
beforeEachBindings(() => {
var delegateDirectiveResolver = new DirectiveResolver();
var delegateDirectiveResolver = new DirectiveResolver(reflector);
directiveResolver = new SpyDirectiveResolver();
directiveResolver.spy('resolve').andCallFake( (directiveType) => {
var result = mockDirectiveMeta.get(directiveType);
Expand Down
4 changes: 3 additions & 1 deletion modules/angular2/test/core/linker/view_resolver_spec.ts
Expand Up @@ -2,6 +2,8 @@ import {ddescribe, describe, it, iit, expect, beforeEach} from 'angular2/testing
import {ViewResolver} from 'angular2/src/core/linker/view_resolver';
import {Component, ViewMetadata} from 'angular2/src/core/metadata';

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

class SomeDir {}
class SomePipe {}

Expand Down Expand Up @@ -44,7 +46,7 @@ export function main() {
describe("ViewResolver", () => {
var resolver: ViewResolver;

beforeEach(() => { resolver = new ViewResolver(); });
beforeEach(() => { resolver = new ViewResolver(reflector); });

it('should read out the View metadata from the Component metadata', () => {
var viewMetadata = resolver.resolve(ComponentWithTemplate);
Expand Down
4 changes: 3 additions & 1 deletion modules/benchmarks/src/compiler/compiler_benchmark.ts
Expand Up @@ -21,6 +21,8 @@ import {ViewResolver} from 'angular2/src/core/linker/view_resolver';

import {getIntParameter, bindAction} from 'angular2/src/testing/benchmark_util';

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

function _createBindings(): Provider[] {
var multiplyTemplatesBy = getIntParameter('elements');
return [
Expand Down Expand Up @@ -68,7 +70,7 @@ class MultiplyViewResolver extends ViewResolver {
_cache = new Map<Type, ViewMetadata>();

constructor(multiple: number, components: Type[]) {
super();
super(reflector);
this._multiplyBy = multiple;
components.forEach(c => this._fillCache(c));
}
Expand Down
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 a41dee7

Please sign in to comment.