Skip to content

Commit 9ac05e2

Browse files
committed
Allow curly around @type jsdoc to be optional
1 parent 478b404 commit 9ac05e2

File tree

6 files changed

+27
-21
lines changed

6 files changed

+27
-21
lines changed

src/compiler/parser.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6131,6 +6131,14 @@ namespace ts {
61316131
return jsDocTypeExpression ? { jsDocTypeExpression, diagnostics } : undefined;
61326132
}
61336133

6134+
function parseUnbracketedJSDocTypeExpression(): JSDocTypeExpression {
6135+
const result = <JSDocTypeExpression>createNode(SyntaxKind.JSDocTypeExpression, scanner.getTokenPos());
6136+
result.type = doInsideOfContext(NodeFlags.JSDoc, parseType);
6137+
6138+
fixupParentReferences(result);
6139+
return finishNode(result);
6140+
}
6141+
61346142
// Parses out a JSDoc type expression.
61356143
export function parseJSDocTypeExpression(): JSDocTypeExpression;
61366144
export function parseJSDocTypeExpression(requireBraces: true): JSDocTypeExpression | undefined;
@@ -6486,9 +6494,9 @@ namespace ts {
64866494
tagsEnd = tag.end;
64876495
}
64886496

6489-
function tryParseTypeExpression(): JSDocTypeExpression | undefined {
6497+
function tryParseTypeExpression(bracketlessFallback?: boolean): JSDocTypeExpression | undefined {
64906498
skipWhitespace();
6491-
return token() === SyntaxKind.OpenBraceToken ? parseJSDocTypeExpression() : undefined;
6499+
return token() === SyntaxKind.OpenBraceToken ? parseJSDocTypeExpression() : bracketlessFallback ? parseUnbracketedJSDocTypeExpression() : undefined;
64926500
}
64936501

64946502
function parseBracketNameInPropertyAndParamTag(): { name: EntityName, isBracketed: boolean } {
@@ -6597,7 +6605,7 @@ namespace ts {
65976605
const result = <JSDocTypeTag>createNode(SyntaxKind.JSDocTypeTag, atToken.pos);
65986606
result.atToken = atToken;
65996607
result.tagName = tagName;
6600-
result.typeExpression = parseJSDocTypeExpression(/*requireBraces*/ true);
6608+
result.typeExpression = tryParseTypeExpression(/*bracketlessFallback*/ true);
66016609
return finishNode(result);
66026610
}
66036611

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: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
Exit Code: 1
22
Standard output:
33
node_modules/chrome-devtools-frontend/front_end/Runtime.js(398,24): error TS1138: Parameter declaration expected.
4-
node_modules/chrome-devtools-frontend/front_end/Runtime.js(527,55): error TS1005: '{' expected.
5-
node_modules/chrome-devtools-frontend/front_end/accessibility/AXBreadcrumbsPane.js(314,15): error TS1005: '{' expected.
64
node_modules/chrome-devtools-frontend/front_end/animation/AnimationModel.js(810,65): error TS1003: Identifier expected.
75
node_modules/chrome-devtools-frontend/front_end/audits/AuditRules.js(488,2): error TS1003: Identifier expected.
86
node_modules/chrome-devtools-frontend/front_end/audits/AuditsPanel.js(513,28): error TS1005: '>' expected.
@@ -48,10 +46,8 @@ node_modules/chrome-devtools-frontend/front_end/console/ConsoleView.js(1521,2):
4846
node_modules/chrome-devtools-frontend/front_end/console_test_runner/ConsoleTestRunner.js(10,73): error TS1003: Identifier expected.
4947
node_modules/chrome-devtools-frontend/front_end/cookie_table/CookiesTable.js(39,36): error TS1138: Parameter declaration expected.
5048
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(7,2): error TS1131: Property or signature expected.
51-
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageDecorationManager.js(258,34): error TS1005: '{' expected.
5249
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageModel.js(5,72): error TS1003: Identifier expected.
5350
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageModel.js(8,57): error TS1003: Identifier expected.
54-
node_modules/chrome-devtools-frontend/front_end/coverage/CoverageView.js(231,59): error TS1005: '{' expected.
5551
node_modules/chrome-devtools-frontend/front_end/data_grid/DataGrid.js(1200,2): error TS1131: Property or signature expected.
5652
node_modules/chrome-devtools-frontend/front_end/devices/DevicesView.js(890,194): error TS1003: Identifier expected.
5753
node_modules/chrome-devtools-frontend/front_end/devices/DevicesView.js(893,105): error TS1003: Identifier expected.
@@ -98,7 +94,6 @@ node_modules/chrome-devtools-frontend/front_end/formatter/FormatterWorkerPool.js
9894
node_modules/chrome-devtools-frontend/front_end/formatter/FormatterWorkerPool.js(322,2): error TS1003: Identifier expected.
9995
node_modules/chrome-devtools-frontend/front_end/formatter/FormatterWorkerPool.js(327,2): error TS1003: Identifier expected.
10096
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(32,30): error TS1138: Parameter declaration expected.
101-
node_modules/chrome-devtools-frontend/front_end/formatter_worker/FormatterWorker.js(58,26): error TS1005: '{' expected.
10297
node_modules/chrome-devtools-frontend/front_end/formatter_worker/RelaxedJSONParser.js(180,2): error TS1003: Identifier expected.
10398
node_modules/chrome-devtools-frontend/front_end/heap_snapshot_worker/HeapSnapshot.js(1370,4): error TS1131: Property or signature expected.
10499
node_modules/chrome-devtools-frontend/front_end/heap_snapshot_worker/HeapSnapshot.js(2118,2): error TS1131: Property or signature expected.
@@ -107,7 +102,6 @@ node_modules/chrome-devtools-frontend/front_end/help/Help.js(57,2): error TS1131
107102
node_modules/chrome-devtools-frontend/front_end/host/InspectorFrontendHostAPI.js(16,4): error TS1003: Identifier expected.
108103
node_modules/chrome-devtools-frontend/front_end/host/InspectorFrontendHostAPI.js(23,4): error TS1003: Identifier expected.
109104
node_modules/chrome-devtools-frontend/front_end/inline_editor/BezierEditor.js(270,103): error TS1003: Identifier expected.
110-
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(68,15): error TS1005: '{' expected.
111105
node_modules/chrome-devtools-frontend/front_end/layer_viewer/Layers3DView.js(761,67): error TS1003: Identifier expected.
112106
node_modules/chrome-devtools-frontend/front_end/mobile_throttling/ThrottlingPresets.js(14,2): error TS1131: Property or signature expected.
113107
node_modules/chrome-devtools-frontend/front_end/mobile_throttling/ThrottlingPresets.js(56,2): error TS1131: Property or signature expected.
@@ -129,8 +123,6 @@ node_modules/chrome-devtools-frontend/front_end/network_log/NetworkLog.js(470,13
129123
node_modules/chrome-devtools-frontend/front_end/object_ui/CustomPreviewComponent.js(140,16): error TS1110: Type expected.
130124
node_modules/chrome-devtools-frontend/front_end/object_ui/CustomPreviewComponent.js(141,16): error TS1110: Type expected.
131125
node_modules/chrome-devtools-frontend/front_end/object_ui/JavaScriptAutocomplete.js(7,64): error TS1003: Identifier expected.
132-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(907,17): error TS1005: '{' expected.
133-
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1167,15): error TS1005: '{' expected.
134126
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1387,2): error TS1131: Property or signature expected.
135127
node_modules/chrome-devtools-frontend/front_end/perf_ui/FlameChart.js(1397,2): error TS1131: Property or signature expected.
136128
node_modules/chrome-devtools-frontend/front_end/perf_ui/TimelineGrid.js(266,89): error TS1003: Identifier expected.
@@ -164,7 +156,7 @@ node_modules/chrome-devtools-frontend/front_end/sdk/LayerTreeBase.js(8,1): error
164156
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkManager.js(182,71): error TS1003: Identifier expected.
165157
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkManager.js(198,2): error TS1131: Property or signature expected.
166158
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkManager.js(238,48): error TS1003: Identifier expected.
167-
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkManager.js(1197,86): error TS1003: Identifier expected.
159+
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkManager.js(1200,86): error TS1003: Identifier expected.
168160
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkRequest.js(1117,47): error TS1003: Identifier expected.
169161
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkRequest.js(1127,122): error TS1003: Identifier expected.
170162
node_modules/chrome-devtools-frontend/front_end/sdk/NetworkRequest.js(1130,82): error TS1003: Identifier expected.
@@ -210,13 +202,11 @@ node_modules/chrome-devtools-frontend/front_end/text_utils/TextUtils.js(340,32):
210202
node_modules/chrome-devtools-frontend/front_end/timeline/PerformanceMonitor.js(394,2): error TS1131: Property or signature expected.
211203
node_modules/chrome-devtools-frontend/front_end/timeline/PerformanceMonitor.js(406,2): error TS1131: Property or signature expected.
212204
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineController.js(283,2): error TS1131: Property or signature expected.
213-
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineDetailsView.js(34,15): error TS1005: '{' expected.
214205
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineHistoryManager.js(255,86): error TS1003: Identifier expected.
215206
node_modules/chrome-devtools-frontend/front_end/timeline/TimelinePanel.js(1087,106): error TS1003: Identifier expected.
216207
node_modules/chrome-devtools-frontend/front_end/timeline/TimelineUIUtils.js(2113,2): error TS1131: Property or signature expected.
217208
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModel.js(1246,99): error TS1003: Identifier expected.
218209
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModel.js(1420,82): error TS1003: Identifier expected.
219-
node_modules/chrome-devtools-frontend/front_end/timeline_model/TimelineModelFilter.js(43,22): error TS1005: '{' expected.
220210
node_modules/chrome-devtools-frontend/front_end/timeline_model/TracingLayerTree.js(17,1): error TS1003: Identifier expected.
221211
node_modules/chrome-devtools-frontend/front_end/timeline_model/TracingLayerTree.js(26,1): error TS1003: Identifier expected.
222212
node_modules/chrome-devtools-frontend/front_end/ui/Context.js(14,33): error TS1110: Type expected.

0 commit comments

Comments
 (0)