fix(compiler): allow expressions or functions in extends (#14158)

Fixes #14154

PR Close #14158
This commit is contained in:
Alex Eagle 2017-01-27 15:35:31 -08:00 committed by Miško Hevery
parent 8270bec343
commit b4214d60a6
2 changed files with 36 additions and 1 deletions

View File

@ -86,7 +86,7 @@ export class StaticReflector implements ReflectorReader {
annotations = []; annotations = [];
const classMetadata = this.getTypeMetadata(type); const classMetadata = this.getTypeMetadata(type);
if (classMetadata['extends']) { if (classMetadata['extends']) {
const parentType = this.simplify(type, classMetadata['extends']); const parentType = this.trySimplify(type, classMetadata['extends']);
if (parentType && (parentType instanceof StaticSymbol)) { if (parentType && (parentType instanceof StaticSymbol)) {
const parentAnnotations = this.annotations(parentType); const parentAnnotations = this.annotations(parentType);
annotations.push(...parentAnnotations); annotations.push(...parentAnnotations);
@ -303,6 +303,17 @@ export class StaticReflector implements ReflectorReader {
} }
} }
/**
* Simplify but discard any errors
*/
private trySimplify(context: StaticSymbol, value: any): any {
const originalRecorder = this.errorRecorder;
this.errorRecorder = (error: any, fileName: string) => {};
const result = this.simplify(context, value);
this.errorRecorder = originalRecorder;
return result;
}
/** @internal */ /** @internal */
public simplify(context: StaticSymbol, value: any): any { public simplify(context: StaticSymbol, value: any): any {
const self = this; const self = this;

View File

@ -679,6 +679,30 @@ describe('StaticReflector', () => {
'hook1', 'hook2', 'hook3' 'hook1', 'hook2', 'hook3'
])).toEqual([false, false, false]); ])).toEqual([false, false, false]);
}); });
it('should allow inheritance from expressions', () => {
initWithDecorator({
'/tmp/src/main.ts': `
export function metaClass() { return null; };
export class Child extends metaClass() {}
`
});
expect(reflector.annotations(reflector.getStaticSymbol('/tmp/src/main.ts', 'Child')))
.toEqual([]);
});
it('should allow inheritance from functions', () => {
initWithDecorator({
'/tmp/src/main.ts': `
export let ctor: {new(): T} = function() { return null; }
export class Child extends ctor {}
`
});
expect(reflector.annotations(reflector.getStaticSymbol('/tmp/src/main.ts', 'Child')))
.toEqual([]);
});
}); });
}); });