diff --git a/modules/@angular/core/src/reflection/reflection_capabilities.ts b/modules/@angular/core/src/reflection/reflection_capabilities.ts index 7d02242db3..8541a1213a 100644 --- a/modules/@angular/core/src/reflection/reflection_capabilities.ts +++ b/modules/@angular/core/src/reflection/reflection_capabilities.ts @@ -121,6 +121,17 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities { if (isPresent((typeOrFunc).parameters)) { return (typeOrFunc).parameters; } + + // API of tsickle for lowering decorators to properties on the class. + if (isPresent((typeOrFunc).ctorParameters)) { + let ctorParameters = (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); @@ -143,6 +154,13 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities { } return annotations; } + + // API of tsickle for lowering decorators to properties on the class. + if (isPresent((typeOrFunc).decorators)) { + return convertTsickleDecoratorIntoMetadata((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; @@ -159,6 +177,18 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities { } return propMetadata; } + + // API of tsickle for lowering decorators to properties on the class. + if (isPresent((typeOrFunc).propDecorators)) { + let propDecorators = (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; @@ -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; + }); +} diff --git a/modules/@angular/core/src/util/decorators.ts b/modules/@angular/core/src/util/decorators.ts index a3427d27eb..9b1852c63b 100644 --- a/modules/@angular/core/src/util/decorators.ts +++ b/modules/@angular/core/src/util/decorators.ts @@ -270,6 +270,7 @@ export function makeDecorator( } } DecoratorFactory.prototype = Object.create(annotationCls.prototype); + (DecoratorFactory).annotationCls = annotationCls; return DecoratorFactory; } @@ -304,15 +305,16 @@ export function makeParamDecorator(annotationCls): any { } } ParamDecoratorFactory.prototype = Object.create(annotationCls.prototype); + (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) { @@ -324,6 +326,7 @@ export function makePropDecorator(decoratorCls): any { }; } } - PropDecoratorFactory.prototype = Object.create(decoratorCls.prototype); + PropDecoratorFactory.prototype = Object.create(annotationCls.prototype); + (PropDecoratorFactory).annotationCls = annotationCls; return PropDecoratorFactory; }