Skip to content

Commit e65681a

Browse files
authored
Fix assert in getjsdochost (#23575)
* Fix assert in getJSDocHost * Update public API to add wider type * Remove now-unnecessary type assertion
1 parent 22f2b11 commit e65681a

8 files changed

+190
-3
lines changed

src/compiler/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,7 @@ namespace ts {
23322332
}
23332333

23342334
export interface JSDocTag extends Node {
2335-
parent: JSDoc;
2335+
parent: JSDoc | JSDocTypeLiteral;
23362336
atToken: AtToken;
23372337
tagName: Identifier;
23382338
comment: string | undefined;

src/compiler/utilities.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1888,6 +1888,9 @@ namespace ts {
18881888
}
18891889

18901890
export function getJSDocHost(node: JSDocTag): HasJSDoc {
1891+
while (node.parent.kind === SyntaxKind.JSDocTypeLiteral) {
1892+
node = node.parent.parent.parent as JSDocParameterTag;
1893+
}
18911894
Debug.assert(node.parent!.kind === SyntaxKind.JSDocComment);
18921895
return node.parent!.parent!;
18931896
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1494,7 +1494,7 @@ declare namespace ts {
14941494
comment: string | undefined;
14951495
}
14961496
interface JSDocTag extends Node {
1497-
parent: JSDoc;
1497+
parent: JSDoc | JSDocTypeLiteral;
14981498
atToken: AtToken;
14991499
tagName: Identifier;
15001500
comment: string | undefined;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1494,7 +1494,7 @@ declare namespace ts {
14941494
comment: string | undefined;
14951495
}
14961496
interface JSDocTag extends Node {
1497-
parent: JSDoc;
1497+
parent: JSDoc | JSDocTypeLiteral;
14981498
atToken: AtToken;
14991499
tagName: Identifier;
15001500
comment: string | undefined;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js(21,1): error TS2322: Type 'false' is not assignable to type 'number'.
2+
3+
4+
==== tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js (1 errors) ====
5+
/**
6+
* @template {T}
7+
* @param {T} t
8+
*/
9+
function Zet(t) {
10+
/** @type {T} */
11+
this.u
12+
this.t = t
13+
}
14+
/**
15+
* @param {T} v
16+
* @param {object} o
17+
* @param {T} o.nested
18+
*/
19+
Zet.prototype.add = function(v, o) {
20+
this.u = v || o.nested
21+
return this.u
22+
}
23+
var z = new Zet(1)
24+
z.t = 2
25+
z.u = false
26+
~~~
27+
!!! error TS2322: Type 'false' is not assignable to type 'number'.
28+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
=== tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js ===
2+
/**
3+
* @template {T}
4+
* @param {T} t
5+
*/
6+
function Zet(t) {
7+
>Zet : Symbol(Zet, Decl(templateTagWithNestedTypeLiteral.js, 0, 0))
8+
>t : Symbol(t, Decl(templateTagWithNestedTypeLiteral.js, 4, 13))
9+
10+
/** @type {T} */
11+
this.u
12+
this.t = t
13+
>t : Symbol(Zet.t, Decl(templateTagWithNestedTypeLiteral.js, 6, 10))
14+
>t : Symbol(t, Decl(templateTagWithNestedTypeLiteral.js, 4, 13))
15+
}
16+
/**
17+
* @param {T} v
18+
* @param {object} o
19+
* @param {T} o.nested
20+
*/
21+
Zet.prototype.add = function(v, o) {
22+
>Zet.prototype : Symbol(Zet.add, Decl(templateTagWithNestedTypeLiteral.js, 8, 1))
23+
>Zet : Symbol(Zet, Decl(templateTagWithNestedTypeLiteral.js, 0, 0))
24+
>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --))
25+
>add : Symbol(Zet.add, Decl(templateTagWithNestedTypeLiteral.js, 8, 1))
26+
>v : Symbol(v, Decl(templateTagWithNestedTypeLiteral.js, 14, 29))
27+
>o : Symbol(o, Decl(templateTagWithNestedTypeLiteral.js, 14, 31))
28+
29+
this.u = v || o.nested
30+
>this.u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
31+
>this : Symbol(Zet, Decl(templateTagWithNestedTypeLiteral.js, 0, 0))
32+
>u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
33+
>v : Symbol(v, Decl(templateTagWithNestedTypeLiteral.js, 14, 29))
34+
>o.nested : Symbol(nested, Decl(templateTagWithNestedTypeLiteral.js, 12, 3))
35+
>o : Symbol(o, Decl(templateTagWithNestedTypeLiteral.js, 14, 31))
36+
>nested : Symbol(nested, Decl(templateTagWithNestedTypeLiteral.js, 12, 3))
37+
38+
return this.u
39+
>this.u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
40+
>this : Symbol(Zet, Decl(templateTagWithNestedTypeLiteral.js, 0, 0))
41+
>u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
42+
}
43+
var z = new Zet(1)
44+
>z : Symbol(z, Decl(templateTagWithNestedTypeLiteral.js, 18, 3))
45+
>Zet : Symbol(Zet, Decl(templateTagWithNestedTypeLiteral.js, 0, 0))
46+
47+
z.t = 2
48+
>z.t : Symbol(Zet.t, Decl(templateTagWithNestedTypeLiteral.js, 6, 10))
49+
>z : Symbol(z, Decl(templateTagWithNestedTypeLiteral.js, 18, 3))
50+
>t : Symbol(Zet.t, Decl(templateTagWithNestedTypeLiteral.js, 6, 10))
51+
52+
z.u = false
53+
>z.u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
54+
>z : Symbol(z, Decl(templateTagWithNestedTypeLiteral.js, 18, 3))
55+
>u : Symbol(Zet.u, Decl(templateTagWithNestedTypeLiteral.js, 4, 17), Decl(templateTagWithNestedTypeLiteral.js, 14, 36))
56+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
=== tests/cases/conformance/jsdoc/templateTagWithNestedTypeLiteral.js ===
2+
/**
3+
* @template {T}
4+
* @param {T} t
5+
*/
6+
function Zet(t) {
7+
>Zet : typeof Zet
8+
>t : T
9+
10+
/** @type {T} */
11+
this.u
12+
>this.u : any
13+
>this : any
14+
>u : any
15+
16+
this.t = t
17+
>this.t = t : T
18+
>this.t : any
19+
>this : any
20+
>t : any
21+
>t : T
22+
}
23+
/**
24+
* @param {T} v
25+
* @param {object} o
26+
* @param {T} o.nested
27+
*/
28+
Zet.prototype.add = function(v, o) {
29+
>Zet.prototype.add = function(v, o) { this.u = v || o.nested return this.u} : (v: T, o: { nested: T; }) => T
30+
>Zet.prototype.add : any
31+
>Zet.prototype : any
32+
>Zet : typeof Zet
33+
>prototype : any
34+
>add : any
35+
>function(v, o) { this.u = v || o.nested return this.u} : (v: T, o: { nested: T; }) => T
36+
>v : T
37+
>o : { nested: T; }
38+
39+
this.u = v || o.nested
40+
>this.u = v || o.nested : T
41+
>this.u : T
42+
>this : Zet
43+
>u : T
44+
>v || o.nested : T
45+
>v : T
46+
>o.nested : T
47+
>o : { nested: T; }
48+
>nested : T
49+
50+
return this.u
51+
>this.u : T
52+
>this : Zet
53+
>u : T
54+
}
55+
var z = new Zet(1)
56+
>z : typeof Zet
57+
>new Zet(1) : typeof Zet
58+
>Zet : typeof Zet
59+
>1 : 1
60+
61+
z.t = 2
62+
>z.t = 2 : 2
63+
>z.t : number
64+
>z : typeof Zet
65+
>t : number
66+
>2 : 2
67+
68+
z.u = false
69+
>z.u = false : false
70+
>z.u : number
71+
>z : typeof Zet
72+
>u : number
73+
>false : false
74+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
// @Filename: templateTagWithNestedTypeLiteral.js
5+
6+
/**
7+
* @template {T}
8+
* @param {T} t
9+
*/
10+
function Zet(t) {
11+
/** @type {T} */
12+
this.u
13+
this.t = t
14+
}
15+
/**
16+
* @param {T} v
17+
* @param {object} o
18+
* @param {T} o.nested
19+
*/
20+
Zet.prototype.add = function(v, o) {
21+
this.u = v || o.nested
22+
return this.u
23+
}
24+
var z = new Zet(1)
25+
z.t = 2
26+
z.u = false

0 commit comments

Comments
 (0)