Skip to content

Commit bb23e96

Browse files
authored
Parse JSDoc ...T and T= only at top-level JSDoc (#22661)
* Parse JSDoc ...T and T= only at top-level JSDoc ...T and T= should only be legal at the top level of a type, and only in JSDoc, since at least T= is ambiguous elsewhere. This PR changes parsing to make that happen. The resulting parse tree is now simpler, allowing me to get rid of some code I had to add in the checker. * Extract JSDoc type parsing into its own function * PR comments:return from parseJSDocType
1 parent 5fd3ed2 commit bb23e96

11 files changed

+56
-114
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6574,14 +6574,7 @@ namespace ts {
65746574
// node.type should only be a JSDocOptionalType when node is a parameter of a JSDocFunctionType
65756575
node.type && node.type.kind === SyntaxKind.JSDocOptionalType
65766576
|| getJSDocParameterTags(node).some(({ isBracketed, typeExpression }) =>
6577-
isBracketed || !!typeExpression && skipJSDocPrefixTypes(typeExpression.type).kind === SyntaxKind.JSDocOptionalType));
6578-
}
6579-
6580-
function skipJSDocPrefixTypes(type: TypeNode): TypeNode {
6581-
while (type.kind === SyntaxKind.JSDocNullableType || type.kind === SyntaxKind.JSDocNonNullableType) {
6582-
type = (type as JSDocNullableType | JSDocNonNullableType).type;
6583-
}
6584-
return type;
6577+
isBracketed || !!typeExpression && typeExpression.type.kind === SyntaxKind.JSDocOptionalType));
65856578
}
65866579

65876580
function tryFindAmbientModule(moduleName: string, withAugmentations: boolean) {

src/compiler/parser.ts

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,11 +2204,18 @@ namespace ts {
22042204
}
22052205

22062206
function parseJSDocAllType(): JSDocAllType {
2207-
const result = <JSDocAllType>createNode(SyntaxKind.JSDocAllType);
2207+
const result = createNode(SyntaxKind.JSDocAllType) as JSDocAllType;
22082208
nextToken();
22092209
return finishNode(result);
22102210
}
22112211

2212+
function parseJSDocNonNullableType(): TypeNode {
2213+
const result = createNode(SyntaxKind.JSDocNonNullableType) as JSDocNonNullableType;
2214+
nextToken();
2215+
result.type = parseNonArrayType();
2216+
return finishNode(result);
2217+
}
2218+
22122219
function parseJSDocUnknownOrNullableType(): JSDocUnknownType | JSDocNullableType {
22132220
const pos = scanner.getStartPos();
22142221
// skip the ?
@@ -2259,15 +2266,22 @@ namespace ts {
22592266
parameter.name = parseIdentifierName();
22602267
parseExpected(SyntaxKind.ColonToken);
22612268
}
2262-
parameter.type = parseType();
2269+
parameter.type = parseJSDocType();
22632270
return finishNode(parameter);
22642271
}
22652272

2266-
function parseJSDocNodeWithType(kind: SyntaxKind.JSDocVariadicType | SyntaxKind.JSDocNonNullableType): TypeNode {
2267-
const result = createNode(kind) as JSDocVariadicType | JSDocNonNullableType;
2268-
nextToken();
2269-
result.type = parseNonArrayType();
2270-
return finishNode(result);
2273+
function parseJSDocType() {
2274+
const dotdotdot = parseOptionalToken(SyntaxKind.DotDotDotToken);
2275+
let type = parseType();
2276+
if (dotdotdot) {
2277+
const variadic = createNode(SyntaxKind.JSDocVariadicType, dotdotdot.pos) as JSDocVariadicType;
2278+
variadic.type = type;
2279+
type = finishNode(variadic);
2280+
}
2281+
if (token() === SyntaxKind.EqualsToken) {
2282+
return createJSDocPostfixType(SyntaxKind.JSDocOptionalType, type);
2283+
}
2284+
return type;
22712285
}
22722286

22732287
function parseTypeQuery(): TypeQueryNode {
@@ -2732,7 +2746,7 @@ namespace ts {
27322746
case SyntaxKind.FunctionKeyword:
27332747
return parseJSDocFunctionType();
27342748
case SyntaxKind.ExclamationToken:
2735-
return parseJSDocNodeWithType(SyntaxKind.JSDocNonNullableType);
2749+
return parseJSDocNonNullableType();
27362750
case SyntaxKind.NoSubstitutionTemplateLiteral:
27372751
case SyntaxKind.StringLiteral:
27382752
case SyntaxKind.NumericLiteral:
@@ -2817,13 +2831,6 @@ namespace ts {
28172831
let type = parseNonArrayType();
28182832
while (!scanner.hasPrecedingLineBreak()) {
28192833
switch (token()) {
2820-
case SyntaxKind.EqualsToken:
2821-
// only parse postfix = inside jsdoc, because it's ambiguous elsewhere
2822-
if (!(contextFlags & NodeFlags.JSDoc)) {
2823-
return type;
2824-
}
2825-
type = createJSDocPostfixType(SyntaxKind.JSDocOptionalType, type);
2826-
break;
28272834
case SyntaxKind.ExclamationToken:
28282835
type = createJSDocPostfixType(SyntaxKind.JSDocNonNullableType, type);
28292836
break;
@@ -2889,12 +2896,6 @@ namespace ts {
28892896
return parseTypeOperator(operator);
28902897
case SyntaxKind.InferKeyword:
28912898
return parseInferType();
2892-
case SyntaxKind.DotDotDotToken: {
2893-
const result = createNode(SyntaxKind.JSDocVariadicType) as JSDocVariadicType;
2894-
nextToken();
2895-
result.type = parsePostfixTypeOrHigher();
2896-
return finishNode(result);
2897-
}
28982899
}
28992900
return parsePostfixTypeOrHigher();
29002901
}
@@ -6156,7 +6157,7 @@ namespace ts {
61566157
const result = <JSDocTypeExpression>createNode(SyntaxKind.JSDocTypeExpression, scanner.getTokenPos());
61576158

61586159
const hasBrace = (mayOmitBraces ? parseOptional : parseExpected)(SyntaxKind.OpenBraceToken);
6159-
result.type = doInsideOfContext(NodeFlags.JSDoc, parseType);
6160+
result.type = doInsideOfContext(NodeFlags.JSDoc, parseJSDocType);
61606161
if (!mayOmitBraces || hasBrace) {
61616162
parseExpected(SyntaxKind.CloseBraceToken);
61626163
}

tests/baselines/reference/jsdocDisallowedInTypescript.errors.txt

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,16 @@ tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(11,12): error TS255
77
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(13,14): error TS8020: JSDoc types can only be used inside documentation comments.
88
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(14,11): error TS8020: JSDoc types can only be used inside documentation comments.
99
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(15,8): error TS8020: JSDoc types can only be used inside documentation comments.
10-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(16,5): error TS2322: Type 'boolean[]' is not assignable to type 'boolean | undefined'.
11-
Type 'boolean[]' is not assignable to type 'false'.
12-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(16,15): error TS8020: JSDoc types can only be used inside documentation comments.
13-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(16,15): error TS8028: JSDoc '...' may only appear in the last parameter of a signature.
14-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(17,11): error TS8020: JSDoc types can only be used inside documentation comments.
10+
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(16,11): error TS8020: JSDoc types can only be used inside documentation comments.
11+
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(17,17): error TS8020: JSDoc types can only be used inside documentation comments.
12+
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(18,5): error TS2322: Type 'undefined' is not assignable to type 'number | null'.
1513
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(18,17): error TS8020: JSDoc types can only be used inside documentation comments.
16-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(19,5): error TS2322: Type 'undefined' is not assignable to type 'number | null'.
17-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(19,17): error TS8020: JSDoc types can only be used inside documentation comments.
14+
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(20,16): error TS8020: JSDoc types can only be used inside documentation comments.
1815
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(21,16): error TS8020: JSDoc types can only be used inside documentation comments.
19-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(22,16): error TS8020: JSDoc types can only be used inside documentation comments.
20-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(23,17): error TS8020: JSDoc types can only be used inside documentation comments.
21-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(24,17): error TS8020: JSDoc types can only be used inside documentation comments.
22-
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(24,17): error TS8028: JSDoc '...' may only appear in the last parameter of a signature.
16+
tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(22,17): error TS8020: JSDoc types can only be used inside documentation comments.
2317

2418

25-
==== tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts (21 errors) ====
19+
==== tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts (16 errors) ====
2620
// grammar error from checker
2721
var ara: Array.<number> = [1,2,3];
2822
~
@@ -56,14 +50,6 @@ tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(24,17): error TS802
5650
var g: function(number, number): number = (n,m) => n + m;
5751
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5852
!!! error TS8020: JSDoc types can only be used inside documentation comments.
59-
var variadic: ...boolean = [true, false, true];
60-
~~~~~~~~
61-
!!! error TS2322: Type 'boolean[]' is not assignable to type 'boolean | undefined'.
62-
!!! error TS2322: Type 'boolean[]' is not assignable to type 'false'.
63-
~~~~~~~~~~
64-
!!! error TS8020: JSDoc types can only be used inside documentation comments.
65-
~~~~~~~~~~
66-
!!! error TS8028: JSDoc '...' may only appear in the last parameter of a signature.
6753
var most: !string = 'definite';
6854
~~~~~~~
6955
!!! error TS8020: JSDoc types can only be used inside documentation comments.
@@ -85,10 +71,5 @@ tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(24,17): error TS802
8571
var anys: Array<*>;
8672
~
8773
!!! error TS8020: JSDoc types can only be used inside documentation comments.
88-
var vars: Array<...number>;
89-
~~~~~~~~~
90-
!!! error TS8020: JSDoc types can only be used inside documentation comments.
91-
~~~~~~~~~
92-
!!! error TS8028: JSDoc '...' may only appear in the last parameter of a signature.
9374

9475

tests/baselines/reference/jsdocDisallowedInTypescript.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ function hof2(f: function(this: number, string): string) {
1414
var whatevs: * = 1001;
1515
var ques: ? = 'what';
1616
var g: function(number, number): number = (n,m) => n + m;
17-
var variadic: ...boolean = [true, false, true];
1817
var most: !string = 'definite';
1918
var postfixdef: number! = 101;
2019
var postfixopt: number? = undefined;
2120

2221
var nns: Array<?number>;
2322
var dns: Array<!number>;
2423
var anys: Array<*>;
25-
var vars: Array<...number>;
2624

2725

2826

@@ -42,11 +40,9 @@ function hof2(f) {
4240
var whatevs = 1001;
4341
var ques = 'what';
4442
var g = function (n, m) { return n + m; };
45-
var variadic = [true, false, true];
4643
var most = 'definite';
4744
var postfixdef = 101;
4845
var postfixopt = undefined;
4946
var nns;
5047
var dns;
5148
var anys;
52-
var vars;

tests/baselines/reference/jsdocDisallowedInTypescript.symbols

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,33 +45,26 @@ var g: function(number, number): number = (n,m) => n + m;
4545
>n : Symbol(n, Decl(jsdocDisallowedInTypescript.ts, 14, 43))
4646
>m : Symbol(m, Decl(jsdocDisallowedInTypescript.ts, 14, 45))
4747

48-
var variadic: ...boolean = [true, false, true];
49-
>variadic : Symbol(variadic, Decl(jsdocDisallowedInTypescript.ts, 15, 3))
50-
5148
var most: !string = 'definite';
52-
>most : Symbol(most, Decl(jsdocDisallowedInTypescript.ts, 16, 3))
49+
>most : Symbol(most, Decl(jsdocDisallowedInTypescript.ts, 15, 3))
5350

5451
var postfixdef: number! = 101;
55-
>postfixdef : Symbol(postfixdef, Decl(jsdocDisallowedInTypescript.ts, 17, 3))
52+
>postfixdef : Symbol(postfixdef, Decl(jsdocDisallowedInTypescript.ts, 16, 3))
5653

5754
var postfixopt: number? = undefined;
58-
>postfixopt : Symbol(postfixopt, Decl(jsdocDisallowedInTypescript.ts, 18, 3))
55+
>postfixopt : Symbol(postfixopt, Decl(jsdocDisallowedInTypescript.ts, 17, 3))
5956
>undefined : Symbol(undefined)
6057

6158
var nns: Array<?number>;
62-
>nns : Symbol(nns, Decl(jsdocDisallowedInTypescript.ts, 20, 3))
59+
>nns : Symbol(nns, Decl(jsdocDisallowedInTypescript.ts, 19, 3))
6360
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
6461

6562
var dns: Array<!number>;
66-
>dns : Symbol(dns, Decl(jsdocDisallowedInTypescript.ts, 21, 3))
63+
>dns : Symbol(dns, Decl(jsdocDisallowedInTypescript.ts, 20, 3))
6764
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
6865

6966
var anys: Array<*>;
70-
>anys : Symbol(anys, Decl(jsdocDisallowedInTypescript.ts, 22, 3))
71-
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
72-
73-
var vars: Array<...number>;
74-
>vars : Symbol(vars, Decl(jsdocDisallowedInTypescript.ts, 23, 3))
67+
>anys : Symbol(anys, Decl(jsdocDisallowedInTypescript.ts, 21, 3))
7568
>Array : Symbol(Array, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
7669

7770

tests/baselines/reference/jsdocDisallowedInTypescript.types

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,6 @@ var g: function(number, number): number = (n,m) => n + m;
6464
>n : number
6565
>m : number
6666

67-
var variadic: ...boolean = [true, false, true];
68-
>variadic : boolean | undefined
69-
>[true, false, true] : boolean[]
70-
>true : true
71-
>false : false
72-
>true : true
73-
7467
var most: !string = 'definite';
7568
>most : string
7669
>'definite' : "definite"
@@ -95,8 +88,4 @@ var anys: Array<*>;
9588
>anys : any[]
9689
>Array : T[]
9790

98-
var vars: Array<...number>;
99-
>vars : (number | undefined)[]
100-
>Array : T[]
101-
10291

tests/baselines/reference/jsdocPrefixPostfixParsing.errors.txt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
1-
tests/cases/conformance/jsdoc/prefixPostfix.js(8,13): error TS8028: JSDoc '...' may only appear in the last parameter of a signature.
1+
tests/cases/conformance/jsdoc/prefixPostfix.js(8,12): error TS1014: A rest parameter must be last in a parameter list.
22
tests/cases/conformance/jsdoc/prefixPostfix.js(9,12): error TS1014: A rest parameter must be last in a parameter list.
33
tests/cases/conformance/jsdoc/prefixPostfix.js(10,12): error TS1014: A rest parameter must be last in a parameter list.
44
tests/cases/conformance/jsdoc/prefixPostfix.js(11,12): error TS1014: A rest parameter must be last in a parameter list.
55
tests/cases/conformance/jsdoc/prefixPostfix.js(12,12): error TS1014: A rest parameter must be last in a parameter list.
66
tests/cases/conformance/jsdoc/prefixPostfix.js(13,12): error TS1014: A rest parameter must be last in a parameter list.
7-
tests/cases/conformance/jsdoc/prefixPostfix.js(14,12): error TS1014: A rest parameter must be last in a parameter list.
87

98

10-
==== tests/cases/conformance/jsdoc/prefixPostfix.js (7 errors) ====
9+
==== tests/cases/conformance/jsdoc/prefixPostfix.js (6 errors) ====
1110
/**
1211
* @param {number![]} x - number[]
1312
* @param {!number[]} y - number[]
1413
* @param {(number[])!} z - number[]
1514
* @param {number?[]} a - (number | null)[]
1615
* @param {?number[]} b - number[] | null
1716
* @param {(number[])?} c - number[] | null
18-
* @param {?...number} d - number[] | null
19-
~~~~~~~~~
20-
!!! error TS8028: JSDoc '...' may only appear in the last parameter of a signature.
2117
* @param {...?number} e - (number | null)[]
2218
~~~~~~~~~~
2319
!!! error TS1014: A rest parameter must be last in a parameter list.
@@ -38,6 +34,6 @@ tests/cases/conformance/jsdoc/prefixPostfix.js(14,12): error TS1014: A rest para
3834
!!! error TS1014: A rest parameter must be last in a parameter list.
3935
* @param {...number?[]!} k - (number[] | null)[]
4036
*/
41-
function f(x, y, z, a, b, c, d, e, f, g, h, i, j, k) {
37+
function f(x, y, z, a, b, c, e, f, g, h, i, j, k) {
4238
}
4339

tests/baselines/reference/jsdocPrefixPostfixParsing.symbols

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
* @param {number?[]} a - (number | null)[]
77
* @param {?number[]} b - number[] | null
88
* @param {(number[])?} c - number[] | null
9-
* @param {?...number} d - number[] | null
109
* @param {...?number} e - (number | null)[]
1110
* @param {...number?} f - number[] | null
1211
* @param {...number!?} g - number[] | null
@@ -15,21 +14,20 @@
1514
* @param {...number![]?} j - number[][] | null
1615
* @param {...number?[]!} k - (number[] | null)[]
1716
*/
18-
function f(x, y, z, a, b, c, d, e, f, g, h, i, j, k) {
17+
function f(x, y, z, a, b, c, e, f, g, h, i, j, k) {
1918
>f : Symbol(f, Decl(prefixPostfix.js, 0, 0))
20-
>x : Symbol(x, Decl(prefixPostfix.js, 16, 11))
21-
>y : Symbol(y, Decl(prefixPostfix.js, 16, 13))
22-
>z : Symbol(z, Decl(prefixPostfix.js, 16, 16))
23-
>a : Symbol(a, Decl(prefixPostfix.js, 16, 19))
24-
>b : Symbol(b, Decl(prefixPostfix.js, 16, 22))
25-
>c : Symbol(c, Decl(prefixPostfix.js, 16, 25))
26-
>d : Symbol(d, Decl(prefixPostfix.js, 16, 28))
27-
>e : Symbol(e, Decl(prefixPostfix.js, 16, 31))
28-
>f : Symbol(f, Decl(prefixPostfix.js, 16, 34))
29-
>g : Symbol(g, Decl(prefixPostfix.js, 16, 37))
30-
>h : Symbol(h, Decl(prefixPostfix.js, 16, 40))
31-
>i : Symbol(i, Decl(prefixPostfix.js, 16, 43))
32-
>j : Symbol(j, Decl(prefixPostfix.js, 16, 46))
33-
>k : Symbol(k, Decl(prefixPostfix.js, 16, 49))
19+
>x : Symbol(x, Decl(prefixPostfix.js, 15, 11))
20+
>y : Symbol(y, Decl(prefixPostfix.js, 15, 13))
21+
>z : Symbol(z, Decl(prefixPostfix.js, 15, 16))
22+
>a : Symbol(a, Decl(prefixPostfix.js, 15, 19))
23+
>b : Symbol(b, Decl(prefixPostfix.js, 15, 22))
24+
>c : Symbol(c, Decl(prefixPostfix.js, 15, 25))
25+
>e : Symbol(e, Decl(prefixPostfix.js, 15, 28))
26+
>f : Symbol(f, Decl(prefixPostfix.js, 15, 31))
27+
>g : Symbol(g, Decl(prefixPostfix.js, 15, 34))
28+
>h : Symbol(h, Decl(prefixPostfix.js, 15, 37))
29+
>i : Symbol(i, Decl(prefixPostfix.js, 15, 40))
30+
>j : Symbol(j, Decl(prefixPostfix.js, 15, 43))
31+
>k : Symbol(k, Decl(prefixPostfix.js, 15, 46))
3432
}
3533

tests/baselines/reference/jsdocPrefixPostfixParsing.types

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
* @param {number?[]} a - (number | null)[]
77
* @param {?number[]} b - number[] | null
88
* @param {(number[])?} c - number[] | null
9-
* @param {?...number} d - number[] | null
109
* @param {...?number} e - (number | null)[]
1110
* @param {...number?} f - number[] | null
1211
* @param {...number!?} g - number[] | null
@@ -15,15 +14,14 @@
1514
* @param {...number![]?} j - number[][] | null
1615
* @param {...number?[]!} k - (number[] | null)[]
1716
*/
18-
function f(x, y, z, a, b, c, d, e, f, g, h, i, j, k) {
19-
>f : (x: number[], y: number[], z: number[], a: (number | null)[], b: number[] | null, c: number[] | null, d: number | null | undefined, e: number | null | undefined, f: number | null | undefined, g: number | null | undefined, h: number | null | undefined, i: number[] | undefined, j: number[] | null | undefined, k: (number | null)[] | undefined) => void
17+
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 | null | undefined, f: number | null | undefined, g: number | null | undefined, h: number | null | undefined, i: number[] | undefined, j: number[] | null | undefined, k: (number | null)[] | undefined) => void
2019
>x : number[]
2120
>y : number[]
2221
>z : number[]
2322
>a : (number | null)[]
2423
>b : number[] | null
2524
>c : number[] | null
26-
>d : number | null | undefined
2725
>e : number | null | undefined
2826
>f : number | null | undefined
2927
>g : number | null | undefined

tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@ function hof2(f: function(this: number, string): string) {
1515
var whatevs: * = 1001;
1616
var ques: ? = 'what';
1717
var g: function(number, number): number = (n,m) => n + m;
18-
var variadic: ...boolean = [true, false, true];
1918
var most: !string = 'definite';
2019
var postfixdef: number! = 101;
2120
var postfixopt: number? = undefined;
2221

2322
var nns: Array<?number>;
2423
var dns: Array<!number>;
2524
var anys: Array<*>;
26-
var vars: Array<...number>;
2725

tests/cases/conformance/jsdoc/jsdocPrefixPostfixParsing.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
* @param {number?[]} a - (number | null)[]
1414
* @param {?number[]} b - number[] | null
1515
* @param {(number[])?} c - number[] | null
16-
* @param {?...number} d - number[] | null
1716
* @param {...?number} e - (number | null)[]
1817
* @param {...number?} f - number[] | null
1918
* @param {...number!?} g - number[] | null
@@ -22,5 +21,5 @@
2221
* @param {...number![]?} j - number[][] | null
2322
* @param {...number?[]!} k - (number[] | null)[]
2423
*/
25-
function f(x, y, z, a, b, c, d, e, f, g, h, i, j, k) {
24+
function f(x, y, z, a, b, c, e, f, g, h, i, j, k) {
2625
}

0 commit comments

Comments
 (0)