@@ -18717,7 +18717,10 @@ namespace ts {
1871718717 * marked as referenced to prevent import elision.
1871818718 */
1871918719 function markTypeNodeAsReferenced(node: TypeNode) {
18720- const typeName = node && getEntityNameFromTypeNode(node);
18720+ markEntityNameOrEntityExpressionAsReference(node && getEntityNameFromTypeNode(node));
18721+ }
18722+
18723+ function markEntityNameOrEntityExpressionAsReference(typeName: EntityNameOrEntityNameExpression) {
1872118724 const rootName = typeName && getFirstIdentifier(typeName);
1872218725 const rootSymbol = rootName && resolveName(rootName, rootName.text, (typeName.kind === SyntaxKind.Identifier ? SymbolFlags.Type : SymbolFlags.Namespace) | SymbolFlags.Alias, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined);
1872318726 if (rootSymbol
@@ -18728,6 +18731,61 @@ namespace ts {
1872818731 }
1872918732 }
1873018733
18734+ /**
18735+ * This function marks the type used for metadata decorator as referenced if it is import
18736+ * from external module.
18737+ * This is different from markTypeNodeAsReferenced because it tries to simplify type nodes in
18738+ * union and intersection type
18739+ * @param node
18740+ */
18741+ function markDecoratorMedataDataTypeNodeAsReferenced(node: TypeNode): void {
18742+ const entityName = getEntityNameForDecoratorMetadata(node);
18743+ if (entityName && isEntityName(entityName)) {
18744+ markEntityNameOrEntityExpressionAsReference(entityName);
18745+ }
18746+ }
18747+
18748+ function getEntityNameForDecoratorMetadata(node: TypeNode): EntityName {
18749+ if (node) {
18750+ switch (node.kind) {
18751+ case SyntaxKind.IntersectionType:
18752+ case SyntaxKind.UnionType:
18753+ let commonEntityName: EntityName;
18754+ for (const typeNode of (<UnionOrIntersectionTypeNode>node).types) {
18755+ const individualEntityName = getEntityNameForDecoratorMetadata(typeNode);
18756+ if (!individualEntityName) {
18757+ // Individual is something like string number
18758+ // So it would be serialized to either that type or object
18759+ // Safe to return here
18760+ return undefined;
18761+ }
18762+
18763+ if (commonEntityName) {
18764+ // Note this is in sync with the transformation that happens for type node.
18765+ // Keep this in sync with serializeUnionOrIntersectionType
18766+ // Verify if they refer to same entity and is identifier
18767+ // return undefined if they dont match because we would emit object
18768+ if (!isIdentifier(commonEntityName) ||
18769+ !isIdentifier(individualEntityName) ||
18770+ commonEntityName.text !== individualEntityName.text) {
18771+ return undefined;
18772+ }
18773+ }
18774+ else {
18775+ commonEntityName = individualEntityName;
18776+ }
18777+ }
18778+ return commonEntityName;
18779+
18780+ case SyntaxKind.ParenthesizedType:
18781+ return getEntityNameForDecoratorMetadata((<ParenthesizedTypeNode>node).type);
18782+
18783+ case SyntaxKind.TypeReference:
18784+ return (<TypeReferenceNode>node).typeName;
18785+ }
18786+ }
18787+ }
18788+
1873118789 function getParameterTypeNodeForDecoratorCheck(node: ParameterDeclaration): TypeNode {
1873218790 return node.dotDotDotToken ? getRestParameterElementType(node.type) : node.type;
1873318791 }
@@ -18763,7 +18821,7 @@ namespace ts {
1876318821 const constructor = getFirstConstructorWithBody(<ClassDeclaration>node);
1876418822 if (constructor) {
1876518823 for (const parameter of constructor.parameters) {
18766- markTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
18824+ markDecoratorMedataDataTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
1876718825 }
1876818826 }
1876918827 break;
@@ -18772,17 +18830,17 @@ namespace ts {
1877218830 case SyntaxKind.GetAccessor:
1877318831 case SyntaxKind.SetAccessor:
1877418832 for (const parameter of (<FunctionLikeDeclaration>node).parameters) {
18775- markTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
18833+ markDecoratorMedataDataTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
1877618834 }
1877718835
18778- markTypeNodeAsReferenced ((<FunctionLikeDeclaration>node).type);
18836+ markDecoratorMedataDataTypeNodeAsReferenced ((<FunctionLikeDeclaration>node).type);
1877918837 break;
1878018838
1878118839 case SyntaxKind.PropertyDeclaration:
18782- markTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(<ParameterDeclaration>node));
18840+ markDecoratorMedataDataTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(<ParameterDeclaration>node));
1878318841 break;
1878418842 case SyntaxKind.Parameter:
18785- markTypeNodeAsReferenced ((<PropertyDeclaration>node).type);
18843+ markDecoratorMedataDataTypeNodeAsReferenced ((<PropertyDeclaration>node).type);
1878618844 break;
1878718845 }
1878818846 }
0 commit comments