From cf2bfc0a127d95fe9254e2480c887327c02fbef8 Mon Sep 17 00:00:00 2001 From: Mine Yalcinalp Starks Date: Wed, 7 Dec 2016 17:55:14 -0800 Subject: [PATCH] Add JSDoc tag support for Signature Help --- src/harness/fourslash.ts | 14 +++++++ src/server/protocol.ts | 5 +++ src/services/signatureHelp.ts | 3 +- src/services/types.ts | 1 + tests/baselines/reference/jsDocTags.baseline | 24 +++++++++++ tests/cases/fourslash/fourslash.ts | 1 + tests/cases/fourslash/jsDocTags.ts | 43 ++++++-------------- 7 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 285431a4a54..9afbdd01fd3 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1069,6 +1069,16 @@ namespace FourSlash { assert.equal(ts.displayPartsToString(actualDocComment), docComment, this.assertionMessageAtLastKnownMarker("current signature help doc comment")); } + public verifyCurrentSignatureHelpTags(tags: ts.JSDocTagInfo[]) { + const actualTags = this.getActiveSignatureHelpItem().tags; + + assert.equal(actualTags.length, tags.length, this.assertionMessageAtLastKnownMarker("signature help tags")); + ts.zipWith(tags, actualTags, (expectedTag, actualTag) => { + assert.equal(expectedTag.name, actualTag.name); + assert.equal(expectedTag.text, actualTag.text, this.assertionMessageAtLastKnownMarker("signature help tag " + actualTag.name)); + }); + } + public verifySignatureHelpCount(expected: number) { const help = this.languageService.getSignatureHelpItems(this.activeFile.fileName, this.currentCaretPosition); const actual = help && help.items ? help.items.length : 0; @@ -3270,6 +3280,10 @@ namespace FourSlashInterface { this.state.verifyCurrentSignatureHelpDocComment(docComment); } + public currentSignatureHelpTagsAre(tags: ts.JSDocTagInfo[]) { + this.state.verifyCurrentSignatureHelpTags(tags); + } + public signatureHelpCountIs(expected: number) { this.state.verifySignatureHelpCount(expected); } diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 1126a153fbc..d3f81fcbba7 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -1600,6 +1600,11 @@ namespace ts.server.protocol { * The signature's documentation */ documentation: SymbolDisplayPart[]; + + /** + * The signature's JSDoc tags + */ + tags: JSDocTagInfo[]; } /** diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index 44c2ede9fbb..325c6794df7 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -590,7 +590,8 @@ namespace ts.SignatureHelp { suffixDisplayParts, separatorDisplayParts: [punctuationPart(SyntaxKind.CommaToken), spacePart()], parameters: signatureHelpParameters, - documentation: candidateSignature.getDocumentationComment() + documentation: candidateSignature.getDocumentationComment(), + tags: candidateSignature.getJsDocTags() }; }); diff --git a/src/services/types.ts b/src/services/types.ts index f262f3ea5c9..ec621a99169 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -539,6 +539,7 @@ namespace ts { separatorDisplayParts: SymbolDisplayPart[]; parameters: SignatureHelpParameter[]; documentation: SymbolDisplayPart[]; + tags: JSDocTagInfo[]; } /** diff --git a/tests/baselines/reference/jsDocTags.baseline b/tests/baselines/reference/jsDocTags.baseline index 7db251f0a7f..6674b49b06c 100644 --- a/tests/baselines/reference/jsDocTags.baseline +++ b/tests/baselines/reference/jsDocTags.baseline @@ -75,6 +75,12 @@ ] } }, + { + "marker": { + "fileName": "/tests/cases/fourslash/jsDocTags.ts", + "position": 902 + } + }, { "marker": { "fileName": "/tests/cases/fourslash/jsDocTags.ts", @@ -191,6 +197,12 @@ ] } }, + { + "marker": { + "fileName": "/tests/cases/fourslash/jsDocTags.ts", + "position": 918 + } + }, { "marker": { "fileName": "/tests/cases/fourslash/jsDocTags.ts", @@ -262,6 +274,12 @@ ] } }, + { + "marker": { + "fileName": "/tests/cases/fourslash/jsDocTags.ts", + "position": 933 + } + }, { "marker": { "fileName": "/tests/cases/fourslash/jsDocTags.ts", @@ -328,6 +346,12 @@ "tags": [] } }, + { + "marker": { + "fileName": "/tests/cases/fourslash/jsDocTags.ts", + "position": 948 + } + }, { "marker": { "fileName": "/tests/cases/fourslash/jsDocTags.ts", diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index 70ffc9f9653..e6cca3d6f72 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -192,6 +192,7 @@ declare namespace FourSlashInterface { currentParameterSpanIs(parameter: string): void; currentParameterHelpArgumentDocCommentIs(docComment: string): void; currentSignatureHelpDocCommentIs(docComment: string): void; + currentSignatureHelpTagsAre(tags: ts.JSDocTagInfo[]): void; signatureHelpCountIs(expected: number): void; signatureHelpArgumentCountIs(expected: number): void; signatureHelpCurrentArgumentListIsVariadic(expected: boolean); diff --git a/tests/cases/fourslash/jsDocTags.ts b/tests/cases/fourslash/jsDocTags.ts index 11034a6a22c..4484e74cda5 100644 --- a/tests/cases/fourslash/jsDocTags.ts +++ b/tests/cases/fourslash/jsDocTags.ts @@ -45,42 +45,23 @@ //// /** @mytag */ //// method5() {} //// } -//// var foo = new /*1*/Foo(4); -//// /*2*/Foo./*3*/method1(); -//// foo./*4*/method2(); -//// foo./*5*/method3(); +//// var foo = new /*1*/Foo(/*10*/4); +//// /*2*/Foo./*3*/method1(/*11*/); +//// foo./*4*/method2(/*12*/); +//// foo./*5*/method3(/*13*/); //// foo./*6*/method4(); //// foo./*7*/property1; //// foo./*8*/property2; //// foo./*9*/method5(); -goTo.marker("1"); -verify.baselineQuickInfo(); -goTo.marker("2"); -verify.baselineQuickInfo(); -goTo.marker("3"); -verify.baselineQuickInfo(); -goTo.marker("4"); -verify.baselineQuickInfo(); -goTo.marker("5"); -verify.baselineQuickInfo(); -goTo.marker("6"); -verify.baselineQuickInfo(); -goTo.marker("7"); -verify.baselineQuickInfo(); -goTo.marker("8"); -verify.baselineQuickInfo(); -goTo.marker("9"); verify.baselineQuickInfo(); -// /** -// * @param foo -// * Does -// * stuff! -// * @returns void -// */ -// function example(foo) { -// } - -// example("asdf"); \ No newline at end of file +goTo.marker("10"); +verify.currentSignatureHelpTagsAre([{name: "myjsdoctag", text:"this is a comment"}]) +goTo.marker("11"); +verify.currentSignatureHelpTagsAre([{name: "mytag", text:"comment1 comment2"}]) +goTo.marker("12"); +verify.currentSignatureHelpTagsAre([{name: "mytag", text:""}]) +goTo.marker("13"); +verify.currentSignatureHelpTagsAre([])