fix(ivy): ngcc - recognize synthesized constructors (#27897)

A constructor function may have been "synthesized" by TypeScript during
JavaScript emit, in the case no user-defined constructor exists and e.g.
property initializers are used. Those initializers need to be emitted
into a constructor in JavaScript, so the TypeScript compiler generates a
synthetic constructor.

This commit adds identification of such constructors as ngcc needs to be
able to tell if a class did originally have a constructor in the
TypeScript source. When a class has a superclass, a synthesized
constructor must not be considered as a user-defined constructor as that
prevents a base factory call from being created by ngtsc, resulting in a
factory function that does not inject the dependencies of the superclass.
Hence, we identify a default synthesized super call in the constructor
body, according to the structure that TypeScript emits.

PR Close #27897
This commit is contained in:
JoostK
2019-01-02 23:25:58 +01:00
committed by Andrew Kushnir
parent d6cfe2ed7e
commit d68ad3e617
6 changed files with 418 additions and 4 deletions

View File

@ -425,6 +425,9 @@ export interface ReflectionHost {
*/
isClass(node: ts.Node): node is ts.NamedDeclaration;
/**
* Determines whether the given declaration has a base class.
*/
hasBaseClass(node: ts.Declaration): boolean;
/**