X Tutup
Skip to content

Commit 506f4ce

Browse files
chuckjazKara Erickson
authored andcommitted
feat(compiler): Resolvers now use DI to create reflector
Also introduced ReflectorReader when only read-only access to the reflector is needed. Closes angular#7762
1 parent a0387d2 commit 506f4ce

File tree

7 files changed

+59
-10
lines changed

7 files changed

+59
-10
lines changed

modules/angular2/src/core/linker/directive_resolver.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
ViewChildMetadata
1717
} from 'angular2/src/core/metadata';
1818
import {reflector} from 'angular2/src/core/reflection/reflection';
19+
import {ReflectorReader} from 'angular2/src/core/reflection/reflector_reader';
1920

2021
function _isDirectiveMetadata(type: any): boolean {
2122
return type instanceof DirectiveMetadata;
@@ -30,15 +31,25 @@ function _isDirectiveMetadata(type: any): boolean {
3031
*/
3132
@Injectable()
3233
export class DirectiveResolver {
34+
private _reflector: ReflectorReader;
35+
36+
constructor(_reflector?: ReflectorReader) {
37+
if (isPresent(_reflector)) {
38+
this._reflector = _reflector;
39+
} else {
40+
this._reflector = reflector;
41+
}
42+
}
43+
3344
/**
3445
* Return {@link DirectiveMetadata} for a given `Type`.
3546
*/
3647
resolve(type: Type): DirectiveMetadata {
37-
var typeMetadata = reflector.annotations(resolveForwardRef(type));
48+
var typeMetadata = this._reflector.annotations(resolveForwardRef(type));
3849
if (isPresent(typeMetadata)) {
3950
var metadata = typeMetadata.find(_isDirectiveMetadata);
4051
if (isPresent(metadata)) {
41-
var propertyMetadata = reflector.propMetadata(type);
52+
var propertyMetadata = this._reflector.propMetadata(type);
4253
return this._mergeWithPropertyMetadata(metadata, propertyMetadata, type);
4354
}
4455
}
@@ -155,4 +166,4 @@ export class DirectiveResolver {
155166
}
156167
}
157168

158-
export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver();
169+
export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver(reflector);

modules/angular2/src/core/linker/pipe_resolver.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {resolveForwardRef, Injectable} from 'angular2/src/core/di';
22
import {Type, isPresent, stringify} from 'angular2/src/facade/lang';
33
import {BaseException} from 'angular2/src/facade/exceptions';
44
import {PipeMetadata} from 'angular2/src/core/metadata';
5+
import {ReflectorReader} from 'angular2/src/core/reflection/reflector_reader';
56
import {reflector} from 'angular2/src/core/reflection/reflection';
67

78
function _isPipeMetadata(type: any): boolean {
@@ -17,11 +18,20 @@ function _isPipeMetadata(type: any): boolean {
1718
*/
1819
@Injectable()
1920
export class PipeResolver {
21+
private _reflector: ReflectorReader;
22+
constructor(_reflector?: ReflectorReader) {
23+
if (isPresent(_reflector)) {
24+
this._reflector = _reflector;
25+
} else {
26+
this._reflector = reflector;
27+
}
28+
}
29+
2030
/**
2131
* Return {@link PipeMetadata} for a given `Type`.
2232
*/
2333
resolve(type: Type): PipeMetadata {
24-
var metas = reflector.annotations(resolveForwardRef(type));
34+
var metas = this._reflector.annotations(resolveForwardRef(type));
2535
if (isPresent(metas)) {
2636
var annotation = metas.find(_isPipeMetadata);
2737
if (isPresent(annotation)) {
@@ -32,4 +42,4 @@ export class PipeResolver {
3242
}
3343
}
3444

35-
export var CODEGEN_PIPE_RESOLVER = new PipeResolver();
45+
export var CODEGEN_PIPE_RESOLVER = new PipeResolver(reflector);

modules/angular2/src/core/linker/view_resolver.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,27 @@ import {Type, stringify, isBlank, isPresent} from 'angular2/src/facade/lang';
66
import {BaseException} from 'angular2/src/facade/exceptions';
77
import {Map} from 'angular2/src/facade/collection';
88

9+
import {ReflectorReader} from 'angular2/src/core/reflection/reflector_reader';
910
import {reflector} from 'angular2/src/core/reflection/reflection';
1011

11-
1212
/**
1313
* Resolves types to {@link ViewMetadata}.
1414
*/
1515
@Injectable()
1616
export class ViewResolver {
17+
private _reflector: ReflectorReader;
18+
1719
/** @internal */
1820
_cache = new Map<Type, ViewMetadata>();
1921

22+
constructor(_reflector?: ReflectorReader) {
23+
if (isPresent(_reflector)) {
24+
this._reflector = _reflector;
25+
} else {
26+
this._reflector = reflector;
27+
}
28+
}
29+
2030
resolve(component: Type): ViewMetadata {
2131
var view = this._cache.get(component);
2232

@@ -33,7 +43,7 @@ export class ViewResolver {
3343
var compMeta: ComponentMetadata;
3444
var viewMeta: ViewMetadata;
3545

36-
reflector.annotations(component).forEach(m => {
46+
this._reflector.annotations(component).forEach(m => {
3747
if (m instanceof ViewMetadata) {
3848
viewMeta = m;
3949
}

modules/angular2/src/core/platform_common_providers.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {Type, isBlank, isPresent, assertionsEnabled, CONST_EXPR} from 'angular2/
22
import {provide, Provider, Injector, OpaqueToken} from 'angular2/src/core/di';
33
import {Console} from 'angular2/src/core/console';
44
import {Reflector, reflector} from './reflection/reflection';
5+
import {ReflectorReader} from './reflection/reflector_reader';
56
import {TestabilityRegistry} from 'angular2/src/core/testability/testability';
67

78
function _reflector(): Reflector {
@@ -11,5 +12,9 @@ function _reflector(): Reflector {
1112
/**
1213
* A default set of providers which should be included in any Angular platform.
1314
*/
14-
export const PLATFORM_COMMON_PROVIDERS: Array<Type | Provider | any[]> = CONST_EXPR(
15-
[new Provider(Reflector, {useFactory: _reflector, deps: []}), TestabilityRegistry, Console]);
15+
export const PLATFORM_COMMON_PROVIDERS: Array<Type | Provider | any[]> = CONST_EXPR([
16+
new Provider(Reflector, {useFactory: _reflector, deps: []}),
17+
new Provider(ReflectorReader, {useExisting: Reflector}),
18+
TestabilityRegistry,
19+
Console
20+
]);

modules/angular2/src/core/reflection/reflector.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
StringMapWrapper
1010
} from 'angular2/src/facade/collection';
1111
import {SetterFn, GetterFn, MethodFn} from './types';
12+
import {ReflectorReader} from './reflector_reader';
1213
import {PlatformReflectionCapabilities} from './platform_reflection_capabilities';
1314
export {SetterFn, GetterFn, MethodFn} from './types';
1415
export {PlatformReflectionCapabilities} from './platform_reflection_capabilities';
@@ -25,7 +26,7 @@ export class ReflectionInfo {
2526
* Provides access to reflection data about symbols. Used internally by Angular
2627
* to power dependency injection and compilation.
2728
*/
28-
export class Reflector {
29+
export class Reflector extends ReflectorReader {
2930
/** @internal */
3031
_injectableInfo = new Map<any, ReflectionInfo>();
3132
/** @internal */
@@ -39,6 +40,7 @@ export class Reflector {
3940
reflectionCapabilities: PlatformReflectionCapabilities;
4041

4142
constructor(reflectionCapabilities: PlatformReflectionCapabilities) {
43+
super();
4244
this._usedKeys = null;
4345
this.reflectionCapabilities = reflectionCapabilities;
4446
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**
2+
* Provides read-only access to reflection data about symbols. Used internally by Angular
3+
* to power dependency injection and compilation.
4+
*/
5+
export abstract class ReflectorReader {
6+
abstract parameters(typeOrFunc: /*Type*/ any): any[][];
7+
abstract annotations(typeOrFunc: /*Type*/ any): any[];
8+
abstract propMetadata(typeOrFunc: /*Type*/ any): {[key: string]: any[]};
9+
}

tools/public_api_guard/public_api_spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const CORE = [
169169
'DirectiveMetadata.queries:{[key:string]:any}',
170170
'DirectiveMetadata.selector:string',
171171
'DirectiveResolver',
172+
'DirectiveResolver.constructor(_reflector:ReflectorReader)',
172173
'DirectiveResolver.resolve(type:Type):DirectiveMetadata',
173174
'DoCheck',
174175
'DoCheck.ngDoCheck():any',
@@ -493,6 +494,7 @@ const CORE = [
493494
'ViewRef.changeDetectorRef:ChangeDetectorRef',
494495
'ViewRef.destroyed:boolean',
495496
'ViewResolver',
497+
'ViewResolver.constructor(_reflector:ReflectorReader)',
496498
'ViewResolver.resolve(component:Type):ViewMetadata',
497499
'WrappedException',
498500
'WrappedException.constructor(_wrapperMessage:string, _originalException:any, _originalStack:any, _context:any)',

0 commit comments

Comments
 (0)
X Tutup