diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index a10c2cbd6d42a..fdd1705d307cc 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1335,7 +1335,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; @@ -5391,7 +5391,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 0000000000000..49b1f8ffe5f64 --- /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 0000000000000..af85829184743 --- /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 0000000000000..04ae3fc406aec --- /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) {}