Skip to content

Commit 7bd6209

Browse files
authored
Don't parse duplicate JSDoc for ExpressionStatement starting with ParenthesizedExpression (microsoft#36289)
* don't parse JSDoc on ExpressionStatement if it starts with ParenthesizedExpression * update test
1 parent ddcf139 commit 7bd6209

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

src/compiler/parser.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1400,7 +1400,7 @@ namespace ts {
14001400

14011401
function createNodeWithJSDoc(kind: SyntaxKind, pos?: number): Node {
14021402
const node = createNode(kind, pos);
1403-
if (scanner.getTokenFlags() & TokenFlags.PrecedingJSDocComment) {
1403+
if (scanner.getTokenFlags() & TokenFlags.PrecedingJSDocComment && (kind !== SyntaxKind.ExpressionStatement || token() !== SyntaxKind.OpenParenToken)) {
14041404
addJSDocComment(<HasJSDoc>node);
14051405
}
14061406
return node;
@@ -5469,7 +5469,7 @@ namespace ts {
54695469
// Avoiding having to do the lookahead for a labeled statement by just trying to parse
54705470
// out an expression, seeing if it is identifier and then seeing if it is followed by
54715471
// a colon.
5472-
const node = <ExpressionStatement | LabeledStatement>createNodeWithJSDoc(SyntaxKind.Unknown);
5472+
const node = <ExpressionStatement | LabeledStatement>createNodeWithJSDoc(token() === SyntaxKind.Identifier ? SyntaxKind.Unknown : SyntaxKind.ExpressionStatement);
54735473
const expression = allowInAnd(parseExpression);
54745474
if (expression.kind === SyntaxKind.Identifier && parseOptional(SyntaxKind.ColonToken)) {
54755475
node.kind = SyntaxKind.LabeledStatement;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/compiler/test.js ===
2+
// @ts-check
3+
/** @typedef {number} NotADuplicateIdentifier */
4+
5+
(2 * 2);
6+
7+
/** @typedef {number} AlsoNotADuplicate */
8+
9+
(2 * 2) + 1;
10+
11+
12+
/**
13+
*
14+
* @param a {NotADuplicateIdentifier}
15+
* @param b {AlsoNotADuplicate}
16+
*/
17+
function makeSureTypedefsAreStillRecognized(a, b) {}
18+
>makeSureTypedefsAreStillRecognized : Symbol(makeSureTypedefsAreStillRecognized, Decl(test.js, 7, 12))
19+
>a : Symbol(a, Decl(test.js, 15, 44))
20+
>b : Symbol(b, Decl(test.js, 15, 46))
21+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=== tests/cases/compiler/test.js ===
2+
// @ts-check
3+
/** @typedef {number} NotADuplicateIdentifier */
4+
5+
(2 * 2);
6+
>(2 * 2) : number
7+
>2 * 2 : number
8+
>2 : 2
9+
>2 : 2
10+
11+
/** @typedef {number} AlsoNotADuplicate */
12+
13+
(2 * 2) + 1;
14+
>(2 * 2) + 1 : number
15+
>(2 * 2) : number
16+
>2 * 2 : number
17+
>2 : 2
18+
>2 : 2
19+
>1 : 1
20+
21+
22+
/**
23+
*
24+
* @param a {NotADuplicateIdentifier}
25+
* @param b {AlsoNotADuplicate}
26+
*/
27+
function makeSureTypedefsAreStillRecognized(a, b) {}
28+
>makeSureTypedefsAreStillRecognized : (a: number, b: number) => void
29+
>a : number
30+
>b : number
31+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// @allowJs: true
2+
// @noEmit: true
3+
4+
// @filename: test.js
5+
// @ts-check
6+
/** @typedef {number} NotADuplicateIdentifier */
7+
8+
(2 * 2);
9+
10+
/** @typedef {number} AlsoNotADuplicate */
11+
12+
(2 * 2) + 1;
13+
14+
15+
/**
16+
*
17+
* @param a {NotADuplicateIdentifier}
18+
* @param b {AlsoNotADuplicate}
19+
*/
20+
function makeSureTypedefsAreStillRecognized(a, b) {}

0 commit comments

Comments
 (0)