Skip to content

Commit

Permalink
feat(core): support the decorator data that tsickle produces
Browse files Browse the repository at this point in the history
  • Loading branch information
tbosch committed May 2, 2016
1 parent 3ae856a commit b6fd811
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 5 deletions.
44 changes: 44 additions & 0 deletions modules/@angular/core/src/reflection/reflection_capabilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,17 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities {
if (isPresent((<any>typeOrFunc).parameters)) {
return (<any>typeOrFunc).parameters;
}

// API of tsickle for lowering decorators to properties on the class.
if (isPresent((<any>typeOrFunc).ctorParameters)) {
let ctorParameters = (<any>typeOrFunc).ctorParameters;
let paramTypes = ctorParameters.map( ctorParam => ctorParam && ctorParam.type );
let paramAnnotations = ctorParameters.map( ctorParam =>
ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators) );
return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
}

// API for metadata created by invoking the decorators.
if (isPresent(this._reflect) && isPresent(this._reflect.getMetadata)) {
var paramAnnotations = this._reflect.getMetadata('parameters', typeOrFunc);
var paramTypes = this._reflect.getMetadata('design:paramtypes', typeOrFunc);
Expand All @@ -143,6 +154,13 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities {
}
return annotations;
}

// API of tsickle for lowering decorators to properties on the class.
if (isPresent((<any>typeOrFunc).decorators)) {
return convertTsickleDecoratorIntoMetadata((<any>typeOrFunc).decorators);
}

// API for metadata created by invoking the decorators.
if (isPresent(this._reflect) && isPresent(this._reflect.getMetadata)) {
var annotations = this._reflect.getMetadata('annotations', typeOrFunc);
if (isPresent(annotations)) return annotations;
Expand All @@ -159,6 +177,18 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities {
}
return propMetadata;
}

// API of tsickle for lowering decorators to properties on the class.
if (isPresent((<any>typeOrFunc).propDecorators)) {
let propDecorators = (<any>typeOrFunc).propDecorators;
let propMetadata = <{[key: string]: any[]}>{};
Object.keys(propDecorators).forEach( prop => {
propMetadata[prop] = convertTsickleDecoratorIntoMetadata(propDecorators[prop]);
});
return propMetadata;
}

// API for metadata created by invoking the decorators.
if (isPresent(this._reflect) && isPresent(this._reflect.getMetadata)) {
var propMetadata = this._reflect.getMetadata('propMetadata', typeOrFunc);
if (isPresent(propMetadata)) return propMetadata;
Expand All @@ -185,3 +215,17 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities {
// There is not a concept of import uri in Js, but this is useful in developing Dart applications.
importUri(type: Type): string { return `./${stringify(type)}`; }
}

function convertTsickleDecoratorIntoMetadata(decoratorInvocations: any[]): any[] {
if (!decoratorInvocations) {
return [];
}
return decoratorInvocations.map( decoratorInvocation => {
var decoratorType = decoratorInvocation.type;
var annotationCls = decoratorType.annotationCls;
var annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];
var annotation = Object.create(annotationCls.prototype);
annotationCls.apply(annotation, annotationArgs);
return annotation;
});
}
13 changes: 8 additions & 5 deletions modules/@angular/core/src/util/decorators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ export function makeDecorator(
}
}
DecoratorFactory.prototype = Object.create(annotationCls.prototype);
(<any>DecoratorFactory).annotationCls = annotationCls;
return DecoratorFactory;
}

Expand Down Expand Up @@ -304,15 +305,16 @@ export function makeParamDecorator(annotationCls): any {
}
}
ParamDecoratorFactory.prototype = Object.create(annotationCls.prototype);
(<any>ParamDecoratorFactory).annotationCls = annotationCls;
return ParamDecoratorFactory;
}

export function makePropDecorator(decoratorCls): any {
export function makePropDecorator(annotationCls): any {
function PropDecoratorFactory(...args): any {
var decoratorInstance = Object.create(decoratorCls.prototype);
decoratorCls.apply(decoratorInstance, args);
var decoratorInstance = Object.create(annotationCls.prototype);
annotationCls.apply(decoratorInstance, args);

if (this instanceof decoratorCls) {
if (this instanceof annotationCls) {
return decoratorInstance;
} else {
return function PropDecorator(target: any, name: string) {
Expand All @@ -324,6 +326,7 @@ export function makePropDecorator(decoratorCls): any {
};
}
}
PropDecoratorFactory.prototype = Object.create(decoratorCls.prototype);
PropDecoratorFactory.prototype = Object.create(annotationCls.prototype);
(<any>PropDecoratorFactory).annotationCls = annotationCls;
return PropDecoratorFactory;
}

0 comments on commit b6fd811

Please sign in to comment.