@@ -16732,7 +16732,10 @@ namespace ts {
1673216732 * marked as referenced to prevent import elision.
1673316733 */
1673416734 function markTypeNodeAsReferenced(node: TypeNode) {
16735- const typeName = node && getEntityNameFromTypeNode(node);
16735+ markEntityNameOrEntityExpressionAsReference(node && getEntityNameFromTypeNode(node));
16736+ }
16737+
16738+ function markEntityNameOrEntityExpressionAsReference(typeName: EntityNameOrEntityNameExpression) {
1673616739 const rootName = typeName && getFirstIdentifier(typeName);
1673716740 const rootSymbol = rootName && resolveName(rootName, rootName.text, (typeName.kind === SyntaxKind.Identifier ? SymbolFlags.Type : SymbolFlags.Namespace) | SymbolFlags.Alias, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined);
1673816741 if (rootSymbol
@@ -16743,6 +16746,65 @@ namespace ts {
1674316746 }
1674416747 }
1674516748
16749+ function markDecoratorMedataDataTypeNodeAsReferenced(node: TypeNode): void {
16750+ const entityNameOrToken = getEntityNameForDecoratoryMetadata(node);
16751+ if (entityNameOrToken && isEntityName(entityNameOrToken)) {
16752+ markEntityNameOrEntityExpressionAsReference(entityNameOrToken);
16753+ }
16754+ }
16755+
16756+ type voidUndefinedNullOrNeverTypeNode = Token<SyntaxKind.VoidKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.NullKeyword | SyntaxKind.NeverKeyword>;
16757+
16758+ function getEntityNameForDecoratoryMetadata(node: TypeNode): EntityName | voidUndefinedNullOrNeverTypeNode {
16759+ if (node) {
16760+ switch (node.kind) {
16761+ case SyntaxKind.IntersectionType:
16762+ case SyntaxKind.UnionType:
16763+ let commonEntityName: EntityName | voidUndefinedNullOrNeverTypeNode;
16764+ for (const typeNode of (<UnionOrIntersectionTypeNode>node).types) {
16765+ const individualEntityName = getEntityNameForDecoratoryMetadata(typeNode);
16766+ if (!individualEntityName) {
16767+ // Individual is something like string number
16768+ // So it would be serialized to either that type or object
16769+ // Safe to return here
16770+ return undefined;
16771+ }
16772+
16773+ const isCommonEntityName = commonEntityName && isEntityName(commonEntityName);
16774+ const isIndividualEntityName = isEntityName(individualEntityName);
16775+ if (isCommonEntityName && isIndividualEntityName) {
16776+ // Note this is in sync with the transformation that happens for type node.
16777+ // Keep this in sync with serializeUnionOrIntersectionType
16778+ // Verify if they refer to same entity and is identifier
16779+ // return undefined if they dont match because we would emit object
16780+ if (!isIdentifier(commonEntityName) ||
16781+ !isIdentifier(individualEntityName) ||
16782+ commonEntityName.text !== individualEntityName.text) {
16783+ return undefined;
16784+ }
16785+ }
16786+ else if (!isCommonEntityName) {
16787+ commonEntityName = individualEntityName;
16788+ }
16789+ }
16790+ return commonEntityName;
16791+
16792+ case SyntaxKind.ParenthesizedType:
16793+ return getEntityNameForDecoratoryMetadata((<ParenthesizedTypeNode>node).type);
16794+
16795+ case SyntaxKind.TypeReference:
16796+ return (<TypeReferenceNode>node).typeName;
16797+
16798+ case SyntaxKind.VoidKeyword:
16799+ case SyntaxKind.UndefinedKeyword:
16800+ case SyntaxKind.NullKeyword:
16801+ case SyntaxKind.NeverKeyword:
16802+ return <voidUndefinedNullOrNeverTypeNode>node;
16803+
16804+ }
16805+ }
16806+ }
16807+
1674616808 function getParameterTypeNodeForDecoratorCheck(node: ParameterDeclaration): TypeNode {
1674716809 return node.dotDotDotToken ? getRestParameterElementType(node.type) : node.type;
1674816810 }
@@ -16778,7 +16840,7 @@ namespace ts {
1677816840 const constructor = getFirstConstructorWithBody(<ClassDeclaration>node);
1677916841 if (constructor) {
1678016842 for (const parameter of constructor.parameters) {
16781- markTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
16843+ markDecoratorMedataDataTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
1678216844 }
1678316845 }
1678416846 break;
@@ -16787,17 +16849,17 @@ namespace ts {
1678716849 case SyntaxKind.GetAccessor:
1678816850 case SyntaxKind.SetAccessor:
1678916851 for (const parameter of (<FunctionLikeDeclaration>node).parameters) {
16790- markTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
16852+ markDecoratorMedataDataTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(parameter));
1679116853 }
1679216854
16793- markTypeNodeAsReferenced ((<FunctionLikeDeclaration>node).type);
16855+ markDecoratorMedataDataTypeNodeAsReferenced ((<FunctionLikeDeclaration>node).type);
1679416856 break;
1679516857
1679616858 case SyntaxKind.PropertyDeclaration:
16797- markTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(<ParameterDeclaration>node));
16859+ markDecoratorMedataDataTypeNodeAsReferenced (getParameterTypeNodeForDecoratorCheck(<ParameterDeclaration>node));
1679816860 break;
1679916861 case SyntaxKind.Parameter:
16800- markTypeNodeAsReferenced ((<PropertyDeclaration>node).type);
16862+ markDecoratorMedataDataTypeNodeAsReferenced ((<PropertyDeclaration>node).type);
1680116863 break;
1680216864 }
1680316865 }
0 commit comments