Skip to content

Commit a551c4c

Browse files
authored
Allow curly around @type jsdoc to be optional (#20074)
* Allow curly around `@type` jsdoc to be optional * Incorporate restructuring from @Andy-MS
1 parent 71ceb91 commit a551c4c

File tree

6 files changed

+38
-31
lines changed

6 files changed

+38
-31
lines changed

src/compiler/parser.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6132,16 +6132,14 @@ namespace ts {
61326132
}
61336133

61346134
// Parses out a JSDoc type expression.
6135-
export function parseJSDocTypeExpression(): JSDocTypeExpression;
6136-
export function parseJSDocTypeExpression(requireBraces: true): JSDocTypeExpression | undefined;
6137-
export function parseJSDocTypeExpression(requireBraces?: boolean): JSDocTypeExpression | undefined {
6135+
export function parseJSDocTypeExpression(mayOmitBraces?: boolean): JSDocTypeExpression {
61386136
const result = <JSDocTypeExpression>createNode(SyntaxKind.JSDocTypeExpression, scanner.getTokenPos());
61396137

6140-
if (!parseExpected(SyntaxKind.OpenBraceToken) && requireBraces) {
6141-
return undefined;
6142-
}
6138+
const hasBrace = (mayOmitBraces ? parseOptional : parseExpected)(SyntaxKind.OpenBraceToken);
61436139
result.type = doInsideOfContext(NodeFlags.JSDoc, parseType);
6144-
parseExpected(SyntaxKind.CloseBraceToken);
6140+
if (!mayOmitBraces || hasBrace) {
6141+
parseExpected(SyntaxKind.CloseBraceToken);
6142+
}
61456143

61466144
fixupParentReferences(result);
61476145
return finishNode(result);
@@ -6597,7 +6595,7 @@ namespace ts {
65976595
const result = <JSDocTypeTag>createNode(SyntaxKind.JSDocTypeTag, atToken.pos);
65986596
result.atToken = atToken;
65996597
result.tagName = tagName;
6600-
result.typeExpression = parseJSDocTypeExpression(/*requireBraces*/ true);
6598+
result.typeExpression = parseJSDocTypeExpression(/*mayOmitBraces*/ true);
66016599
return finishNode(result);
66026600
}
66036601

src/compiler/scanner.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,14 +1873,25 @@ namespace ts {
18731873
return token = SyntaxKind.CommaToken;
18741874
case CharacterCodes.dot:
18751875
pos++;
1876+
if (text.substr(tokenPos, pos + 2) === "...") {
1877+
pos += 2;
1878+
return token = SyntaxKind.DotDotDotToken;
1879+
}
18761880
return token = SyntaxKind.DotToken;
1881+
case CharacterCodes.exclamation:
1882+
pos++;
1883+
return token = SyntaxKind.ExclamationToken;
1884+
case CharacterCodes.question:
1885+
pos++;
1886+
return token = SyntaxKind.QuestionToken;
18771887
}
18781888

18791889
if (isIdentifierStart(ch, ScriptTarget.Latest)) {
18801890
pos++;
18811891
while (isIdentifierPart(text.charCodeAt(pos), ScriptTarget.Latest) && pos < end) {
18821892
pos++;
18831893
}
1894+
tokenValue = text.substring(tokenPos, pos);
18841895
return token = SyntaxKind.Identifier;
18851896
}
18861897
else {

tests/baselines/reference/jsdocTypedefMissingType.errors.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
/a.js(2,14): error TS8021: JSDoc '@typedef' tag should either have a type annotation or be followed by '@property' or '@member' tags.
2-
/a.js(12,11): error TS1005: '{' expected.
32

43

5-
==== /a.js (2 errors) ====
4+
==== /a.js (1 errors) ====
65
// Bad: missing a type
76
/** @typedef T */
87
~
@@ -17,7 +16,5 @@
1716
*/
1817

1918
/** @type Person */
20-
~~~~~~
21-
!!! error TS1005: '{' expected.
2219
const person = { name: "" };
2320

tests/baselines/reference/jsdocTypedefMissingType.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ const t = 0;
1414

1515
/** @type Person */
1616
const person = { name: "" };
17-
>person : { [x: string]: any; name: string; }
18-
>{ name: "" } : { [x: string]: any; name: string; }
17+
>person : { name: string; }
18+
>{ name: "" } : { name: string; }
1919
>name : string
2020
>"" : ""
2121

tests/baselines/reference/malformedTags.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* @type Function
66
*/
77
var isArray = Array.isArray;
8-
>isArray : (arg: any) => arg is any[]
8+
>isArray : Function
99
>Array.isArray : (arg: any) => arg is any[]
1010
>Array : ArrayConstructor
1111
>isArray : (arg: any) => arg is any[]

tests/baselines/reference/user/chrome-devtools-frontend.log

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@ node_modules/chrome-devtools-frontend/front_end/Runtime.js(478,17): error TS2503
5050
node_modules/chrome-devtools-frontend/front_end/Runtime.js(488,17): error TS2503: Cannot find namespace 'Runtime'.
5151
node_modules/chrome-devtools-frontend/front_end/Runtime.js(489,17): error TS2503: Cannot find namespace 'Runtime'.
5252
node_modules/chrome-devtools-frontend/front_end/Runtime.js(502,16): error TS2503: Cannot find namespace 'Runtime'.
53-
node_modules/chrome-devtools-frontend/front_end/Runtime.js(527,9): error TS2322: Type 'Window' is not assignable to type 'new () => any'.
54-
Type 'Window' provides no match for the signature 'new (): any'.
55-
node_modules/chrome-devtools-frontend/front_end/Runtime.js(527,55): error TS1005: '{' expected.
53+
node_modules/chrome-devtools-frontend/front_end/Runtime.js(527,9): error TS2322: Type 'Function' is not assignable to type 'new () => any'.
54+
Type 'Function' provides no match for the signature 'new (): any'.
55+
node_modules/chrome-devtools-frontend/front_end/Runtime.js(527,49): error TS2352: Type 'Window' cannot be converted to type 'Function'.
56+
Property 'apply' is missing in type 'Window'.
5657
node_modules/chrome-devtools-frontend/front_end/Runtime.js(539,20): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature.
5758
node_modules/chrome-devtools-frontend/front_end/Runtime.js(577,10): error TS2339: Property 'name' does not exist on type '(Anonymous class)'.
5859
node_modules/chrome-devtools-frontend/front_end/Runtime.js(582,10): error TS2339: Property 'extensions' does not exist on type '(Anonymous class)'.
@@ -332,7 +333,7 @@ node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.
332333
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(301,5): error TS2304: Cannot find name 'UI'.
333334
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(302,23): error TS2339: Property 'tabIndex' does not exist on type 'Element'.
334335
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(311,5): error TS2304: Cannot find name 'UI'.
335-
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(314,15): error TS1005: '{' expected.
336+
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(314,23): error TS2503: Cannot find namespace 'Accessibility'.
336337
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(323,23): error TS2339: Property 'style' does not exist on type 'Element'.
337338
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(330,27): error TS2339: Property 'createChild' does not exist on type 'Element'.
338339
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(357,15): error TS2503: Cannot find namespace 'Accessibility'.
@@ -8542,7 +8543,7 @@ node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManag
85428543
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(247,15): error TS2503: Cannot find namespace 'Coverage'.
85438544
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(248,15): error TS2503: Cannot find namespace 'Coverage'.
85448545
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(255,15): error TS2503: Cannot find namespace 'Common'.
8545-
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(258,34): error TS1005: '{' expected.
8546+
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(258,35): error TS2503: Cannot find namespace 'Workspace'.
85468547
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(259,39): error TS2304: Cannot find name 'Coverage'.
85478548
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(263,1): error TS2304: Cannot find name 'Coverage'.
85488549
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(268,1): error TS2304: Cannot find name 'Coverage'.
@@ -8744,7 +8745,7 @@ node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(220,1):
87448745
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(223,15): error TS2503: Cannot find namespace 'UI'.
87458746
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(229,5): error TS2304: Cannot find name 'UI'.
87468747
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(230,21): error TS2304: Cannot find name 'UI'.
8747-
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(231,59): error TS1005: '{' expected.
8748+
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(231,60): error TS2503: Cannot find namespace 'Coverage'.
87488749
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(237,15): error TS2503: Cannot find namespace 'Coverage'.
87498750
node_modules/chrome-devtools-frontend/front_end/coverage_test_runner/CoverageTestRunner.js(10,1): error TS2304: Cannot find name 'CoverageTestRunner'.
87508751
node_modules/chrome-devtools-frontend/front_end/coverage_test_runner/CoverageTestRunner.js(11,3): error TS2304: Cannot find name 'UI'.
@@ -13261,7 +13262,6 @@ node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker
1326113262
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(46,81): error TS2708: Cannot use namespace 'FormatterWorker' as a value.
1326213263
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(51,3): error TS2322: Type '(line: string, callback: (arg0: string, arg1: string, arg2: number, arg3: number) => any) => void' is not assignable to type '(arg0: string) => any'.
1326313264
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(54,1): error TS2708: Cannot use namespace 'FormatterWorker' as a value.
13264-
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(58,26): error TS1005: '{' expected.
1326513265
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(64,7): error TS2708: Cannot use namespace 'FormatterWorker' as a value.
1326613266
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(67,7): error TS2708: Cannot use namespace 'FormatterWorker' as a value.
1326713267
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(70,7): error TS2708: Cannot use namespace 'FormatterWorker' as a value.
@@ -14928,7 +14928,6 @@ node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(49,
1492814928
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(51,9): error TS2304: Cannot find name 'LayerViewer'.
1492914929
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(54,32): error TS2339: Property 'contentElement' does not exist on type '(Anonymous class)'.
1493014930
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(66,32): error TS2304: Cannot find name 'LayerViewer'.
14931-
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(68,15): error TS1005: '{' expected.
1493214931
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(76,15): error TS2503: Cannot find namespace 'SDK'.
1493314932
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(89,15): error TS2503: Cannot find namespace 'SDK'.
1493414933
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(98,5): error TS2304: Cannot find name 'UI'.
@@ -15008,7 +15007,11 @@ node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(547
1500815007
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(548,33): error TS2304: Cannot find name 'LayerViewer'.
1500915008
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(552,74): error TS2304: Cannot find name 'LayerViewer'.
1501015009
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(557,28): error TS2304: Cannot find name 'LayerViewer'.
15010+
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(559,48): error TS2339: Property 'image' does not exist on type 'WebGLTexture'.
15011+
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(561,49): error TS2339: Property 'image' does not exist on type 'WebGLTexture'.
15012+
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(561,94): error TS2339: Property 'image' does not exist on type 'WebGLTexture'.
1501115013
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(565,25): error TS2304: Cannot find name 'LayerViewer'.
15014+
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(566,97): error TS2339: Property 'image' does not exist on type 'WebGLTexture'.
1501215015
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(576,15): error TS2503: Cannot find namespace 'LayerViewer'.
1501315016
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(590,15): error TS2339: Property 'isShowing' does not exist on type '(Anonymous class)'.
1501415017
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(595,34): error TS2339: Property 'contentElement' does not exist on type '(Anonymous class)'.
@@ -18482,9 +18485,8 @@ node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(847,29): e
1848218485
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(859,25): error TS2304: Cannot find name 'UI'.
1848318486
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(870,27): error TS2304: Cannot find name 'UI'.
1848418487
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(903,42): error TS2503: Cannot find namespace 'PerfUI'.
18485-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(907,17): error TS1005: '{' expected.
18486-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(915,27): error TS2339: Property 'peekLast' does not exist on type '{ [x: string]: any; nestingLevel: number; visible: boolean; }[]'.
18487-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(919,45): error TS2339: Property 'peekLast' does not exist on type '{ [x: string]: any; nestingLevel: number; visible: boolean; }[]'.
18488+
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(915,27): error TS2339: Property 'peekLast' does not exist on type '{ nestingLevel: number; visible: boolean; }[]'.
18489+
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(919,45): error TS2339: Property 'peekLast' does not exist on type '{ nestingLevel: number; visible: boolean; }[]'.
1848818490
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(931,15): error TS2503: Cannot find namespace 'PerfUI'.
1848918491
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(935,12): error TS2304: Cannot find name 'UI'.
1849018492
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(940,15): error TS2503: Cannot find namespace 'PerfUI'.
@@ -18496,9 +18498,8 @@ node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1004,18):
1849618498
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1090,18): error TS2304: Cannot find name 'PerfUI'.
1849718499
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1117,15): error TS2503: Cannot find namespace 'PerfUI'.
1849818500
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1165,46): error TS2304: Cannot find name 'PerfUI'.
18499-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1167,15): error TS1005: '{' expected.
18500-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1176,27): error TS2339: Property 'peekLast' does not exist on type '{ [x: string]: any; nestingLevel: number; visible: boolean; }[]'.
18501-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1182,43): error TS2339: Property 'peekLast' does not exist on type '{ [x: string]: any; nestingLevel: number; visible: boolean; }[]'.
18501+
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1176,27): error TS2339: Property 'peekLast' does not exist on type '{ nestingLevel: number; visible: boolean; }[]'.
18502+
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1182,43): error TS2339: Property 'peekLast' does not exist on type '{ nestingLevel: number; visible: boolean; }[]'.
1850218503
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1273,25): error TS2339: Property 'style' does not exist on type 'Element'.
1850318504
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1286,19): error TS2339: Property 'constrain' does not exist on type 'NumberConstructor'.
1850418505
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1376,1): error TS2304: Cannot find name 'PerfUI'.
@@ -31622,7 +31623,7 @@ node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(
3162231623
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(24,20): error TS2304: Cannot find name 'Timeline'.
3162331624
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(26,38): error TS2304: Cannot find name 'UI'.
3162431625
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(31,37): error TS2304: Cannot find name 'Common'.
31625-
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(34,15): error TS1005: '{' expected.
31626+
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(34,27): error TS2503: Cannot find namespace 'Timeline'.
3162631627
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(38,32): error TS2304: Cannot find name 'Timeline'.
3162731628
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(39,40): error TS2304: Cannot find name 'Common'.
3162831629
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(42,32): error TS2304: Cannot find name 'Timeline'.
@@ -34041,7 +34042,7 @@ node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilt
3404134042
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(40,14): error TS2304: Cannot find name 'TimelineModel'.
3404234043
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(41,27): error TS2304: Cannot find name 'TimelineModel'.
3404334044
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(42,14): error TS2304: Cannot find name 'TimelineModel'.
34044-
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(43,22): error TS1005: '{' expected.
34045+
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(43,23): error TS2503: Cannot find namespace 'TimelineModel'.
3404534046
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(47,1): error TS2304: Cannot find name 'TimelineModel'.
3404634047
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(47,61): error TS2304: Cannot find name 'TimelineModel'.
3404734048
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(58,15): error TS2503: Cannot find namespace 'SDK'.

0 commit comments

Comments
 (0)