Skip to content

Commit e66ce87

Browse files
Kingwlsandersn
andauthored
expose jsdoc factory (#29539)
* expose jsdoc factory * refactor jsdoc factory * correctly jsdoc factory types * update jsdoc factory * Add check for delete expression must be optional * accept new basseline * Revert "Add check for delete expression must be optional" This reverts commit 76937c3. * remove newline * make linter happy * Add deprecated comment Co-authored-by: Nathan Shively-Sanders <[email protected]>
1 parent 8d78984 commit e66ce87

File tree

4 files changed

+164
-19
lines changed

4 files changed

+164
-19
lines changed

src/compiler/factoryPublic.ts

+108-17
Original file line numberDiff line numberDiff line change
@@ -2464,64 +2464,155 @@ namespace ts {
24642464

24652465
// JSDoc
24662466

2467-
/* @internal */
24682467
export function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression {
24692468
const node = createSynthesizedNode(SyntaxKind.JSDocTypeExpression) as JSDocTypeExpression;
24702469
node.type = type;
24712470
return node;
24722471
}
24732472

2474-
/* @internal */
24752473
export function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag {
2476-
const tag = createJSDocTag<JSDocTypeTag>(SyntaxKind.JSDocTypeTag, "type");
2474+
const tag = createJSDocTag<JSDocTypeTag>(SyntaxKind.JSDocTypeTag, "type", comment);
24772475
tag.typeExpression = typeExpression;
2478-
tag.comment = comment;
24792476
return tag;
24802477
}
24812478

2482-
/* @internal */
24832479
export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag {
2484-
const tag = createJSDocTag<JSDocReturnTag>(SyntaxKind.JSDocReturnTag, "returns");
2480+
const tag = createJSDocTag<JSDocReturnTag>(SyntaxKind.JSDocReturnTag, "returns", comment);
24852481
tag.typeExpression = typeExpression;
2486-
tag.comment = comment;
24872482
return tag;
24882483
}
24892484

2490-
/** @internal */
24912485
export function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag {
24922486
const tag = createJSDocTag<JSDocThisTag>(SyntaxKind.JSDocThisTag, "this");
24932487
tag.typeExpression = typeExpression;
24942488
return tag;
24952489
}
24962490

2497-
/* @internal */
2491+
/**
2492+
* @deprecated Use `createJSDocParameterTag` to create jsDoc param tag.
2493+
*/
24982494
export function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag {
2499-
const tag = createJSDocTag<JSDocParameterTag>(SyntaxKind.JSDocParameterTag, "param");
2495+
const tag = createJSDocTag<JSDocParameterTag>(SyntaxKind.JSDocParameterTag, "param", comment);
25002496
tag.typeExpression = typeExpression;
25012497
tag.name = name;
25022498
tag.isBracketed = isBracketed;
2503-
tag.comment = comment;
25042499
return tag;
25052500
}
25062501

2507-
/* @internal */
2508-
export function createJSDocClassTag(): JSDocClassTag {
2509-
return createJSDocTag<JSDocClassTag>(SyntaxKind.JSDocClassTag, "class");
2502+
export function createJSDocClassTag(comment?: string): JSDocClassTag {
2503+
return createJSDocTag<JSDocClassTag>(SyntaxKind.JSDocClassTag, "class", comment);
25102504
}
25112505

25122506

2513-
/* @internal */
25142507
export function createJSDocComment(comment?: string | undefined, tags?: NodeArray<JSDocTag> | undefined) {
25152508
const node = createSynthesizedNode(SyntaxKind.JSDocComment) as JSDoc;
25162509
node.comment = comment;
25172510
node.tags = tags;
25182511
return node;
25192512
}
25202513

2521-
/* @internal */
2522-
function createJSDocTag<T extends JSDocTag>(kind: T["kind"], tagName: string): T {
2514+
export function createJSDocTag<T extends JSDocTag>(kind: T["kind"], tagName: string, comment?: string): T {
25232515
const node = createSynthesizedNode(kind) as T;
25242516
node.tagName = createIdentifier(tagName);
2517+
node.comment = comment;
2518+
return node;
2519+
}
2520+
2521+
export function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string) {
2522+
const tag = createJSDocTag<JSDocAugmentsTag>(SyntaxKind.JSDocAugmentsTag, "augments", comment);
2523+
tag.class = classExpression;
2524+
return tag;
2525+
}
2526+
2527+
export function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string) {
2528+
const tag = createJSDocTag<JSDocEnumTag>(SyntaxKind.JSDocEnumTag, "enum", comment);
2529+
tag.typeExpression = typeExpression;
2530+
return tag;
2531+
}
2532+
2533+
export function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string) {
2534+
const tag = createJSDocTag<JSDocTemplateTag>(SyntaxKind.JSDocTemplateTag, "template", comment);
2535+
tag.constraint = constraint;
2536+
tag.typeParameters = asNodeArray(typeParameters);
2537+
return tag;
2538+
}
2539+
2540+
export function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral) {
2541+
const tag = createJSDocTag<JSDocTypedefTag>(SyntaxKind.JSDocTypedefTag, "typedef", comment);
2542+
tag.fullName = fullName;
2543+
tag.name = name;
2544+
tag.typeExpression = typeExpression;
2545+
return tag;
2546+
}
2547+
2548+
export function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature) {
2549+
const tag = createJSDocTag<JSDocCallbackTag>(SyntaxKind.JSDocCallbackTag, "callback", comment);
2550+
tag.fullName = fullName;
2551+
tag.name = name;
2552+
tag.typeExpression = typeExpression;
2553+
return tag;
2554+
}
2555+
2556+
export function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag) {
2557+
const tag = createSynthesizedNode(SyntaxKind.JSDocSignature) as JSDocSignature;
2558+
tag.typeParameters = typeParameters;
2559+
tag.parameters = parameters;
2560+
tag.type = type;
2561+
return tag;
2562+
}
2563+
2564+
function createJSDocPropertyLikeTag<T extends JSDocPropertyLikeTag>(kind: T["kind"], tagName: "arg" | "argument" | "param", typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string) {
2565+
const tag = createJSDocTag<T>(kind, tagName, comment);
2566+
tag.typeExpression = typeExpression;
2567+
tag.name = name;
2568+
tag.isNameFirst = isNameFirst;
2569+
tag.isBracketed = isBracketed;
2570+
return tag;
2571+
}
2572+
2573+
export function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string) {
2574+
return createJSDocPropertyLikeTag<JSDocPropertyTag>(SyntaxKind.JSDocPropertyTag, "param", typeExpression, name, isNameFirst, isBracketed, comment);
2575+
}
2576+
2577+
export function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string) {
2578+
return createJSDocPropertyLikeTag<JSDocParameterTag>(SyntaxKind.JSDocParameterTag, "param", typeExpression, name, isNameFirst, isBracketed, comment);
2579+
}
2580+
2581+
export function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean) {
2582+
const tag = createSynthesizedNode(SyntaxKind.JSDocTypeLiteral) as JSDocTypeLiteral;
2583+
tag.jsDocPropertyTags = jsDocPropertyTags;
2584+
tag.isArrayType = isArrayType;
2585+
return tag;
2586+
}
2587+
2588+
export function createJSDocImplementsTag(classExpression: JSDocImplementsTag["class"], comment?: string) {
2589+
const tag = createJSDocTag<JSDocImplementsTag>(SyntaxKind.JSDocImplementsTag, "implements", comment);
2590+
tag.class = classExpression;
2591+
return tag;
2592+
}
2593+
2594+
export function createJSDocAuthorTag(comment?: string) {
2595+
return createJSDocTag(SyntaxKind.JSDocAuthorTag, "author", comment);
2596+
}
2597+
2598+
export function createJSDocPublicTag() {
2599+
return createJSDocTag(SyntaxKind.JSDocPublicTag, "public");
2600+
}
2601+
2602+
export function createJSDocPrivateTag() {
2603+
return createJSDocTag(SyntaxKind.JSDocPrivateTag, "private");
2604+
}
2605+
2606+
export function createJSDocProtectedTag() {
2607+
return createJSDocTag(SyntaxKind.JSDocProtectedTag, "protected");
2608+
}
2609+
2610+
export function createJSDocReadonlyTag() {
2611+
return createJSDocTag(SyntaxKind.JSDocReadonlyTag, "readonly");
2612+
}
2613+
2614+
export function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc) {
2615+
node.jsDoc = append(node.jsDoc, jsdoc);
25252616
return node;
25262617
}
25272618

src/services/codefixes/inferFromUsage.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ namespace ts.codefix {
346346
const typeNode = inference.type && getTypeNodeIfAccessible(inference.type, param, program, host);
347347
const name = getSynthesizedClone(param.name);
348348
setEmitFlags(name, EmitFlags.NoComments | EmitFlags.NoNestedComments);
349-
return typeNode && createJSDocParamTag(name, !!inference.isOptional, createJSDocTypeExpression(typeNode), "");
349+
return typeNode && createJSDocParameterTag(createJSDocTypeExpression(typeNode), name, /* isNameFirst */ false, !!inference.isOptional, "");
350350
});
351351
addJSDocTags(changes, sourceFile, signature, paramTags);
352352
}
@@ -382,7 +382,7 @@ namespace ts.codefix {
382382
const oldParam = oldTag as JSDocParameterTag;
383383
const newParam = newTag as JSDocParameterTag;
384384
return isIdentifier(oldParam.name) && isIdentifier(newParam.name) && oldParam.name.escapedText === newParam.name.escapedText
385-
? createJSDocParamTag(newParam.name, newParam.isBracketed, newParam.typeExpression, oldParam.comment)
385+
? createJSDocParameterTag(newParam.typeExpression, newParam.name, newParam.isNameFirst, newParam.isBracketed, oldParam.comment)
386386
: undefined;
387387
}
388388
case SyntaxKind.JSDocReturnTag:

tests/baselines/reference/api/tsserverlibrary.d.ts

+27
Original file line numberDiff line numberDiff line change
@@ -4247,6 +4247,33 @@ declare namespace ts {
42474247
function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier;
42484248
function createExternalModuleReference(expression: Expression): ExternalModuleReference;
42494249
function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference;
4250+
function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression;
4251+
function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag;
4252+
function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag;
4253+
function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag;
4254+
/**
4255+
* @deprecated Use `createJSDocParameterTag` to create jsDoc param tag.
4256+
*/
4257+
function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag;
4258+
function createJSDocClassTag(comment?: string): JSDocClassTag;
4259+
function createJSDocComment(comment?: string | undefined, tags?: NodeArray<JSDocTag> | undefined): JSDoc;
4260+
function createJSDocTag<T extends JSDocTag>(kind: T["kind"], tagName: string, comment?: string): T;
4261+
function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag;
4262+
function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag;
4263+
function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string): JSDocTemplateTag;
4264+
function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag;
4265+
function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag;
4266+
function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag): JSDocSignature;
4267+
function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag;
4268+
function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag;
4269+
function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral;
4270+
function createJSDocImplementsTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag;
4271+
function createJSDocAuthorTag(comment?: string): JSDocTag;
4272+
function createJSDocPublicTag(): JSDocTag;
4273+
function createJSDocPrivateTag(): JSDocTag;
4274+
function createJSDocProtectedTag(): JSDocTag;
4275+
function createJSDocReadonlyTag(): JSDocTag;
4276+
function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer;
42504277
function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement;
42514278
function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement;
42524279
function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement;

tests/baselines/reference/api/typescript.d.ts

+27
Original file line numberDiff line numberDiff line change
@@ -4247,6 +4247,33 @@ declare namespace ts {
42474247
function updateExportSpecifier(node: ExportSpecifier, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier;
42484248
function createExternalModuleReference(expression: Expression): ExternalModuleReference;
42494249
function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference;
4250+
function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression;
4251+
function createJSDocTypeTag(typeExpression: JSDocTypeExpression, comment?: string): JSDocTypeTag;
4252+
function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocReturnTag;
4253+
function createJSDocThisTag(typeExpression?: JSDocTypeExpression): JSDocThisTag;
4254+
/**
4255+
* @deprecated Use `createJSDocParameterTag` to create jsDoc param tag.
4256+
*/
4257+
function createJSDocParamTag(name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, comment?: string): JSDocParameterTag;
4258+
function createJSDocClassTag(comment?: string): JSDocClassTag;
4259+
function createJSDocComment(comment?: string | undefined, tags?: NodeArray<JSDocTag> | undefined): JSDoc;
4260+
function createJSDocTag<T extends JSDocTag>(kind: T["kind"], tagName: string, comment?: string): T;
4261+
function createJSDocAugmentsTag(classExpression: JSDocAugmentsTag["class"], comment?: string): JSDocAugmentsTag;
4262+
function createJSDocEnumTag(typeExpression?: JSDocTypeExpression, comment?: string): JSDocEnumTag;
4263+
function createJSDocTemplateTag(constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string): JSDocTemplateTag;
4264+
function createJSDocTypedefTag(fullName?: JSDocNamespaceDeclaration | Identifier, name?: Identifier, comment?: string, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral): JSDocTypedefTag;
4265+
function createJSDocCallbackTag(fullName: JSDocNamespaceDeclaration | Identifier | undefined, name: Identifier | undefined, comment: string | undefined, typeExpression: JSDocSignature): JSDocCallbackTag;
4266+
function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag): JSDocSignature;
4267+
function createJSDocPropertyTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocPropertyTag;
4268+
function createJSDocParameterTag(typeExpression: JSDocTypeExpression | undefined, name: EntityName, isNameFirst: boolean, isBracketed: boolean, comment?: string): JSDocParameterTag;
4269+
function createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral;
4270+
function createJSDocImplementsTag(classExpression: JSDocImplementsTag["class"], comment?: string): JSDocImplementsTag;
4271+
function createJSDocAuthorTag(comment?: string): JSDocTag;
4272+
function createJSDocPublicTag(): JSDocTag;
4273+
function createJSDocPrivateTag(): JSDocTag;
4274+
function createJSDocProtectedTag(): JSDocTag;
4275+
function createJSDocReadonlyTag(): JSDocTag;
4276+
function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc): JSDocContainer;
42504277
function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement;
42514278
function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement;
42524279
function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement;

0 commit comments

Comments
 (0)