Skip to content

Commit a1418be

Browse files
committed
Fix an issue where JSDoc optional params were not parsed correctly
1 parent 3752eda commit a1418be

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

tsdoc/src/__tests__/__snapshots__/ParsingBasics.test.ts.snap

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2320,6 +2320,22 @@ Object {
23202320
"kind": "Excerpt: ParamBlock_ParameterName",
23212321
"nodeExcerpt": "k",
23222322
},
2323+
Object {
2324+
"kind": "Excerpt: ErrorText",
2325+
"nodeExcerpt": "]",
2326+
},
2327+
Object {
2328+
"kind": "Excerpt: Spacing",
2329+
"nodeExcerpt": " ",
2330+
},
2331+
Object {
2332+
"kind": "Excerpt: ParamBlock_Hyphen",
2333+
"nodeExcerpt": "-",
2334+
},
2335+
Object {
2336+
"kind": "Excerpt: Spacing",
2337+
"nodeExcerpt": " ",
2338+
},
23232339
Object {
23242340
"kind": "Section",
23252341
"nodes": Array [
@@ -2331,7 +2347,7 @@ Object {
23312347
"nodes": Array [
23322348
Object {
23332349
"kind": "Excerpt: PlainText",
2334-
"nodeExcerpt": "] - description",
2350+
"nodeExcerpt": "description",
23352351
},
23362352
],
23372353
},
@@ -2648,7 +2664,6 @@ Object {
26482664
"(10,15): The @param block should not include a JSDoc-style '{type}'",
26492665
"(11,15): The @param block should not include a JSDoc-style '{type}'",
26502666
"(12,11): The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets.",
2651-
"(12,4): The @param block should be followed by a parameter name and then a hyphen",
26522667
"(13,11): The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets.",
26532668
"(14,11): The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets.",
26542669
"(15,11): The @param should not include a JSDoc-style optional name; it must not be enclosed in '[ ]' brackets.",

tsdoc/src/parser/NodeParser.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,13 @@ export class NodeParser {
334334
}
335335
}
336336

337+
/**
338+
* Used by `_parseParamBlock()`, this parses a JSDoc expression remainder like `string}` or `="]"]` from
339+
* an input like `@param {string} [x="]"] - the X value`. It detects nested balanced pairs of delimiters
340+
* and escaped string literals.
341+
*/
337342
private _tryParseJSDocTypeOrValueRest(tokenReader: TokenReader, openKind: TokenKind, closeKind: TokenKind): TokenSequence | undefined {
338343
const startMarker: number = tokenReader.createMarker();
339-
tokenReader.readToken();
340344

341345
let quoteKind: TokenKind | undefined;
342346
let openCount: number = 1;
@@ -382,6 +386,10 @@ export class NodeParser {
382386
return tokenReader.tryExtractAccumulatedSequence();
383387
}
384388

389+
/**
390+
* Used by `_parseParamBlock()`, this parses a JSDoc expression like `{string}` from
391+
* an input like `@param {string} x - the X value`.
392+
*/
385393
private _tryParseUnsupportedJSDocType(tokenReader: TokenReader, docBlockTag: DocBlockTag, tagName: string): TokenSequence | undefined {
386394
tokenReader.assertAccumulatedSequenceIsEmpty();
387395

@@ -390,6 +398,7 @@ export class NodeParser {
390398
tokenReader.peekTokenAfterKind() === TokenKind.AtSign) {
391399
return undefined;
392400
}
401+
tokenReader.readToken(); // read the "{"
393402

394403
let jsdocTypeExcerpt: TokenSequence | undefined = this._tryParseJSDocTypeOrValueRest(tokenReader, TokenKind.LeftCurlyBracket, TokenKind.RightCurlyBracket);
395404
if (jsdocTypeExcerpt) {
@@ -411,6 +420,10 @@ export class NodeParser {
411420
return jsdocTypeExcerpt;
412421
}
413422

423+
/**
424+
* Used by `_parseParamBlock()`, this parses a JSDoc expression remainder like `=[]]` from
425+
* an input like `@param {string} [x=[]] - the X value`.
426+
*/
414427
private _tryParseJSDocOptionalNameRest(tokenReader: TokenReader): TokenSequence | undefined {
415428
tokenReader.assertAccumulatedSequenceIsEmpty();
416429
if (tokenReader.peekTokenKind() !== TokenKind.EndOfInput) {
@@ -431,7 +444,7 @@ export class NodeParser {
431444
// Parse opening of invalid JSDoc optional parameter name (e.g., '[')
432445
let unsupportedJsdocOptionalNameOpenBracketExcerpt: TokenSequence | undefined;
433446
if (tokenReader.peekTokenKind() === TokenKind.LeftSquareBracket) {
434-
tokenReader.readToken();
447+
tokenReader.readToken(); // read the "["
435448
unsupportedJsdocOptionalNameOpenBracketExcerpt = tokenReader.extractAccumulatedSequence();
436449
}
437450

0 commit comments

Comments
 (0)