Skip to content

Commit 5b0194b

Browse files
authored
Fix jsdoc variadic type nodes not being remapped to equivalent TS in output (#38276)
1 parent b57dd52 commit 5b0194b

6 files changed

+16
-9
lines changed

src/compiler/checker.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -5567,6 +5567,9 @@ namespace ts {
55675567
if (isJSDocNonNullableType(node)) {
55685568
return visitNode(node.type, visitExistingNodeTreeSymbols);
55695569
}
5570+
if (isJSDocVariadicType(node)) {
5571+
return createArrayTypeNode(visitNode((node as JSDocVariadicType).type, visitExistingNodeTreeSymbols));
5572+
}
55705573
if (isTypeReferenceNode(node) && isIdentifier(node.typeName) && node.typeName.escapedText === "") {
55715574
return setOriginalNode(createKeywordTypeNode(SyntaxKind.AnyKeyword), node);
55725575
}
@@ -5593,8 +5596,8 @@ namespace ts {
55935596
mapDefined(node.parameters, (p, i) => p.name && isIdentifier(p.name) && p.name.escapedText === "new" ? (newTypeNode = p.type, undefined) : createParameter(
55945597
/*decorators*/ undefined,
55955598
/*modifiers*/ undefined,
5596-
p.dotDotDotToken,
5597-
p.name || p.dotDotDotToken ? `args` : `arg${i}`,
5599+
getEffectiveDotDotDotForParameter(p),
5600+
p.name || getEffectiveDotDotDotForParameter(p) ? `args` : `arg${i}`,
55985601
p.questionToken,
55995602
visitNode(p.type, visitExistingNodeTreeSymbols),
56005603
/*initializer*/ undefined
@@ -5608,8 +5611,8 @@ namespace ts {
56085611
map(node.parameters, (p, i) => createParameter(
56095612
/*decorators*/ undefined,
56105613
/*modifiers*/ undefined,
5611-
p.dotDotDotToken,
5612-
p.name || p.dotDotDotToken ? `args` : `arg${i}`,
5614+
getEffectiveDotDotDotForParameter(p),
5615+
p.name || getEffectiveDotDotDotForParameter(p) ? `args` : `arg${i}`,
56135616
p.questionToken,
56145617
visitNode(p.type, visitExistingNodeTreeSymbols),
56155618
/*initializer*/ undefined
@@ -5653,6 +5656,10 @@ namespace ts {
56535656

56545657
return visitEachChild(node, visitExistingNodeTreeSymbols, nullTransformationContext);
56555658

5659+
function getEffectiveDotDotDotForParameter(p: ParameterDeclaration) {
5660+
return p.dotDotDotToken || (p.type && isJSDocVariadicType(p.type) ? createToken(SyntaxKind.DotDotDotToken) : undefined);
5661+
}
5662+
56565663
function rewriteModuleSpecifier(parent: ImportTypeNode, lit: StringLiteral) {
56575664
if (bundled) {
56585665
if (context.tracker && context.tracker.moduleResolverHost) {

tests/baselines/reference/jsFileCompilationRestParamJsDocFunction.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* @returns {*} Returns the result of `func`.
1111
*/
1212
function apply(func, thisArg, ...args) {
13-
>apply : (func: Function, thisArg: any, ...args: ...*) => any
13+
>apply : (func: Function, thisArg: any, ...args: any[]) => any
1414
>func : Function
1515
>thisArg : any
1616
>args : any[]

tests/baselines/reference/jsdocParseDotDotDotInJSDocFunction.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// from bcryptjs
33
/** @param {function(...[*])} callback */
44
function g(callback) {
5-
>g : (callback: (arg0: ...[*]) => ) => void
5+
>g : (callback: (...args: [any][]) => ) => void
66
>callback : (...arg0: [any][]) => any
77

88
callback([1], [2], [3])

tests/baselines/reference/jsdocParseStarEquals.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/** @param {...*=} args
33
@return {*=} */
44
function f(...args) {
5-
>f : (...args: ...*=) => any | undefined
5+
>f : (...args: (any | undefined)[]) => any | undefined
66
>args : any[]
77

88
return null

tests/baselines/reference/jsdocPrefixPostfixParsing.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* @param {...number?[]!} k - (number[] | null)[]
1616
*/
1717
function f(x, y, z, a, b, c, e, f, g, h, i, j, k) {
18-
>f : (x: number[], y: number[], z: (number[]), a: (number | null)[], b: number[] | null, c: (number[]) | null, e: ...?number, f: ...?number, g: ...?!number, h: ...!?number, i: ...number[], j: ...?!number[], k: ...!?number[]) => void
18+
>f : (x: number[], y: number[], z: (number[]), a: (number | null)[], b: number[] | null, c: (number[]) | null, e: (number | null)[], f: (number | null)[], g: (number | null)[], h: (number | null)[], i: number[][], j: (number[] | null)[], k: (number | null)[][]) => void
1919
>x : number[]
2020
>y : number[]
2121
>z : number[]

tests/baselines/reference/jsdocRestParameter_es6.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
=== /a.js ===
22
/** @param {...number} a */
33
function f(...a) {
4-
>f : (...a: ...number) => void
4+
>f : (...a: number[]) => void
55
>a : number[]
66

77
a; // number[]

0 commit comments

Comments
 (0)