Skip to content

Commit 2287dbc

Browse files
authored
Handle missing return type nodes and nested type references missing type arguments in existing jsdoc node serialization (#39011)
* Handle missing return type nodes and nested type references missing type arguments in existing jsdoc node serialization * Accept updated baselines
1 parent 852e7a0 commit 2287dbc

6 files changed

+147
-4
lines changed

src/compiler/checker.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -5652,7 +5652,7 @@ namespace ts {
56525652
visitNode(p.type, visitExistingNodeTreeSymbols),
56535653
/*initializer*/ undefined
56545654
)),
5655-
visitNode(newTypeNode || node.type, visitExistingNodeTreeSymbols)
5655+
visitNode(newTypeNode || node.type, visitExistingNodeTreeSymbols) || createKeywordTypeNode(SyntaxKind.AnyKeyword)
56565656
);
56575657
}
56585658
else {
@@ -5667,11 +5667,11 @@ namespace ts {
56675667
visitNode(p.type, visitExistingNodeTreeSymbols),
56685668
/*initializer*/ undefined
56695669
)),
5670-
visitNode(node.type, visitExistingNodeTreeSymbols)
5670+
visitNode(node.type, visitExistingNodeTreeSymbols) || createKeywordTypeNode(SyntaxKind.AnyKeyword)
56715671
);
56725672
}
56735673
}
5674-
if (isTypeReferenceNode(node) && isInJSDoc(node) && (getIntendedTypeFromJSDocTypeReference(node) || unknownSymbol === resolveTypeReferenceName(getTypeReferenceName(node), SymbolFlags.Type, /*ignoreErrors*/ true))) {
5674+
if (isTypeReferenceNode(node) && isInJSDoc(node) && (!existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(node, getTypeFromTypeNode(node)) || getIntendedTypeFromJSDocTypeReference(node) || unknownSymbol === resolveTypeReferenceName(getTypeReferenceName(node), SymbolFlags.Type, /*ignoreErrors*/ true))) {
56755675
return setOriginalNode(typeToTypeNodeHelper(getTypeFromTypeNode(node), context), node);
56765676
}
56775677
if (isLiteralImportTypeNode(node)) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//// [file.js]
2+
/**
3+
* @param {Array=} y desc
4+
*/
5+
function x(y) { }
6+
7+
// @ts-ignore
8+
/** @param {function (Array)} func Invoked
9+
*/
10+
function y(func) { return; }
11+
12+
/**
13+
* @return {(Array.<> | null)} list of devices
14+
*/
15+
function z() { return null ;}
16+
17+
/**
18+
*
19+
* @return {?Promise} A promise
20+
*/
21+
function w() { return null; }
22+
23+
//// [file.js]
24+
/**
25+
* @param {Array=} y desc
26+
*/
27+
function x(y) { }
28+
// @ts-ignore
29+
/** @param {function (Array)} func Invoked
30+
*/
31+
function y(func) { return; }
32+
/**
33+
* @return {(Array.<> | null)} list of devices
34+
*/
35+
function z() { return null; }
36+
/**
37+
*
38+
* @return {?Promise} A promise
39+
*/
40+
function w() { return null; }
41+
42+
43+
//// [file.d.ts]
44+
/**
45+
* @param {Array=} y desc
46+
*/
47+
declare function x(y?: any[] | undefined): void;
48+
/** @param {function (Array)} func Invoked
49+
*/
50+
declare function y(func: (arg0: any[]) => any): void;
51+
/**
52+
* @return {(Array.<> | null)} list of devices
53+
*/
54+
declare function z(): (any[] | null);
55+
/**
56+
*
57+
* @return {?Promise} A promise
58+
*/
59+
declare function w(): Promise<any> | null;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
=== tests/cases/conformance/jsdoc/declarations/file.js ===
2+
/**
3+
* @param {Array=} y desc
4+
*/
5+
function x(y) { }
6+
>x : Symbol(x, Decl(file.js, 0, 0))
7+
>y : Symbol(y, Decl(file.js, 3, 11))
8+
9+
// @ts-ignore
10+
/** @param {function (Array)} func Invoked
11+
*/
12+
function y(func) { return; }
13+
>y : Symbol(y, Decl(file.js, 3, 17))
14+
>func : Symbol(func, Decl(file.js, 8, 11))
15+
16+
/**
17+
* @return {(Array.<> | null)} list of devices
18+
*/
19+
function z() { return null ;}
20+
>z : Symbol(z, Decl(file.js, 8, 28))
21+
22+
/**
23+
*
24+
* @return {?Promise} A promise
25+
*/
26+
function w() { return null; }
27+
>w : Symbol(w, Decl(file.js, 13, 29))
28+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
=== tests/cases/conformance/jsdoc/declarations/file.js ===
2+
/**
3+
* @param {Array=} y desc
4+
*/
5+
function x(y) { }
6+
>x : (y?: any[] | undefined) => void
7+
>y : any[]
8+
9+
// @ts-ignore
10+
/** @param {function (Array)} func Invoked
11+
*/
12+
function y(func) { return; }
13+
>y : (func: (arg0: any[]) => any) => void
14+
>func : (arg0: any[]) => any
15+
16+
/**
17+
* @return {(Array.<> | null)} list of devices
18+
*/
19+
function z() { return null ;}
20+
>z : () => (any[] | null)
21+
>null : null
22+
23+
/**
24+
*
25+
* @return {?Promise} A promise
26+
*/
27+
function w() { return null; }
28+
>w : () => Promise<any> | null
29+
>null : null
30+

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: (...args: [any][]) => ) => void
5+
>g : (callback: (...args: [any][]) => any) => void
66
>callback : (...arg0: [any][]) => any
77

88
callback([1], [2], [3])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @target: es5
4+
// @outDir: ./out
5+
// @declaration: true
6+
// @filename: file.js
7+
/**
8+
* @param {Array=} y desc
9+
*/
10+
function x(y) { }
11+
12+
// @ts-ignore
13+
/** @param {function (Array)} func Invoked
14+
*/
15+
function y(func) { return; }
16+
17+
/**
18+
* @return {(Array.<> | null)} list of devices
19+
*/
20+
function z() { return null ;}
21+
22+
/**
23+
*
24+
* @return {?Promise} A promise
25+
*/
26+
function w() { return null; }

0 commit comments

Comments
 (0)