From 7bd6209fbc39c0ce63fc575f1f46505df2dd52a5 Mon Sep 17 00:00:00 2001 From: Klaus Meinhardt Date: Thu, 12 Mar 2020 22:42:49 +0100 Subject: [PATCH] Don't parse duplicate JSDoc for ExpressionStatement starting with ParenthesizedExpression (#36289) * don't parse JSDoc on ExpressionStatement if it starts with ParenthesizedExpression * update test --- src/compiler/parser.ts | 4 +-- ...pedefBeforeParenthesizedExpression.symbols | 21 +++++++++++++ ...TypedefBeforeParenthesizedExpression.types | 31 +++++++++++++++++++ ...docTypedefBeforeParenthesizedExpression.ts | 20 ++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.symbols create mode 100644 tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.types create mode 100644 tests/cases/compiler/jsdocTypedefBeforeParenthesizedExpression.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index bd59db3fe28..8434674fef3 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1400,7 +1400,7 @@ namespace ts { function createNodeWithJSDoc(kind: SyntaxKind, pos?: number): Node { const node = createNode(kind, pos); - if (scanner.getTokenFlags() & TokenFlags.PrecedingJSDocComment) { + if (scanner.getTokenFlags() & TokenFlags.PrecedingJSDocComment && (kind !== SyntaxKind.ExpressionStatement || token() !== SyntaxKind.OpenParenToken)) { addJSDocComment(node); } return node; @@ -5469,7 +5469,7 @@ namespace ts { // Avoiding having to do the lookahead for a labeled statement by just trying to parse // out an expression, seeing if it is identifier and then seeing if it is followed by // a colon. - const node = createNodeWithJSDoc(SyntaxKind.Unknown); + const node = createNodeWithJSDoc(token() === SyntaxKind.Identifier ? SyntaxKind.Unknown : SyntaxKind.ExpressionStatement); const expression = allowInAnd(parseExpression); if (expression.kind === SyntaxKind.Identifier && parseOptional(SyntaxKind.ColonToken)) { node.kind = SyntaxKind.LabeledStatement; diff --git a/tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.symbols b/tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.symbols new file mode 100644 index 00000000000..49b1f8ffe5f --- /dev/null +++ b/tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/test.js === +// @ts-check +/** @typedef {number} NotADuplicateIdentifier */ + +(2 * 2); + +/** @typedef {number} AlsoNotADuplicate */ + +(2 * 2) + 1; + + +/** + * + * @param a {NotADuplicateIdentifier} + * @param b {AlsoNotADuplicate} + */ +function makeSureTypedefsAreStillRecognized(a, b) {} +>makeSureTypedefsAreStillRecognized : Symbol(makeSureTypedefsAreStillRecognized, Decl(test.js, 7, 12)) +>a : Symbol(a, Decl(test.js, 15, 44)) +>b : Symbol(b, Decl(test.js, 15, 46)) + diff --git a/tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.types b/tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.types new file mode 100644 index 00000000000..af858291847 --- /dev/null +++ b/tests/baselines/reference/jsdocTypedefBeforeParenthesizedExpression.types @@ -0,0 +1,31 @@ +=== tests/cases/compiler/test.js === +// @ts-check +/** @typedef {number} NotADuplicateIdentifier */ + +(2 * 2); +>(2 * 2) : number +>2 * 2 : number +>2 : 2 +>2 : 2 + +/** @typedef {number} AlsoNotADuplicate */ + +(2 * 2) + 1; +>(2 * 2) + 1 : number +>(2 * 2) : number +>2 * 2 : number +>2 : 2 +>2 : 2 +>1 : 1 + + +/** + * + * @param a {NotADuplicateIdentifier} + * @param b {AlsoNotADuplicate} + */ +function makeSureTypedefsAreStillRecognized(a, b) {} +>makeSureTypedefsAreStillRecognized : (a: number, b: number) => void +>a : number +>b : number + diff --git a/tests/cases/compiler/jsdocTypedefBeforeParenthesizedExpression.ts b/tests/cases/compiler/jsdocTypedefBeforeParenthesizedExpression.ts new file mode 100644 index 00000000000..04ae3fc406a --- /dev/null +++ b/tests/cases/compiler/jsdocTypedefBeforeParenthesizedExpression.ts @@ -0,0 +1,20 @@ +// @allowJs: true +// @noEmit: true + +// @filename: test.js +// @ts-check +/** @typedef {number} NotADuplicateIdentifier */ + +(2 * 2); + +/** @typedef {number} AlsoNotADuplicate */ + +(2 * 2) + 1; + + +/** + * + * @param a {NotADuplicateIdentifier} + * @param b {AlsoNotADuplicate} + */ +function makeSureTypedefsAreStillRecognized(a, b) {}