diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 343df39ad9cbc..c4e20bb055e28 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -3915,7 +3915,7 @@ export function createScanner( if (isIdentifierStart(ch, languageVersion)) { let char = ch; - while (pos < end && isIdentifierPart(char = codePointUnchecked(pos), languageVersion) || char === CharacterCodes.minus) pos += charSize(char); + while (pos < end && (isIdentifierPart(char = codePointUnchecked(pos), languageVersion) || char === CharacterCodes.minus)) pos += charSize(char); tokenValue = text.substring(tokenStart, pos); if (char === CharacterCodes.backslash) { tokenValue += scanIdentifierParts(); diff --git a/src/testRunner/unittests/comments.ts b/src/testRunner/unittests/comments.ts index a1eeeb8aacfa1..cbd07e3c7f180 100644 --- a/src/testRunner/unittests/comments.ts +++ b/src/testRunner/unittests/comments.ts @@ -11,6 +11,7 @@ describe("comment parsing", () => { const withTrailing = `;/* comment */ // another one `; + const endingInHyphen = "/**comment-*/"; it("skips shebang", () => { const result = ts.getLeadingCommentRanges(withShebang, 0); assert.isDefined(result); @@ -29,4 +30,16 @@ describe("comment parsing", () => { assert.strictEqual(result.length, 1); assert.strictEqual(result[0].kind, ts.SyntaxKind.SingleLineCommentTrivia); }); + + it("parses /** block comments ending in hyphen", () => { + const sourceFile = ts.createSourceFile( + "file.ts", + `${endingInHyphen}\nconst x = 1;`, + ts.ScriptTarget.ESNext, + true, + ); + + assert.strictEqual(sourceFile.parseDiagnostics.length, 0); + assert.strictEqual(sourceFile.statements.length, 1); + }); });