From 30aad9db8dc6fe09fe4e21fe973e984c35c201dc Mon Sep 17 00:00:00 2001 From: Orta Therox Date: Mon, 29 Jul 2019 09:46:42 -0400 Subject: [PATCH] Support more terminators for parsing jsdoc filepaths --- src/compiler/parser.ts | 12 ++++++----- src/compiler/scanner.ts | 2 +- src/harness/fourslash.ts | 4 ++++ src/services/classifier.ts | 1 + .../fourslash/jsDocDontBreakWithNamespaces.ts | 20 ++++++++++++++++--- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 9762302b7a..b585adb04a 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2428,17 +2428,19 @@ namespace ts { function parseJSDocType(): TypeNode { scanner.setInJSDocType(true); - const dotdotdot = parseOptionalToken(SyntaxKind.DotDotDotToken); const moduleSpecifier = parseOptionalToken(SyntaxKind.ModuleKeyword); - let type = parseTypeOrTypePredicate(); - scanner.setInJSDocType(false); if (moduleSpecifier) { const moduleTag = createNode(SyntaxKind.JSDocNamepathType, moduleSpecifier.pos) as JSDocNamepathType; - while (token() !== SyntaxKind.CloseBraceToken && token() !== SyntaxKind.EndOfFileToken) { + const terminators = [SyntaxKind.CloseBraceToken, SyntaxKind.EndOfFileToken, SyntaxKind.CommaToken, SyntaxKind.CloseParenToken]; + while (terminators.indexOf(token()) < 0) { nextTokenJSDoc(); } - type = finishNode(moduleTag); + return finishNode(moduleTag); } + + const dotdotdot = parseOptionalToken(SyntaxKind.DotDotDotToken); + let type = parseTypeOrTypePredicate(); + scanner.setInJSDocType(false); if (dotdotdot) { const variadic = createNode(SyntaxKind.JSDocVariadicType, dotdotdot.pos) as JSDocVariadicType; variadic.type = type; diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index f949893171..3109da9178 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -1983,7 +1983,7 @@ namespace ts { // First non-whitespace character on this line. let firstNonWhitespace = 0; // These initial values are special because the first line is: - // firstNonWhitespace = 0 to indicate that we want leading whitspace, + // firstNonWhitespace = 0 to indicate that we want leading whitespace, while (pos < end) { char = text.charCodeAt(pos); diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index f12506be2f..b59f4e15dc 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1268,6 +1268,10 @@ namespace FourSlash { private verifySignatureHelpWorker(options: FourSlashInterface.VerifySignatureHelpOptions) { const help = this.getSignatureHelp({ triggerReason: options.triggerReason })!; + if (!help) { + this.raiseError("Could not get a help signature"); + } + const selectedItem = help.items[help.selectedItemIndex]; // Argument index may exceed number of parameters const currentParameter = selectedItem.parameters[help.argumentIndex] as ts.SignatureHelpParameter | undefined; diff --git a/src/services/classifier.ts b/src/services/classifier.ts index f85a69681d..5da0354dc1 100644 --- a/src/services/classifier.ts +++ b/src/services/classifier.ts @@ -1,4 +1,5 @@ namespace ts { + /** The classifier is used for syntactic highlighting in editors via the TSServer */ export function createClassifier(): Classifier { const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); diff --git a/tests/cases/fourslash/jsDocDontBreakWithNamespaces.ts b/tests/cases/fourslash/jsDocDontBreakWithNamespaces.ts index 7807d5d30d..5be2f3e7b6 100644 --- a/tests/cases/fourslash/jsDocDontBreakWithNamespaces.ts +++ b/tests/cases/fourslash/jsDocDontBreakWithNamespaces.ts @@ -5,13 +5,27 @@ //// * @returns {module:@nodefuel/web~Webserver~wsServer#hello} Websocket server object //// */ ////function foo() { } -////foo(''/**/); +////foo(''/*foo*/); +//// +/////** +//// * @type {module:xxxxx} */ +//// */ +////function bar() { } +////bar(''/*bar*/); + verify.signatureHelp({ - marker: "", + marker: "foo", text: "foo(): any", docComment: "", tags: [ - { name: "returns", text: "Websocket server object" }, + { name: "returns", text: "Websocket server object" }, ], }); + +verify.signatureHelp({ + marker: "bar", + text: "bar(): void", + docComment: "", + tags: [], +});