From 995023c2a7f206b92c6741be768e23254bf6860f Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Thu, 14 Jan 2021 21:38:55 -0800 Subject: [PATCH 1/3] Fix double asterisk formatting in JSDoc --- src/compiler/parser.ts | 11 +- .../quickInfoJsDocTextFormatting1.ts | 101 ++++++++++++++++++ 2 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index cd61ad8ec80..0b404578806 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7602,8 +7602,15 @@ namespace ts { if (state === JSDocState.BeginningOfLine) { // leading asterisks start recording on the *next* (non-whitespace) token state = JSDocState.SawAsterisk; - indent += 1; - break; + + if (lookAhead(() => nextTokenJSDoc() === SyntaxKind.AsteriskToken)) { + pushComment(scanner.getTokenText()); + tok = nextTokenJSDoc(); + } + else { + indent += 1; + break; + } } // record the * as a comment // falls through diff --git a/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts b/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts new file mode 100644 index 00000000000..97e9712ed3c --- /dev/null +++ b/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts @@ -0,0 +1,101 @@ +/// + +// Regression test for #33386 + +//// /** +//// * @param {number} var1 **Highlighted text** +//// * @param {string} var2 Another **Highlighted text** +//// */ +//// function f1(var1, var2) { } +//// +//// /** +//// * @param {number} var1 *This asterisk gets trimmed unfortunatelly +//// * @param {string} var2 Another *Regular text with an asterisk +//// */ +//// function f2(var1, var2) { } +//// +//// /** +//// * @param {number} var1 +//// * *Regular text with an asterisk +//// * @param {string} var2 +//// * Another *Regular text with an asterisk +//// */ +//// function f3(var1, var2) { } +//// +//// /** +//// * @param {number} var1 +//// * **Highlighted text** +//// * @param {string} var2 +//// * Another **Highlighted text** +//// */ +//// function f4(var1, var2) { } +//// +//// /** +//// * @param {number} var1 +//// **Highlighted text** +//// * @param {string} var2 +//// Another **Highlighted text** +//// */ +//// function f5(var1, var2) { } +//// +//// f1(/*1*/); +//// f2(/*2*/); +//// f3(/*3*/); +//// f4(/*4*/); +//// f5(/*5*/); + +verify.signatureHelp({ + marker: "1", + parameterDocComment: "**Highlighted text**", + tags: [{ + name: "param", + text: "var1 **Highlighted text**" + }, { + name: "param", + text: "var2 Another **Highlighted text**" + }] +}); +verify.signatureHelp({ + marker: "2", + parameterDocComment: "This asterisk gets trimmed unfortunatelly", + tags: [{ + name: "param", + text: "var1 This asterisk gets trimmed unfortunatelly" + }, { + name: "param", + text: "var2 Another *Regular text with an asterisk" + }] +}); +verify.signatureHelp({ + marker: "3", + parameterDocComment: "*Regular text with an asterisk", + tags: [{ + name: "param", + text: "var1 *Regular text with an asterisk" + }, { + name: "param", + text: "var2 Another *Regular text with an asterisk" + }] +}); +verify.signatureHelp({ + marker: "4", + parameterDocComment: "**Highlighted text**", + tags: [{ + name: "param", + text: "var1 **Highlighted text**" + }, { + name: "param", + text: "var2 Another **Highlighted text**" + }] +}); +verify.signatureHelp({ + marker: "5", + parameterDocComment: "**Highlighted text**", + tags: [{ + name: "param", + text: "var1 **Highlighted text**" + }, { + name: "param", + text: "var2 Another **Highlighted text**" + }] +}); \ No newline at end of file From 98e9e77255ba40c890bb19e5cf05c2e91d72ccab Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 19 Jan 2021 15:55:01 -0800 Subject: [PATCH 2/3] Fixed JSDoc with only one asterisk in comment --- src/compiler/parser.ts | 16 +++++----------- .../fourslash/quickInfoJsDocTextFormatting1.ts | 6 +++--- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 0b404578806..8f854d750c5 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7602,15 +7602,8 @@ namespace ts { if (state === JSDocState.BeginningOfLine) { // leading asterisks start recording on the *next* (non-whitespace) token state = JSDocState.SawAsterisk; - - if (lookAhead(() => nextTokenJSDoc() === SyntaxKind.AsteriskToken)) { - pushComment(scanner.getTokenText()); - tok = nextTokenJSDoc(); - } - else { - indent += 1; - break; - } + indent += 1; + break; } // record the * as a comment // falls through @@ -7695,13 +7688,14 @@ namespace ts { skipWhitespaceOrAsterisk(); const { name, isBracketed } = parseBracketNameInPropertyAndParamTag(); - skipWhitespace(); + const indentText = skipWhitespaceOrAsterisk(); if (isNameFirst) { typeExpression = tryParseTypeExpression(); } - const comment = parseTagComments(indent + scanner.getStartPos() - start); + const comment = parseTrailingTagComments(indent + scanner.getStartPos() - start, getNodePos(), indent, indentText); + const nestedTypeLiteral = target !== PropertyLikeParse.CallbackParameter && parseNestedTypeLiteral(typeExpression, name, target, indent); if (nestedTypeLiteral) { typeExpression = nestedTypeLiteral; diff --git a/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts b/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts index 97e9712ed3c..334a0124315 100644 --- a/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts +++ b/tests/cases/fourslash/quickInfoJsDocTextFormatting1.ts @@ -9,7 +9,7 @@ //// function f1(var1, var2) { } //// //// /** -//// * @param {number} var1 *This asterisk gets trimmed unfortunatelly +//// * @param {number} var1 *Regular text with an asterisk //// * @param {string} var2 Another *Regular text with an asterisk //// */ //// function f2(var1, var2) { } @@ -57,10 +57,10 @@ verify.signatureHelp({ }); verify.signatureHelp({ marker: "2", - parameterDocComment: "This asterisk gets trimmed unfortunatelly", + parameterDocComment: "*Regular text with an asterisk", tags: [{ name: "param", - text: "var1 This asterisk gets trimmed unfortunatelly" + text: "var1 *Regular text with an asterisk" }, { name: "param", text: "var2 Another *Regular text with an asterisk" From a231b23772929418c2a82d7b5e3a69f596678ac8 Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 19 Jan 2021 23:02:56 -0800 Subject: [PATCH 3/3] Fix start position on JSDoc parsin --- src/compiler/parser.ts | 2 +- tests/cases/fourslash/commentsLinePreservation.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 8f854d750c5..30f4c5a6a25 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7694,7 +7694,7 @@ namespace ts { typeExpression = tryParseTypeExpression(); } - const comment = parseTrailingTagComments(indent + scanner.getStartPos() - start, getNodePos(), indent, indentText); + const comment = parseTrailingTagComments(start, getNodePos(), indent, indentText); const nestedTypeLiteral = target !== PropertyLikeParse.CallbackParameter && parseNestedTypeLiteral(typeExpression, name, target, indent); if (nestedTypeLiteral) { diff --git a/tests/cases/fourslash/commentsLinePreservation.ts b/tests/cases/fourslash/commentsLinePreservation.ts index 3bf2165014e..47a796ac252 100644 --- a/tests/cases/fourslash/commentsLinePreservation.ts +++ b/tests/cases/fourslash/commentsLinePreservation.ts @@ -129,16 +129,16 @@ verify.quickInfos({ 3: ["(parameter) param1: string", "first line of param\n\nparam information third line"], g: ["function g(param1: string): void", "This is firstLine\nThis is second Line"], - 4: ["(parameter) param1: string", "param information first line"], + 4: ["(parameter) param1: string", " param information first line"], h: ["function h(param1: string): void", "This is firstLine\nThis is second Line"], - 5: ["(parameter) param1: string", "param information first line\n\nparam information third line"], + 5: ["(parameter) param1: string", " param information first line\n\n param information third line"], i: ["function i(param1: string): void", "This is firstLine\nThis is second Line"], - 6: ["(parameter) param1: string", "param information first line\n\nparam information third line"], + 6: ["(parameter) param1: string", " param information first line\n\n param information third line"], j: ["function j(param1: string): void", "This is firstLine\nThis is second Line"], - 7: ["(parameter) param1: string", "param information first line\n\nparam information third line"], + 7: ["(parameter) param1: string", " param information first line\n\n param information third line"], k: ["function k(param1: string): void", "This is firstLine\nThis is second Line"], 8: ["(parameter) param1: string", "hello"],