diff --git a/internal/fourslash/_scripts/convertFourslash.mts b/internal/fourslash/_scripts/convertFourslash.mts index 3619ca3b41..7703bef345 100644 --- a/internal/fourslash/_scripts/convertFourslash.mts +++ b/internal/fourslash/_scripts/convertFourslash.mts @@ -173,6 +173,8 @@ function parseFourslashStatement(statement: ts.Statement): Cmd[] | undefined { return [parseBaselineFindAllReferencesArgs(callExpression.arguments)]; case "baselineQuickInfo": return [parseBaselineQuickInfo(callExpression.arguments)]; + case "baselineSignatureHelp": + return [parseBaselineSignatureHelp(callExpression.arguments)]; case "baselineGoToDefinition": case "baselineGetDefinitionAtPosition": // Both of these take the same arguments, but differ in that... @@ -856,6 +858,16 @@ function parseQuickInfoArgs(funcName: string, args: readonly ts.Expression[]): V return undefined; } +function parseBaselineSignatureHelp(args: ts.NodeArray): Cmd { + if (args.length !== 0) { + // All calls are currently empty! + throw new Error("Expected no arguments in verify.baselineSignatureHelp"); + } + return { + kind: "verifyBaselineSignatureHelp", + }; +} + function parseKind(expr: ts.Expression): string | undefined { if (!ts.isStringLiteral(expr)) { console.error(`Expected string literal for kind, got ${expr.getText()}`); @@ -1007,6 +1019,10 @@ interface VerifyBaselineQuickInfoCmd { kind: "verifyBaselineQuickInfo"; } +interface VerifyBaselineSignatureHelpCmd { + kind: "verifyBaselineSignatureHelp"; +} + interface GoToCmd { kind: "goTo"; // !!! `selectRange` and `rangeStart` require parsing variables and `test.ranges()[n]` @@ -1031,6 +1047,7 @@ type Cmd = | VerifyBaselineFindAllReferencesCmd | VerifyBaselineGoToDefinitionCmd | VerifyBaselineQuickInfoCmd + | VerifyBaselineSignatureHelpCmd | GoToCmd | EditCmd | VerifyQuickInfoCmd; @@ -1105,6 +1122,8 @@ function generateCmd(cmd: Cmd): string { case "verifyBaselineQuickInfo": // Quick Info -> Hover return `f.VerifyBaselineHover(t)`; + case "verifyBaselineSignatureHelp": + return `f.VerifyBaselineSignatureHelp(t)`; case "goTo": return generateGoToCommand(cmd); case "edit": @@ -1127,7 +1146,7 @@ interface GoTest { } function generateGoTest(failingTests: Set, test: GoTest): string { - const testName = test.name[0].toUpperCase() + test.name.substring(1); + const testName = (test.name[0].toUpperCase() + test.name.substring(1)).replaceAll("-", "_"); const content = test.content; const commands = test.commands.map(cmd => generateCmd(cmd)).join("\n"); const imports = [`"github.com/microsoft/typescript-go/internal/fourslash"`]; diff --git a/internal/fourslash/_scripts/failingTests.txt b/internal/fourslash/_scripts/failingTests.txt index 1185e5c9cc..321b7b1a22 100644 --- a/internal/fourslash/_scripts/failingTests.txt +++ b/internal/fourslash/_scripts/failingTests.txt @@ -463,6 +463,7 @@ TestReferencesIsAvailableThroughGlobalNoCrash TestRegexDetection TestReverseMappedTypeQuickInfo TestSelfReferencedExternalModule +TestSignatureHelpInferenceJsDocImportTag TestStringCompletionsImportOrExportSpecifier TestStringCompletionsVsEscaping TestSyntheticImportFromBabelGeneratedFile1 diff --git a/internal/fourslash/fourslash.go b/internal/fourslash/fourslash.go index 30a49c5491..2a80b9e754 100644 --- a/internal/fourslash/fourslash.go +++ b/internal/fourslash/fourslash.go @@ -996,6 +996,136 @@ func appendLinesForMarkedStringWithLanguage(result []string, ms *lsproto.MarkedS return result } +func (f *FourslashTest) VerifyBaselineSignatureHelp(t *testing.T) { + if f.baseline != nil { + t.Fatalf("Error during test '%s': Another baseline is already in progress", t.Name()) + } else { + f.baseline = &baselineFromTest{ + content: &strings.Builder{}, + baselineName: "signatureHelp/" + strings.TrimPrefix(t.Name(), "Test"), + ext: ".baseline", + } + } + + // empty baseline after test completes + defer func() { + f.baseline = nil + }() + + markersAndItems := core.MapFiltered(f.Markers(), func(marker *Marker) (markerAndItem[*lsproto.SignatureHelp], bool) { + if marker.Name == nil { + return markerAndItem[*lsproto.SignatureHelp]{}, false + } + + params := &lsproto.SignatureHelpParams{ + TextDocument: lsproto.TextDocumentIdentifier{ + Uri: ls.FileNameToDocumentURI(f.activeFilename), + }, + Position: marker.LSPosition, + } + + resMsg, result, resultOk := sendRequest(t, f, lsproto.TextDocumentSignatureHelpInfo, params) + var prefix string + if f.lastKnownMarkerName != nil { + prefix = fmt.Sprintf("At marker '%s': ", *f.lastKnownMarkerName) + } else { + prefix = fmt.Sprintf("At position (Ln %d, Col %d): ", f.currentCaretPosition.Line, f.currentCaretPosition.Character) + } + if resMsg == nil { + t.Fatalf(prefix+"Nil response received for signature help request", f.lastKnownMarkerName) + } + if !resultOk { + t.Fatalf(prefix+"Unexpected response type for signature help request: %T", resMsg.AsResponse().Result) + } + + return markerAndItem[*lsproto.SignatureHelp]{Marker: marker, Item: result.SignatureHelp}, true + }) + + getRange := func(item *lsproto.SignatureHelp) *lsproto.Range { + // SignatureHelp doesn't have a range like hover does + return nil + } + + getTooltipLines := func(item, _prev *lsproto.SignatureHelp) []string { + if item == nil || len(item.Signatures) == 0 { + return []string{"No signature help available"} + } + + // Show active signature if specified, otherwise first signature + activeSignature := 0 + if item.ActiveSignature != nil && int(*item.ActiveSignature) < len(item.Signatures) { + activeSignature = int(*item.ActiveSignature) + } + + sig := item.Signatures[activeSignature] + + // Build signature display + signatureLine := sig.Label + activeParamLine := "" + + // Show active parameter if specified, and the signature text. + if item.ActiveParameter != nil && sig.Parameters != nil { + activeParamIndex := int(*item.ActiveParameter.Uinteger) + if activeParamIndex >= 0 && activeParamIndex < len(*sig.Parameters) { + activeParam := (*sig.Parameters)[activeParamIndex] + + // Get the parameter label and bold the + // parameter text within the original string. + activeParamLabel := "" + if activeParam.Label.String != nil { + activeParamLabel = *activeParam.Label.String + } else if activeParam.Label.Tuple != nil { + activeParamLabel = signatureLine[(*activeParam.Label.Tuple)[0]:(*activeParam.Label.Tuple)[1]] + } else { + t.Fatal("Unsupported param label kind.") + } + signatureLine = strings.Replace(signatureLine, activeParamLabel, "**"+activeParamLabel+"**", 1) + + if activeParam.Documentation != nil { + if activeParam.Documentation.MarkupContent != nil { + activeParamLine = activeParam.Documentation.MarkupContent.Value + } else if activeParam.Documentation.String != nil { + activeParamLine = *activeParam.Documentation.String + } + + activeParamLine = fmt.Sprintf("- `%s`: %s", activeParamLabel, activeParamLine) + } + + } + } + + result := make([]string, 0, 16) + result = append(result, signatureLine) + if activeParamLine != "" { + result = append(result, activeParamLine) + } + + // ORIGINALLY we would "only display signature documentation on the last argument when multiple arguments are marked". + // !!! + // Note that this is harder than in Strada, because LSP signature help has no concept of + // applicable spans. + if sig.Documentation != nil { + if sig.Documentation.MarkupContent != nil { + result = append(result, strings.Split(sig.Documentation.MarkupContent.Value, "\n")...) + } else if sig.Documentation.String != nil { + result = append(result, strings.Split(*sig.Documentation.String, "\n")...) + } else { + t.Fatal("Unsupported documentation format.") + } + } + + return result + } + + f.baseline.addResult("SignatureHelp", annotateContentWithTooltips(t, f, markersAndItems, "signaturehelp", getRange, getTooltipLines)) + if jsonStr, err := core.StringifyJson(markersAndItems, "", " "); err == nil { + f.baseline.content.WriteString(jsonStr) + } else { + t.Fatalf("Failed to stringify markers and items for baseline: %v", err) + } + baseline.Run(t, f.baseline.getBaselineFileName(), f.baseline.content.String(), baseline.Options{}) +} + // Collects all named markers if provided, or defaults to anonymous ranges func (f *FourslashTest) lookupMarkersOrGetRanges(t *testing.T, markers []string) []MarkerOrRange { var referenceLocations []MarkerOrRange diff --git a/internal/fourslash/tests/gen/jsDocDontBreakWithNamespaces_test.go b/internal/fourslash/tests/gen/jsDocDontBreakWithNamespaces_test.go new file mode 100644 index 0000000000..52d5940612 --- /dev/null +++ b/internal/fourslash/tests/gen/jsDocDontBreakWithNamespaces_test.go @@ -0,0 +1,33 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestJsDocDontBreakWithNamespaces(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJs: true +// @Filename: jsDocDontBreakWithNamespaces.js +/** + * @returns {module:@nodefuel/web~Webserver~wsServer#hello} Websocket server object + */ +function foo() { } +foo(''/*foo*/); + +/** + * @type {module:xxxxx} */ + */ +function bar() { } +bar(''/*bar*/); + +/** @type {function(module:xxxx, module:xxxx): module:xxxxx} */ +function zee() { } +zee(''/*zee*/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/jsDocFunctionSignatures5_test.go b/internal/fourslash/tests/gen/jsDocFunctionSignatures5_test.go new file mode 100644 index 0000000000..9251bf648d --- /dev/null +++ b/internal/fourslash/tests/gen/jsDocFunctionSignatures5_test.go @@ -0,0 +1,30 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestJsDocFunctionSignatures5(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJs: true +// @Filename: Foo.js +/** + * Filters a path based on a regexp or glob pattern. + * @param {String} basePath The base path where the search will be performed. + * @param {String} pattern A string defining a regexp of a glob pattern. + * @param {String} type The search pattern type, can be a regexp or a glob. + * @param {Object} options A object containing options to the search. + * @return {Array} A list containing the filtered paths. + */ +function pathFilter(basePath, pattern, type, options){ +//... +} +pathFilter(/**/'foo', 'bar', 'baz', {});` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/jsDocFunctionSignatures6_test.go b/internal/fourslash/tests/gen/jsDocFunctionSignatures6_test.go new file mode 100644 index 0000000000..6e27e1b545 --- /dev/null +++ b/internal/fourslash/tests/gen/jsDocFunctionSignatures6_test.go @@ -0,0 +1,26 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestJsDocFunctionSignatures6(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJs: true +// @Filename: Foo.js +/** + * @param {string} p1 - A string param + * @param {string?} p2 - An optional param + * @param {string} [p3] - Another optional param + * @param {string} [p4="test"] - An optional param with a default value + */ +function f1(p1, p2, p3, p4){} +f1(/*1*/'foo', /*2*/'bar', /*3*/'baz', /*4*/'qux');` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/jsDocSignature-43394_test.go b/internal/fourslash/tests/gen/jsDocSignature-43394_test.go new file mode 100644 index 0000000000..3eca1f7014 --- /dev/null +++ b/internal/fourslash/tests/gen/jsDocSignature-43394_test.go @@ -0,0 +1,21 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestJsDocSignature_43394(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** + * @typedef {Object} Foo + * @property {number} ... + * /**/@typedef {number} Bar + */` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/jsdocReturnsTag_test.go b/internal/fourslash/tests/gen/jsdocReturnsTag_test.go new file mode 100644 index 0000000000..de84c35ce7 --- /dev/null +++ b/internal/fourslash/tests/gen/jsdocReturnsTag_test.go @@ -0,0 +1,28 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestJsdocReturnsTag(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJs: true +// @Filename: dummy.js +/** + * Find an item + * @template T + * @param {T[]} l + * @param {T} x + * @returns {?T} The names of the found item(s). + */ +function find(l, x) { +} +find(''/**/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/quickInfoJsDocTags13_test.go b/internal/fourslash/tests/gen/quickInfoJsDocTags13_test.go new file mode 100644 index 0000000000..33869057cb --- /dev/null +++ b/internal/fourslash/tests/gen/quickInfoJsDocTags13_test.go @@ -0,0 +1,41 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestQuickInfoJsDocTags13(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJs: true +// @checkJs: true +// @filename: ./a.js +/** + * First overload + * @overload + * @param {number} a + * @returns {void} + */ + +/** + * Second overload + * @overload + * @param {string} a + * @returns {void} + */ + +/** + * @param {string | number} a + * @returns {void} + */ +function f(a) {} + +f(/*a*/1); +f(/*b*/"");` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/quickInfoJsDocTextFormatting1_test.go b/internal/fourslash/tests/gen/quickInfoJsDocTextFormatting1_test.go new file mode 100644 index 0000000000..df8f0eba08 --- /dev/null +++ b/internal/fourslash/tests/gen/quickInfoJsDocTextFormatting1_test.go @@ -0,0 +1,57 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestQuickInfoJsDocTextFormatting1(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** + * @param {number} var1 **Highlighted text** + * @param {string} var2 Another **Highlighted text** +*/ +function f1(var1, var2) { } + +/** + * @param {number} var1 *Regular text with an asterisk + * @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*/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpAfterParameter_test.go b/internal/fourslash/tests/gen/signatureHelpAfterParameter_test.go new file mode 100644 index 0000000000..66f37a7bf2 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpAfterParameter_test.go @@ -0,0 +1,20 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpAfterParameter(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `type Type = (a, b, c) => void +const a: Type = (a/*1*/, b/*2*/) => {} +const b: Type = function (a/*3*/, b/*4*/) {} +const c: Type = ({ /*5*/a: { b/*6*/ }}/*7*/ = { }/*8*/, [b/*9*/]/*10*/, .../*11*/c/*12*/) => {}` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpCommentsClassMembers_test.go b/internal/fourslash/tests/gen/signatureHelpCommentsClassMembers_test.go new file mode 100644 index 0000000000..6ed36e8ffe --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpCommentsClassMembers_test.go @@ -0,0 +1,147 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpCommentsClassMembers(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** This is comment for c1*/ +class c1 { + /** p1 is property of c1*/ + public p1: number; + /** sum with property*/ + public p2(/** number to add*/b: number) { + return this.p1 + b; + } + /** getter property 1*/ + public get p3() { + return this.p2(/*8*/this.p1); + } + /** setter property 1*/ + public set p3(/** this is value*/value: number) { + this.p1 = this.p2(/*13*/value); + } + /** pp1 is property of c1*/ + private pp1: number; + /** sum with property*/ + private pp2(/** number to add*/b: number) { + return this.p1 + b; + } + /** getter property 2*/ + private get pp3() { + return this.pp2(/*20*/this.pp1); + } + /** setter property 2*/ + private set pp3( /** this is value*/value: number) { + this.pp1 = this.pp2(/*25*/value); + } + /** Constructor method*/ + constructor() { + } + /** s1 is static property of c1*/ + static s1: number; + /** static sum with property*/ + static s2(/** number to add*/b: number) { + return c1.s1 + b; + } + /** static getter property*/ + static get s3() { + return c1.s2(/*35*/c1.s1); + } + /** setter property 3*/ + static set s3( /** this is value*/value: number) { + c1.s1 = c1.s2(/*42*/value); + } + public nc_p1: number; + public nc_p2(b: number) { + return this.nc_p1 + b; + } + public get nc_p3() { + return this.nc_p2(/*47*/this.nc_p1); + } + public set nc_p3(value: number) { + this.nc_p1 = this.nc_p2(/*49*/value); + } + private nc_pp1: number; + private nc_pp2(b: number) { + return this.nc_pp1 + b; + } + private get nc_pp3() { + return this.nc_pp2(/*54*/this.nc_pp1); + } + private set nc_pp3(value: number) { + this.nc_pp1 = this.nc_pp2(/*56*/value); + } + static nc_s1: number; + static nc_s2(b: number) { + return c1.nc_s1 + b; + } + static get nc_s3() { + return c1.nc_s2(/*61*/c1.nc_s1); + } + static set nc_s3(value: number) { + c1.nc_s1 = c1.nc_s2(/*63*/value); + } +} +var i1 = new c1(/*65*/); +var i1_p = i1.p1; +var i1_f = i1.p2; +var i1_r = i1.p2(/*71*/20); +var i1_prop = i1.p3; +i1.p3 = i1_prop; +var i1_nc_p = i1.nc_p1; +var i1_ncf = i1.nc_p2; +var i1_ncr = i1.nc_p2(/*81*/20); +var i1_ncprop = i1.nc_p3; +i1.nc_p3 = i1_ncprop; +var i1_s_p = c1.s1; +var i1_s_f = c1.s2; +var i1_s_r = c1.s2(/*92*/20); +var i1_s_prop = c1.s3; +c1.s3 = i1_s_prop; +var i1_s_nc_p = c1.nc_s1; +var i1_s_ncf = c1.nc_s2; +var i1_s_ncr = c1.nc_s2(/*102*/20); +var i1_s_ncprop = c1.nc_s3; +c1.nc_s3 = i1_s_ncprop; +var i1_c = c1; + +class cProperties { + private val: number; + /** getter only property*/ + public get p1() { + return this.val; + } + public get nc_p1() { + return this.val; + } + /**setter only property*/ + public set p2(value: number) { + this.val = value; + } + public set nc_p2(value: number) { + this.val = value; + } +} +var cProperties_i = new cProperties(); +cProperties_i.p2 = cProperties_i.p1; +cProperties_i.nc_p2 = cProperties_i.nc_p1; +class cWithConstructorProperty { + /** + * this is class cWithConstructorProperty's constructor + * @param a this is first parameter a + */ + constructor(/**more info about a*/public a: number) { + var bbbb = 10; + this.a = a + 2 + bbbb; + } +}` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpCommentsClass_test.go b/internal/fourslash/tests/gen/signatureHelpCommentsClass_test.go new file mode 100644 index 0000000000..b676875ecb --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpCommentsClass_test.go @@ -0,0 +1,73 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpCommentsClass(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** This is class c2 without constructor*/ +class c2 { +} +var i2 = new c2(/*3*/); +var i2_c = c2; +class c3 { + /** Constructor comment*/ + constructor() { + } +} +var i3 = new c3(/*8*/); +var i3_c = c3; +/** Class comment*/ +class c4 { + /** Constructor comment*/ + constructor() { + } +} +var i4 = new c4(/*13*/); +var i4_c = c4; +/** Class with statics*/ +class c5 { + static s1: number; +} +var i5 = new c5(/*18*/); +var i5_c = c5; +/** class with statics and constructor*/ +class c6 { + /** s1 comment*/ + static s1: number; + /** constructor comment*/ + constructor() { + } +} +var i6 = new c6(/*23*/); +var i6_c = c6; + +class a { + /** + constructor for a + @param a this is my a + */ + constructor(a: string) { + } +} +new a(/*27*/"Hello"); +module m { + export module m2 { + /** class comment */ + export class c1 { + /** constructor comment*/ + constructor() { + } + } + } +} +var myVar = new m.m2.c1();` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpCommentsCommentParsing_test.go b/internal/fourslash/tests/gen/signatureHelpCommentsCommentParsing_test.go new file mode 100644 index 0000000000..06e778cf0f --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpCommentsCommentParsing_test.go @@ -0,0 +1,217 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpCommentsCommentParsing(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/// This is simple /// comments +function simple() { +} + +simple( /*1*/); + +/// multiLine /// Comments +/// This is example of multiline /// comments +/// Another multiLine +function multiLine() { +} +multiLine( /*2*/); + +/** this is eg of single line jsdoc style comment */ +function jsDocSingleLine() { +} +jsDocSingleLine(/*3*/); + + +/** this is multiple line jsdoc stule comment +*New line1 +*New Line2*/ +function jsDocMultiLine() { +} +jsDocMultiLine(/*4*/); + +/** multiple line jsdoc comments no longer merge +*New line1 +*New Line2*/ +/** Shoul mege this line as well +* and this too*/ /** Another this one too*/ +function jsDocMultiLineMerge() { +} +jsDocMultiLineMerge(/*5*/); + + +/// Triple slash comment +/** jsdoc comment */ +function jsDocMixedComments1() { +} +jsDocMixedComments1(/*6*/); + +/// Triple slash comment +/** jsdoc comment */ /** another jsDocComment*/ +function jsDocMixedComments2() { +} +jsDocMixedComments2(/*7*/); + +/** jsdoc comment */ /*** triplestar jsDocComment*/ +/// Triple slash comment +function jsDocMixedComments3() { +} +jsDocMixedComments3(/*8*/); + +/** jsdoc comment */ /** another jsDocComment*/ +/// Triple slash comment +/// Triple slash comment 2 +function jsDocMixedComments4() { +} +jsDocMixedComments4(/*9*/); + +/// Triple slash comment 1 +/** jsdoc comment */ /** another jsDocComment*/ +/// Triple slash comment +/// Triple slash comment 2 +function jsDocMixedComments5() { +} +jsDocMixedComments5(/*10*/); + +/** another jsDocComment*/ +/// Triple slash comment 1 +/// Triple slash comment +/// Triple slash comment 2 +/** jsdoc comment */ +function jsDocMixedComments6() { +} +jsDocMixedComments6(/*11*/); + +// This shoulnot be help comment +function noHelpComment1() { +} +noHelpComment1(/*12*/); + +/* This shoulnot be help comment */ +function noHelpComment2() { +} +noHelpComment2(/*13*/); + +function noHelpComment3() { +} +noHelpComment3(/*14*/); +/** Adds two integers and returns the result + * @param {number} a first number + * @param b second number + */ +function sum(a: number, b: number) { + return a + b; +} +sum(/*16*/10, /*17*/20); +/** This is multiplication function + * @param + * @param a first number + * @param b + * @param c { + @param d @anotherTag + * @param e LastParam @anotherTag*/ +function multiply(a: number, b: number, c?: number, d?, e?) { +} +multiply(/*19*/10,/*20*/ 20,/*21*/ 30, /*22*/40, /*23*/50); +/** fn f1 with number +* @param { string} b about b +*/ +function f1(a: number); +function f1(b: string); +/**@param opt optional parameter*/ +function f1(aOrb, opt?) { + return aOrb; +} +f1(/*25*/10); +f1(/*26*/"hello"); + +/** This is subtract function +@param { a +*@param { number | } b this is about b +@param { { () => string; } } c this is optional param c +@param { { () => string; } d this is optional param d +@param { { () => string; } } e this is optional param e +@param { { { () => string; } } f this is optional param f +*/ +function subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string) { +} +subtract(/*28*/10, /*29*/ 20, /*30*/ null, /*31*/ null, /*32*/ null, /*33*/null); +/** this is square function +@paramTag { number } a this is input number of paramTag +@param { number } a this is input number +@returnType { number } it is return type +*/ +function square(a: number) { + return a * a; +} +square(/*34*/10); +/** this is divide function +@param { number} a this is a +@paramTag { number } g this is optional param g +@param { number} b this is b +*/ +function divide(a: number, b: number) { +} +divide(/*35*/10, /*36*/20); +/** +Function returns string concat of foo and bar +@param {string} foo is string +@param {string} bar is second string +*/ +function fooBar(foo: string, bar: string) { + return foo + bar; +} +fooBar(/*37*/"foo",/*38*/"bar"); +/** This is a comment */ +var x; +/** + * This is a comment + */ +var y; +/** this is jsdoc style function with param tag as well as inline parameter help +*@param a it is first parameter +*@param c it is third parameter +*/ +function jsDocParamTest(/** this is inline comment for a */a: number, /** this is inline comment for b*/ b: number, c: number, d: number) { + return /*39*/a + b + c + d; +} +jsDocParamTest(/*40*/30, /*41*/40, /*42*/50, /*43*/60); +/** This is function comment + * And properly aligned comment + */ +function jsDocCommentAlignmentTest1() { +} +jsDocCommentAlignmentTest1(/*45*/); +/** This is function comment + * And aligned with 4 space char margin + */ +function jsDocCommentAlignmentTest2() { +} +jsDocCommentAlignmentTest2(/*46*/); +/** This is function comment + * And aligned with 4 space char margin + * @param {string} a this is info about a + * spanning on two lines and aligned perfectly + * @param b this is info about b + * spanning on two lines and aligned perfectly + * spanning one more line alined perfectly + * spanning another line with more margin + * @param c this is info about b + * not aligned text about parameter will eat only one space + */ +function jsDocCommentAlignmentTest3(a: string, b, c) { +} +jsDocCommentAlignmentTest3(/*47*/"hello",/*48*/1, /*49*/2); +/**/ +class NoQuickInfoClass { +}` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpCommentsFunctionDeclaration_test.go b/internal/fourslash/tests/gen/signatureHelpCommentsFunctionDeclaration_test.go new file mode 100644 index 0000000000..2312b0623c --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpCommentsFunctionDeclaration_test.go @@ -0,0 +1,33 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpCommentsFunctionDeclaration(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** This comment should appear for foo*/ +function foo() { +} +foo(/*4*/); +/** This is comment for function signature*/ +function fooWithParameters(/** this is comment about a*/a: string, + /** this is comment for b*/ + b: number) { + var d = a; +} +fooWithParameters(/*10*/"a",/*11*/10); +/** +* Does something +* @param a a string +*/ +declare function fn(a: string); +fn(/*12*/"hello");` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpCommentsFunctionExpression_test.go b/internal/fourslash/tests/gen/signatureHelpCommentsFunctionExpression_test.go new file mode 100644 index 0000000000..3d37253d02 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpCommentsFunctionExpression_test.go @@ -0,0 +1,42 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpCommentsFunctionExpression(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** lambdaFoo var comment*/ +var lambdaFoo = /** this is lambda comment*/ (/**param a*/a: number, /**param b*/b: number) => a + b; +var lambddaNoVarComment = /** this is lambda multiplication*/ (/**param a*/a: number, /**param b*/b: number) => a * b; +lambdaFoo(/*5*/10, /*6*/20); +function anotherFunc(a: number) { + /** documentation + @param b {string} inner parameter */ + var lambdaVar = /** inner docs */(b: string) => { + var localVar = "Hello "; + return localVar + b; + } + return lambdaVar("World") + a; +} +/** + * On variable + * @param s the first parameter! + * @returns the parameter's length + */ +var assigned = /** + * Summary on expression + * @param s param on expression + * @returns return on expression + */function(/** On parameter */s: string) { + return s.length; +} +assigned(/*18*/"hey");` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpConstructorCallParamProperties_test.go b/internal/fourslash/tests/gen/signatureHelpConstructorCallParamProperties_test.go new file mode 100644 index 0000000000..0c507f9522 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpConstructorCallParamProperties_test.go @@ -0,0 +1,25 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpConstructorCallParamProperties(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `class Circle { + /** + * Initialize a circle. + * @param radius The radius of the circle. + */ + constructor(private radius: number) { + } +} +var a = new Circle(/**/` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpExpandedRestTuplesLocalLabels1_test.go b/internal/fourslash/tests/gen/signatureHelpExpandedRestTuplesLocalLabels1_test.go new file mode 100644 index 0000000000..50d57fe426 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpExpandedRestTuplesLocalLabels1_test.go @@ -0,0 +1,79 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpExpandedRestTuplesLocalLabels1(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = ` interface AppleInfo { + color: "green" | "red"; + } + + interface BananaInfo { + curvature: number; + } + + type FruitAndInfo1 = ["apple", AppleInfo] | ["banana", BananaInfo]; + + function logFruitTuple1(...[fruit, info]: FruitAndInfo1) {} + logFruitTuple1(/*1*/); + + function logFruitTuple2(...[, info]: FruitAndInfo1) {} + logFruitTuple2(/*2*/); + logFruitTuple2("apple", /*3*/); + + function logFruitTuple3(...[fruit, ...rest]: FruitAndInfo1) {} + logFruitTuple3(/*4*/); + logFruitTuple3("apple", /*5*/); + function logFruitTuple4(...[fruit, ...[info]]: FruitAndInfo1) {} + logFruitTuple4(/*6*/); + logFruitTuple4("apple", /*7*/); + + type FruitAndInfo2 = ["apple", ...AppleInfo[]] | ["banana", ...BananaInfo[]]; + + function logFruitTuple5(...[fruit, firstInfo]: FruitAndInfo2) {} + logFruitTuple5(/*8*/); + logFruitTuple5("apple", /*9*/); + + function logFruitTuple6(...[fruit, ...fruitInfo]: FruitAndInfo2) {} + logFruitTuple6(/*10*/); + logFruitTuple6("apple", /*11*/); + + type FruitAndInfo3 = ["apple", ...AppleInfo[], number] | ["banana", ...BananaInfo[], number]; + + function logFruitTuple7(...[fruit, fruitInfoOrNumber, secondFruitInfoOrNumber]: FruitAndInfo3) {} + logFruitTuple7(/*12*/); + logFruitTuple7("apple", /*13*/); + logFruitTuple7("apple", { color: "red" }, /*14*/); + + function logFruitTuple8(...[fruit, , secondFruitInfoOrNumber]: FruitAndInfo3) {} + logFruitTuple8(/*15*/); + logFruitTuple8("apple", /*16*/); + logFruitTuple8("apple", { color: "red" }, /*17*/); + + function logFruitTuple9(...[...[fruit, fruitInfoOrNumber, secondFruitInfoOrNumber]]: FruitAndInfo3) {} + logFruitTuple9(/*18*/); + logFruitTuple9("apple", /*19*/); + logFruitTuple9("apple", { color: "red" }, /*20*/); + + function logFruitTuple10(...[fruit, {}, secondFruitInfoOrNumber]: FruitAndInfo3) {} + logFruitTuple10(/*21*/); + logFruitTuple10("apple", /*22*/); + logFruitTuple10("apple", { color: "red" }, /*23*/); + + function logFruitTuple11(...{}: FruitAndInfo3) {} + logFruitTuple11(/*24*/); + logFruitTuple11("apple", /*25*/); + logFruitTuple11("apple", { color: "red" }, /*26*/); + function withPair(...[first, second]: [number, named: string]) {} + withPair(/*27*/); + withPair(101, /*28*/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpInferenceJsDocImportTag_test.go b/internal/fourslash/tests/gen/signatureHelpInferenceJsDocImportTag_test.go new file mode 100644 index 0000000000..6a53358869 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpInferenceJsDocImportTag_test.go @@ -0,0 +1,33 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpInferenceJsDocImportTag(t *testing.T) { + t.Parallel() + t.Skip() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJS: true +// @checkJs: true +// @module: esnext +// @filename: a.ts +export interface Foo {} +// @filename: b.js +/** + * @import { + * Foo + * } from './a' + */ + +/** + * @param {Foo} a + */ +function foo(a) {} +foo(/**/)` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpIteratorNext_test.go b/internal/fourslash/tests/gen/signatureHelpIteratorNext_test.go new file mode 100644 index 0000000000..8ae55291a8 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpIteratorNext_test.go @@ -0,0 +1,36 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpIteratorNext(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @lib: esnext + declare const iterator: Iterator; + + iterator.next(/*1*/); + iterator.next(/*2*/ 0); + + declare const generator: Generator; + + generator.next(/*3*/); + generator.next(/*4*/ 0); + + declare const asyncIterator: AsyncIterator; + + asyncIterator.next(/*5*/); + asyncIterator.next(/*6*/ 0); + + declare const asyncGenerator: AsyncGenerator; + + asyncGenerator.next(/*7*/); + asyncGenerator.next(/*8*/ 0);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpJSDocCallbackTag_test.go b/internal/fourslash/tests/gen/signatureHelpJSDocCallbackTag_test.go new file mode 100644 index 0000000000..4c5acb9335 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpJSDocCallbackTag_test.go @@ -0,0 +1,40 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpJSDocCallbackTag(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowNonTsExtensions: true +// @Filename: jsdocCallbackTag.js +/** + * @callback FooHandler - A kind of magic + * @param {string} eventName - So many words + * @param eventName2 {number | string} - Silence is golden + * @param eventName3 - Osterreich mos def + * @return {number} - DIVEKICK + */ +/** + * @type {FooHandler} callback + */ +var t; + +/** + * @callback FooHandler2 - What, another one? + * @param {string=} eventName - it keeps happening + * @param {string} [eventName2] - i WARNED you dog + */ +/** + * @type {FooHandler2} callback + */ +var t2; +t(/*4*/"!", /*5*/12, /*6*/false);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpJSDocTags_test.go b/internal/fourslash/tests/gen/signatureHelpJSDocTags_test.go new file mode 100644 index 0000000000..3ae9f6cda7 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpJSDocTags_test.go @@ -0,0 +1,74 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpJSDocTags(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** + * This is class Foo. + * @mytag comment1 comment2 + */ +class Foo { + /** + * This is the constructor. + * @myjsdoctag this is a comment + */ + constructor(value: number) {} + /** + * method1 documentation + * @mytag comment1 comment2 + */ + static method1() {} + /** + * @mytag + */ + method2() {} + /** + * @mytag comment1 comment2 + */ + property1: string; + /** + * @mytag1 some comments + * some more comments about mytag1 + * @mytag2 + * here all the comments are on a new line + * @mytag3 + * @mytag + */ + property2: number; + /** + * @returns {number} a value + */ + method3(): number { return 3; } + /** + * @param {string} foo A value. + * @returns {number} Another value + * @mytag + */ + method4(foo: string): number { return 3; } + /** @mytag */ + method5() {} + /** method documentation + * @mytag a JSDoc tag + */ + newMethod() {} +} +var foo = new Foo(/*10*/4); +Foo.method1(/*11*/); +foo.method2(/*12*/); +foo.method3(/*13*/); +foo.method4(); +foo.property1; +foo.property2; +foo.method5(); +foo.newMet` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpJSMissingPropertyAccess_test.go b/internal/fourslash/tests/gen/signatureHelpJSMissingPropertyAccess_test.go new file mode 100644 index 0000000000..b60a6e3856 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpJSMissingPropertyAccess_test.go @@ -0,0 +1,20 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpJSMissingPropertyAccess(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @allowJs: true +// @checkJs: true +// @Filename: test.js +foo.filter(/**/)` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpRestArgs1_test.go b/internal/fourslash/tests/gen/signatureHelpRestArgs1_test.go new file mode 100644 index 0000000000..8dbbecbe58 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpRestArgs1_test.go @@ -0,0 +1,25 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpRestArgs1(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `function fn(a: number, b: number, c: number) {} +const a = [1, 2] as const; +const b = [1] as const; + +fn(...a, /*1*/); +fn(/*2*/, ...a); + +fn(...b, /*3*/); +fn(/*4*/, ...b, /*5*/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpRestArgs2_test.go b/internal/fourslash/tests/gen/signatureHelpRestArgs2_test.go new file mode 100644 index 0000000000..fb95b7cbb4 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpRestArgs2_test.go @@ -0,0 +1,28 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpRestArgs2(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @strict: true +// @allowJs: true +// @checkJs: true +// @filename: index.js +const promisify = function (thisArg, fnName) { + const fn = thisArg[fnName]; + return function () { + return new Promise((resolve) => { + fn.call(thisArg, ...arguments, /*1*/); + }); + }; +};` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpRestArgs3_test.go b/internal/fourslash/tests/gen/signatureHelpRestArgs3_test.go new file mode 100644 index 0000000000..c70cd47e90 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpRestArgs3_test.go @@ -0,0 +1,19 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpRestArgs3(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @target: esnext +// @lib: esnext +const layers = Object.assign({}, /*1*/...[]);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpSkippedArgs1_test.go b/internal/fourslash/tests/gen/signatureHelpSkippedArgs1_test.go new file mode 100644 index 0000000000..cbc1338091 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpSkippedArgs1_test.go @@ -0,0 +1,18 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpSkippedArgs1(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `function fn(a: number, b: number, c: number) {} +fn(/*1*/, /*2*/, /*3*/, /*4*/, /*5*/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/signatureHelpTypeArguments2_test.go b/internal/fourslash/tests/gen/signatureHelpTypeArguments2_test.go new file mode 100644 index 0000000000..ce0336af91 --- /dev/null +++ b/internal/fourslash/tests/gen/signatureHelpTypeArguments2_test.go @@ -0,0 +1,28 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestSignatureHelpTypeArguments2(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/** some documentation + * @template T some documentation 2 + * @template W + * @template U,V others + * @param a ok + * @param b not ok + */ +function f(a: number, b: string, c: boolean): void { } +f string) | ((y: number) => number)) => void; +declare const b: (x: string | number) => void; + +interface Callback { + (x: string): string; + (x: number): number; + (x: string | number): string | number; +} +declare function c(callback: Callback): void; +a((/*1*/) => { + return undefined; +}); + +b(/*2*/); + +c((/*3*/) => {});` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/internal/fourslash/tests/gen/trailingCommaSignatureHelp_test.go b/internal/fourslash/tests/gen/trailingCommaSignatureHelp_test.go new file mode 100644 index 0000000000..f48e6e6fc8 --- /dev/null +++ b/internal/fourslash/tests/gen/trailingCommaSignatureHelp_test.go @@ -0,0 +1,28 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestTrailingCommaSignatureHelp(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `function str(n: number): string; +/** + * Stringifies a number with radix + * @param radix The radix + */ +function str(n: number, radix: number): string; +function str(n: number, radix?: number): string { return ""; } + +str(1, /*a*/) + +declare function f(a: T): T; +f(2, /*b*/);` + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyBaselineSignatureHelp(t) +} diff --git a/testdata/baselines/reference/fourslash/signatureHelp/JsDocDontBreakWithNamespaces.baseline b/testdata/baselines/reference/fourslash/signatureHelp/JsDocDontBreakWithNamespaces.baseline new file mode 100644 index 0000000000..5b85fe7115 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/JsDocDontBreakWithNamespaces.baseline @@ -0,0 +1,94 @@ +// === SignatureHelp === +=== /jsDocDontBreakWithNamespaces.js === +// /** +// * @returns {module:@nodefuel/web~Webserver~wsServer#hello} Websocket server object +// */ +// function foo() { } +// foo(''); +// ^ +// | ---------------------------------------------------------------------- +// | foo(): module +// | ---------------------------------------------------------------------- +// +// /** +// * @type {module:xxxxx} */ +// */ +// function bar() { } +// bar(''); +// ^ +// | ---------------------------------------------------------------------- +// | bar(): void +// | ---------------------------------------------------------------------- +// +// /** @type {function(module:xxxx, module:xxxx): module:xxxxx} */ +// function zee() { } +// zee(''); +// ^ +// | ---------------------------------------------------------------------- +// | zee(): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 117, + "LSPosition": { + "line": 4, + "character": 6 + }, + "Name": "foo", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "foo(): module", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 181, + "LSPosition": { + "line": 10, + "character": 6 + }, + "Name": "bar", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "bar(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 274, + "LSPosition": { + "line": 14, + "character": 6 + }, + "Name": "zee", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "zee(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/JsDocFunctionSignatures5.baseline b/testdata/baselines/reference/fourslash/signatureHelp/JsDocFunctionSignatures5.baseline new file mode 100644 index 0000000000..4738ec0a65 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/JsDocFunctionSignatures5.baseline @@ -0,0 +1,54 @@ +// === SignatureHelp === +=== /Foo.js === +// /** +// * Filters a path based on a regexp or glob pattern. +// * @param {String} basePath The base path where the search will be performed. +// * @param {String} pattern A string defining a regexp of a glob pattern. +// * @param {String} type The search pattern type, can be a regexp or a glob. +// * @param {Object} options A object containing options to the search. +// * @return {Array} A list containing the filtered paths. +// */ +// function pathFilter(basePath, pattern, type, options){ +// //... +// } +// pathFilter('foo', 'bar', 'baz', {}); +// ^ +// | ---------------------------------------------------------------------- +// | pathFilter(**basePath: String**, pattern: String, type: String, options: Object): any[] +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 489, + "LSPosition": { + "line": 11, + "character": 11 + }, + "Name": "", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "pathFilter(basePath: String, pattern: String, type: String, options: Object): any[]", + "parameters": [ + { + "label": "basePath: String" + }, + { + "label": "pattern: String" + }, + { + "label": "type: String" + }, + { + "label": "options: Object" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/JsDocFunctionSignatures6.baseline b/testdata/baselines/reference/fourslash/signatureHelp/JsDocFunctionSignatures6.baseline new file mode 100644 index 0000000000..bb6a6fdfb8 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/JsDocFunctionSignatures6.baseline @@ -0,0 +1,164 @@ +// === SignatureHelp === +=== /Foo.js === +// /** +// * @param {string} p1 - A string param +// * @param {string?} p2 - An optional param +// * @param {string} [p3] - Another optional param +// * @param {string} [p4="test"] - An optional param with a default value +// */ +// function f1(p1, p2, p3, p4){} +// f1('foo', 'bar', 'baz', 'qux'); +// ^ +// | ---------------------------------------------------------------------- +// | f1(**p1: string**, p2: string, p3?: string, p4?: string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | f1(p1: string, **p2: string**, p3?: string, p4?: string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | f1(p1: string, p2: string, **p3?: string**, p4?: string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | f1(p1: string, p2: string, p3?: string, **p4?: string**): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 244, + "LSPosition": { + "line": 7, + "character": 3 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(p1: string, p2: string, p3?: string, p4?: string): void", + "parameters": [ + { + "label": "p1: string" + }, + { + "label": "p2: string" + }, + { + "label": "p3?: string" + }, + { + "label": "p4?: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 251, + "LSPosition": { + "line": 7, + "character": 10 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(p1: string, p2: string, p3?: string, p4?: string): void", + "parameters": [ + { + "label": "p1: string" + }, + { + "label": "p2: string" + }, + { + "label": "p3?: string" + }, + { + "label": "p4?: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 258, + "LSPosition": { + "line": 7, + "character": 17 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(p1: string, p2: string, p3?: string, p4?: string): void", + "parameters": [ + { + "label": "p1: string" + }, + { + "label": "p2: string" + }, + { + "label": "p3?: string" + }, + { + "label": "p4?: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 265, + "LSPosition": { + "line": 7, + "character": 24 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(p1: string, p2: string, p3?: string, p4?: string): void", + "parameters": [ + { + "label": "p1: string" + }, + { + "label": "p2: string" + }, + { + "label": "p3?: string" + }, + { + "label": "p4?: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 3 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/JsDocSignature_43394.baseline b/testdata/baselines/reference/fourslash/signatureHelp/JsDocSignature_43394.baseline new file mode 100644 index 0000000000..e41f00da6a --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/JsDocSignature_43394.baseline @@ -0,0 +1,25 @@ +// === SignatureHelp === +=== /jsDocSignature_43394.ts === +// /** +// * @typedef {Object} Foo +// * @property {number} ... +// * @typedef {number} Bar +// ^ +// | ---------------------------------------------------------------------- +// | No signaturehelp at /**/. +// | ---------------------------------------------------------------------- +// */ +[ + { + "marker": { + "Position": 58, + "LSPosition": { + "line": 3, + "character": 3 + }, + "Name": "", + "Data": {} + }, + "item": null + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/JsdocReturnsTag.baseline b/testdata/baselines/reference/fourslash/signatureHelp/JsdocReturnsTag.baseline new file mode 100644 index 0000000000..2043548ae2 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/JsdocReturnsTag.baseline @@ -0,0 +1,46 @@ +// === SignatureHelp === +=== /dummy.js === +// /** +// * Find an item +// * @template T +// * @param {T[]} l +// * @param {T} x +// * @returns {?T} The names of the found item(s). +// */ +// function find(l, x) { +// } +// find(''); +// ^ +// | ---------------------------------------------------------------------- +// | find(**l: unknown[]**, x: unknown): unknown +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 154, + "LSPosition": { + "line": 9, + "character": 7 + }, + "Name": "", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "find(l: unknown[], x: unknown): unknown", + "parameters": [ + { + "label": "l: unknown[]" + }, + { + "label": "x: unknown" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/QuickInfoJsDocTags13.baseline b/testdata/baselines/reference/fourslash/signatureHelp/QuickInfoJsDocTags13.baseline new file mode 100644 index 0000000000..18ca3b5576 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/QuickInfoJsDocTags13.baseline @@ -0,0 +1,100 @@ +// === SignatureHelp === +=== /a.js === +// /** +// * First overload +// * @overload +// * @param {number} a +// * @returns {void} +// */ +// +// /** +// * Second overload +// * @overload +// * @param {string} a +// * @returns {void} +// */ +// +// /** +// * @param {string | number} a +// * @returns {void} +// */ +// function f(a) {} +// +// f(1); +// ^ +// | ---------------------------------------------------------------------- +// | f(**a: number**): void +// | ---------------------------------------------------------------------- +// f(""); +// ^ +// | ---------------------------------------------------------------------- +// | f(**a: string**): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 238, + "LSPosition": { + "line": 20, + "character": 2 + }, + "Name": "a", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: number): void", + "parameters": [ + { + "label": "a: number" + } + ] + }, + { + "label": "f(a: string): void", + "parameters": [ + { + "label": "a: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 244, + "LSPosition": { + "line": 21, + "character": 2 + }, + "Name": "b", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: number): void", + "parameters": [ + { + "label": "a: number" + } + ] + }, + { + "label": "f(a: string): void", + "parameters": [ + { + "label": "a: string" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/QuickInfoJsDocTextFormatting1.baseline b/testdata/baselines/reference/fourslash/signatureHelp/QuickInfoJsDocTextFormatting1.baseline new file mode 100644 index 0000000000..0a70cac362 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/QuickInfoJsDocTextFormatting1.baseline @@ -0,0 +1,205 @@ +// === SignatureHelp === +=== /quickInfoJsDocTextFormatting1.ts === +// /** +// * @param {number} var1 **Highlighted text** +// * @param {string} var2 Another **Highlighted text** +// */ +// function f1(var1, var2) { } +// +// /** +// * @param {number} var1 *Regular text with an asterisk +// * @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(); +// ^ +// | ---------------------------------------------------------------------- +// | f1(**var1: any**, var2: any): void +// | ---------------------------------------------------------------------- +// f2(); +// ^ +// | ---------------------------------------------------------------------- +// | f2(**var1: any**, var2: any): void +// | ---------------------------------------------------------------------- +// f3(); +// ^ +// | ---------------------------------------------------------------------- +// | f3(**var1: any**, var2: any): void +// | ---------------------------------------------------------------------- +// f4(); +// ^ +// | ---------------------------------------------------------------------- +// | f4(**var1: any**, var2: any): void +// | ---------------------------------------------------------------------- +// f5(); +// ^ +// | ---------------------------------------------------------------------- +// | f5(**var1: any**, var2: any): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 737, + "LSPosition": { + "line": 36, + "character": 3 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(var1: any, var2: any): void", + "parameters": [ + { + "label": "var1: any" + }, + { + "label": "var2: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 743, + "LSPosition": { + "line": 37, + "character": 3 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f2(var1: any, var2: any): void", + "parameters": [ + { + "label": "var1: any" + }, + { + "label": "var2: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 749, + "LSPosition": { + "line": 38, + "character": 3 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f3(var1: any, var2: any): void", + "parameters": [ + { + "label": "var1: any" + }, + { + "label": "var2: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 755, + "LSPosition": { + "line": 39, + "character": 3 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f4(var1: any, var2: any): void", + "parameters": [ + { + "label": "var1: any" + }, + { + "label": "var2: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 761, + "LSPosition": { + "line": 40, + "character": 3 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f5(var1: any, var2: any): void", + "parameters": [ + { + "label": "var1: any" + }, + { + "label": "var2: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpAfterParameter.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpAfterParameter.baseline new file mode 100644 index 0000000000..8049e26f53 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpAfterParameter.baseline @@ -0,0 +1,428 @@ +// === SignatureHelp === +=== /signatureHelpAfterParameter.ts === +// type Type = (a, b, c) => void +// const a: Type = (a, b) => {} +// ^ +// | ---------------------------------------------------------------------- +// | Type(**a: any**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(a: any, **b: any**, c: any): void +// | ---------------------------------------------------------------------- +// const b: Type = function (a, b) {} +// ^ +// | ---------------------------------------------------------------------- +// | Type(**a: any**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(a: any, **b: any**, c: any): void +// | ---------------------------------------------------------------------- +// const c: Type = ({ a: { b }} = { }, [b], ...c) => {} +// ^ +// | ---------------------------------------------------------------------- +// | Type(**a: any**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(**a: any**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(**a: any**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(**a: any**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(a: any, **b: any**, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(a: any, **b: any**, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(a: any, b: any, **c: any**): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | Type(a: any, b: any, **c: any**): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 48, + "LSPosition": { + "line": 1, + "character": 18 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 51, + "LSPosition": { + "line": 1, + "character": 21 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 86, + "LSPosition": { + "line": 2, + "character": 27 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 89, + "LSPosition": { + "line": 2, + "character": 30 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 113, + "LSPosition": { + "line": 3, + "character": 19 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 119, + "LSPosition": { + "line": 3, + "character": 25 + }, + "Name": "6", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 122, + "LSPosition": { + "line": 3, + "character": 28 + }, + "Name": "7", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 128, + "LSPosition": { + "line": 3, + "character": 34 + }, + "Name": "8", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 132, + "LSPosition": { + "line": 3, + "character": 38 + }, + "Name": "9", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 133, + "LSPosition": { + "line": 3, + "character": 39 + }, + "Name": "10", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 138, + "LSPosition": { + "line": 3, + "character": 44 + }, + "Name": "11", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 139, + "LSPosition": { + "line": 3, + "character": 45 + }, + "Name": "12", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Type(a: any, b: any, c: any): void", + "parameters": [ + { + "label": "a: any" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsClass.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsClass.baseline new file mode 100644 index 0000000000..3ac1bec561 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsClass.baseline @@ -0,0 +1,215 @@ +// === SignatureHelp === +=== /signatureHelpCommentsClass.ts === +// /** This is class c2 without constructor*/ +// class c2 { +// } +// var i2 = new c2(); +// ^ +// | ---------------------------------------------------------------------- +// | c2(): c2 +// | ---------------------------------------------------------------------- +// var i2_c = c2; +// class c3 { +// /** Constructor comment*/ +// constructor() { +// } +// } +// var i3 = new c3(); +// ^ +// | ---------------------------------------------------------------------- +// | c3(): c3 +// | ---------------------------------------------------------------------- +// var i3_c = c3; +// /** Class comment*/ +// class c4 { +// /** Constructor comment*/ +// constructor() { +// } +// } +// var i4 = new c4(); +// ^ +// | ---------------------------------------------------------------------- +// | c4(): c4 +// | ---------------------------------------------------------------------- +// var i4_c = c4; +// /** Class with statics*/ +// class c5 { +// static s1: number; +// } +// var i5 = new c5(); +// ^ +// | ---------------------------------------------------------------------- +// | c5(): c5 +// | ---------------------------------------------------------------------- +// var i5_c = c5; +// /** class with statics and constructor*/ +// class c6 { +// /** s1 comment*/ +// static s1: number; +// /** constructor comment*/ +// constructor() { +// } +// } +// var i6 = new c6(); +// ^ +// | ---------------------------------------------------------------------- +// | c6(): c6 +// | ---------------------------------------------------------------------- +// var i6_c = c6; +// +// class a { +// /** +// constructor for a +// @param a this is my a +// */ +// constructor(a: string) { +// } +// } +// new a("Hello"); +// ^ +// | ---------------------------------------------------------------------- +// | a(**a: string**): a +// | ---------------------------------------------------------------------- +// module m { +// export module m2 { +// /** class comment */ +// export class c1 { +// /** constructor comment*/ +// constructor() { +// } +// } +// } +// } +// var myVar = new m.m2.c1(); +[ + { + "marker": { + "Position": 72, + "LSPosition": { + "line": 3, + "character": 16 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "c2(): c2", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 175, + "LSPosition": { + "line": 10, + "character": 16 + }, + "Name": "8", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "c3(): c3", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 298, + "LSPosition": { + "line": 18, + "character": 16 + }, + "Name": "13", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "c4(): c4", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 393, + "LSPosition": { + "line": 24, + "character": 16 + }, + "Name": "18", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "c5(): c5", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 581, + "LSPosition": { + "line": 34, + "character": 16 + }, + "Name": "23", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "c6(): c6", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 716, + "LSPosition": { + "line": 45, + "character": 6 + }, + "Name": "27", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "a(a: string): a", + "parameters": [ + { + "label": "a: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsClassMembers.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsClassMembers.baseline new file mode 100644 index 0000000000..3240abb65d --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsClassMembers.baseline @@ -0,0 +1,624 @@ +// === SignatureHelp === +=== /signatureHelpCommentsClassMembers.ts === +// /** This is comment for c1*/ +// class c1 { +// /** p1 is property of c1*/ +// public p1: number; +// /** sum with property*/ +// public p2(/** number to add*/b: number) { +// return this.p1 + b; +// } +// /** getter property 1*/ +// public get p3() { +// return this.p2(this.p1); +// ^ +// | ---------------------------------------------------------------------- +// | p2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// /** setter property 1*/ +// public set p3(/** this is value*/value: number) { +// this.p1 = this.p2(value); +// ^ +// | ---------------------------------------------------------------------- +// | p2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// /** pp1 is property of c1*/ +// private pp1: number; +// /** sum with property*/ +// private pp2(/** number to add*/b: number) { +// return this.p1 + b; +// } +// /** getter property 2*/ +// private get pp3() { +// return this.pp2(this.pp1); +// ^ +// | ---------------------------------------------------------------------- +// | pp2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// /** setter property 2*/ +// private set pp3( /** this is value*/value: number) { +// this.pp1 = this.pp2(value); +// ^ +// | ---------------------------------------------------------------------- +// | pp2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// /** Constructor method*/ +// constructor() { +// } +// /** s1 is static property of c1*/ +// static s1: number; +// /** static sum with property*/ +// static s2(/** number to add*/b: number) { +// return c1.s1 + b; +// } +// /** static getter property*/ +// static get s3() { +// return c1.s2(c1.s1); +// ^ +// | ---------------------------------------------------------------------- +// | s2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// /** setter property 3*/ +// static set s3( /** this is value*/value: number) { +// c1.s1 = c1.s2(value); +// ^ +// | ---------------------------------------------------------------------- +// | s2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// public nc_p1: number; +// public nc_p2(b: number) { +// return this.nc_p1 + b; +// } +// public get nc_p3() { +// return this.nc_p2(this.nc_p1); +// ^ +// | ---------------------------------------------------------------------- +// | nc_p2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// public set nc_p3(value: number) { +// this.nc_p1 = this.nc_p2(value); +// ^ +// | ---------------------------------------------------------------------- +// | nc_p2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// private nc_pp1: number; +// private nc_pp2(b: number) { +// return this.nc_pp1 + b; +// } +// private get nc_pp3() { +// return this.nc_pp2(this.nc_pp1); +// ^ +// | ---------------------------------------------------------------------- +// | nc_pp2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// private set nc_pp3(value: number) { +// this.nc_pp1 = this.nc_pp2(value); +// ^ +// | ---------------------------------------------------------------------- +// | nc_pp2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// static nc_s1: number; +// static nc_s2(b: number) { +// return c1.nc_s1 + b; +// } +// static get nc_s3() { +// return c1.nc_s2(c1.nc_s1); +// ^ +// | ---------------------------------------------------------------------- +// | nc_s2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// static set nc_s3(value: number) { +// c1.nc_s1 = c1.nc_s2(value); +// ^ +// | ---------------------------------------------------------------------- +// | nc_s2(**b: number**): number +// | ---------------------------------------------------------------------- +// } +// } +// var i1 = new c1(); +// ^ +// | ---------------------------------------------------------------------- +// | c1(): c1 +// | ---------------------------------------------------------------------- +// var i1_p = i1.p1; +// var i1_f = i1.p2; +// var i1_r = i1.p2(20); +// ^ +// | ---------------------------------------------------------------------- +// | p2(**b: number**): number +// | ---------------------------------------------------------------------- +// var i1_prop = i1.p3; +// i1.p3 = i1_prop; +// var i1_nc_p = i1.nc_p1; +// var i1_ncf = i1.nc_p2; +// var i1_ncr = i1.nc_p2(20); +// ^ +// | ---------------------------------------------------------------------- +// | nc_p2(**b: number**): number +// | ---------------------------------------------------------------------- +// var i1_ncprop = i1.nc_p3; +// i1.nc_p3 = i1_ncprop; +// var i1_s_p = c1.s1; +// var i1_s_f = c1.s2; +// var i1_s_r = c1.s2(20); +// ^ +// | ---------------------------------------------------------------------- +// | s2(**b: number**): number +// | ---------------------------------------------------------------------- +// var i1_s_prop = c1.s3; +// c1.s3 = i1_s_prop; +// var i1_s_nc_p = c1.nc_s1; +// var i1_s_ncf = c1.nc_s2; +// var i1_s_ncr = c1.nc_s2(20); +// ^ +// | ---------------------------------------------------------------------- +// | nc_s2(**b: number**): number +// | ---------------------------------------------------------------------- +// var i1_s_ncprop = c1.nc_s3; +// c1.nc_s3 = i1_s_ncprop; +// var i1_c = c1; +// +// class cProperties { +// private val: number; +// /** getter only property*/ +// public get p1() { +// return this.val; +// } +// public get nc_p1() { +// return this.val; +// } +// /**setter only property*/ +// public set p2(value: number) { +// this.val = value; +// } +// public set nc_p2(value: number) { +// this.val = value; +// } +// } +// var cProperties_i = new cProperties(); +// cProperties_i.p2 = cProperties_i.p1; +// cProperties_i.nc_p2 = cProperties_i.nc_p1; +// class cWithConstructorProperty { +// /** +// * this is class cWithConstructorProperty's constructor +// * @param a this is first parameter a +// */ +// constructor(/**more info about a*/public a: number) { +// var bbbb = 10; +// this.a = a + 2 + bbbb; +// } +// } +[ + { + "marker": { + "Position": 275, + "LSPosition": { + "line": 10, + "character": 23 + }, + "Name": "8", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "p2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 399, + "LSPosition": { + "line": 14, + "character": 26 + }, + "Name": "13", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "p2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 656, + "LSPosition": { + "line": 24, + "character": 24 + }, + "Name": "20", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "pp2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 786, + "LSPosition": { + "line": 28, + "character": 28 + }, + "Name": "25", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "pp2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1105, + "LSPosition": { + "line": 41, + "character": 21 + }, + "Name": "35", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "s2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1224, + "LSPosition": { + "line": 45, + "character": 22 + }, + "Name": "42", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "s2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1382, + "LSPosition": { + "line": 52, + "character": 26 + }, + "Name": "47", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_p2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1471, + "LSPosition": { + "line": 55, + "character": 32 + }, + "Name": "49", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_p2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1637, + "LSPosition": { + "line": 62, + "character": 27 + }, + "Name": "54", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_pp2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1731, + "LSPosition": { + "line": 65, + "character": 34 + }, + "Name": "56", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_pp2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1885, + "LSPosition": { + "line": 72, + "character": 24 + }, + "Name": "61", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_s2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1968, + "LSPosition": { + "line": 75, + "character": 28 + }, + "Name": "63", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_s2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2000, + "LSPosition": { + "line": 78, + "character": 16 + }, + "Name": "65", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "c1(): c1", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2056, + "LSPosition": { + "line": 81, + "character": 17 + }, + "Name": "71", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "p2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2168, + "LSPosition": { + "line": 86, + "character": 22 + }, + "Name": "81", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_p2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2280, + "LSPosition": { + "line": 91, + "character": 19 + }, + "Name": "92", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "s2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2402, + "LSPosition": { + "line": 96, + "character": 24 + }, + "Name": "102", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "nc_s2(b: number): number", + "parameters": [ + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsCommentParsing.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsCommentParsing.baseline new file mode 100644 index 0000000000..e347d6162a --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsCommentParsing.baseline @@ -0,0 +1,1658 @@ +// === SignatureHelp === +=== /signatureHelpCommentsCommentParsing.ts === +// /// This is simple /// comments +// function simple() { +// } +// +// simple( ); +// ^ +// | ---------------------------------------------------------------------- +// | simple(): void +// | ---------------------------------------------------------------------- +// +// /// multiLine /// Comments +// /// This is example of multiline /// comments +// /// Another multiLine +// function multiLine() { +// } +// multiLine( ); +// ^ +// | ---------------------------------------------------------------------- +// | multiLine(): void +// | ---------------------------------------------------------------------- +// +// /** this is eg of single line jsdoc style comment */ +// function jsDocSingleLine() { +// } +// jsDocSingleLine(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocSingleLine(): void +// | ---------------------------------------------------------------------- +// +// +// /** this is multiple line jsdoc stule comment +// *New line1 +// *New Line2*/ +// function jsDocMultiLine() { +// } +// jsDocMultiLine(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMultiLine(): void +// | ---------------------------------------------------------------------- +// +// /** multiple line jsdoc comments no longer merge +// *New line1 +// *New Line2*/ +// /** Shoul mege this line as well +// * and this too*/ /** Another this one too*/ +// function jsDocMultiLineMerge() { +// } +// jsDocMultiLineMerge(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMultiLineMerge(): void +// | ---------------------------------------------------------------------- +// +// +// /// Triple slash comment +// /** jsdoc comment */ +// function jsDocMixedComments1() { +// } +// jsDocMixedComments1(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMixedComments1(): void +// | ---------------------------------------------------------------------- +// +// /// Triple slash comment +// /** jsdoc comment */ /** another jsDocComment*/ +// function jsDocMixedComments2() { +// } +// jsDocMixedComments2(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMixedComments2(): void +// | ---------------------------------------------------------------------- +// +// /** jsdoc comment */ /*** triplestar jsDocComment*/ +// /// Triple slash comment +// function jsDocMixedComments3() { +// } +// jsDocMixedComments3(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMixedComments3(): void +// | ---------------------------------------------------------------------- +// +// /** jsdoc comment */ /** another jsDocComment*/ +// /// Triple slash comment +// /// Triple slash comment 2 +// function jsDocMixedComments4() { +// } +// jsDocMixedComments4(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMixedComments4(): void +// | ---------------------------------------------------------------------- +// +// /// Triple slash comment 1 +// /** jsdoc comment */ /** another jsDocComment*/ +// /// Triple slash comment +// /// Triple slash comment 2 +// function jsDocMixedComments5() { +// } +// jsDocMixedComments5(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMixedComments5(): void +// | ---------------------------------------------------------------------- +// +// /** another jsDocComment*/ +// /// Triple slash comment 1 +// /// Triple slash comment +// /// Triple slash comment 2 +// /** jsdoc comment */ +// function jsDocMixedComments6() { +// } +// jsDocMixedComments6(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocMixedComments6(): void +// | ---------------------------------------------------------------------- +// +// // This shoulnot be help comment +// function noHelpComment1() { +// } +// noHelpComment1(); +// ^ +// | ---------------------------------------------------------------------- +// | noHelpComment1(): void +// | ---------------------------------------------------------------------- +// +// /* This shoulnot be help comment */ +// function noHelpComment2() { +// } +// noHelpComment2(); +// ^ +// | ---------------------------------------------------------------------- +// | noHelpComment2(): void +// | ---------------------------------------------------------------------- +// +// function noHelpComment3() { +// } +// noHelpComment3(); +// ^ +// | ---------------------------------------------------------------------- +// | noHelpComment3(): void +// | ---------------------------------------------------------------------- +// /** Adds two integers and returns the result +// * @param {number} a first number +// * @param b second number +// */ +// function sum(a: number, b: number) { +// return a + b; +// } +// sum(10, 20); +// ^ +// | ---------------------------------------------------------------------- +// | sum(**a: number**, b: number): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | sum(a: number, **b: number**): number +// | ---------------------------------------------------------------------- +// /** This is multiplication function +// * @param +// * @param a first number +// * @param b +// * @param c { +// @param d @anotherTag +// * @param e LastParam @anotherTag*/ +// function multiply(a: number, b: number, c?: number, d?, e?) { +// } +// multiply(10, 20, 30, 40, 50); +// ^ +// | ---------------------------------------------------------------------- +// | multiply(**a: number**, b: number, c?: number, d?: any, e?: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | multiply(a: number, **b: number**, c?: number, d?: any, e?: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | multiply(a: number, b: number, **c?: number**, d?: any, e?: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | multiply(a: number, b: number, c?: number, **d?: any**, e?: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | multiply(a: number, b: number, c?: number, d?: any, **e?: any**): void +// | ---------------------------------------------------------------------- +// /** fn f1 with number +// * @param { string} b about b +// */ +// function f1(a: number); +// function f1(b: string); +// /**@param opt optional parameter*/ +// function f1(aOrb, opt?) { +// return aOrb; +// } +// f1(10); +// ^ +// | ---------------------------------------------------------------------- +// | f1(**a: number**): any +// | ---------------------------------------------------------------------- +// f1("hello"); +// ^ +// | ---------------------------------------------------------------------- +// | f1(**b: string**): any +// | ---------------------------------------------------------------------- +// +// /** This is subtract function +// @param { a +// *@param { number | } b this is about b +// @param { { () => string; } } c this is optional param c +// @param { { () => string; } d this is optional param d +// @param { { () => string; } } e this is optional param e +// @param { { { () => string; } } f this is optional param f +// */ +// function subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string) { +// } +// subtract(10, 20, null, null, null, null); +// ^ +// | ---------------------------------------------------------------------- +// | subtract(**a: number**, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | subtract(a: number, **b: number**, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | subtract(a: number, b: number, **c?: () => string**, d?: () => string, e?: () => string, f?: () => string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | subtract(a: number, b: number, c?: () => string, **d?: () => string**, e?: () => string, f?: () => string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | subtract(a: number, b: number, c?: () => string, d?: () => string, **e?: () => string**, f?: () => string): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, **f?: () => string**): void +// | ---------------------------------------------------------------------- +// /** this is square function +// @paramTag { number } a this is input number of paramTag +// @param { number } a this is input number +// @returnType { number } it is return type +// */ +// function square(a: number) { +// return a * a; +// } +// square(10); +// ^ +// | ---------------------------------------------------------------------- +// | square(**a: number**): number +// | ---------------------------------------------------------------------- +// /** this is divide function +// @param { number} a this is a +// @paramTag { number } g this is optional param g +// @param { number} b this is b +// */ +// function divide(a: number, b: number) { +// } +// divide(10, 20); +// ^ +// | ---------------------------------------------------------------------- +// | divide(**a: number**, b: number): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | divide(a: number, **b: number**): void +// | ---------------------------------------------------------------------- +// /** +// Function returns string concat of foo and bar +// @param {string} foo is string +// @param {string} bar is second string +// */ +// function fooBar(foo: string, bar: string) { +// return foo + bar; +// } +// fooBar("foo","bar"); +// ^ +// | ---------------------------------------------------------------------- +// | fooBar(**foo: string**, bar: string): string +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fooBar(foo: string, **bar: string**): string +// | ---------------------------------------------------------------------- +// /** This is a comment */ +// var x; +// /** +// * This is a comment +// */ +// var y; +// /** this is jsdoc style function with param tag as well as inline parameter help +// *@param a it is first parameter +// *@param c it is third parameter +// */ +// function jsDocParamTest(/** this is inline comment for a */a: number, /** this is inline comment for b*/ b: number, c: number, d: number) { +// return a + b + c + d; +// ^ +// | ---------------------------------------------------------------------- +// | No signaturehelp at /*39*/. +// | ---------------------------------------------------------------------- +// } +// jsDocParamTest(30, 40, 50, 60); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocParamTest(**a: number**, b: number, c: number, d: number): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | jsDocParamTest(a: number, **b: number**, c: number, d: number): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | jsDocParamTest(a: number, b: number, **c: number**, d: number): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | jsDocParamTest(a: number, b: number, c: number, **d: number**): number +// | ---------------------------------------------------------------------- +// /** This is function comment +// * And properly aligned comment +// */ +// function jsDocCommentAlignmentTest1() { +// } +// jsDocCommentAlignmentTest1(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocCommentAlignmentTest1(): void +// | ---------------------------------------------------------------------- +// /** This is function comment +// * And aligned with 4 space char margin +// */ +// function jsDocCommentAlignmentTest2() { +// } +// jsDocCommentAlignmentTest2(); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocCommentAlignmentTest2(): void +// | ---------------------------------------------------------------------- +// /** This is function comment +// * And aligned with 4 space char margin +// * @param {string} a this is info about a +// * spanning on two lines and aligned perfectly +// * @param b this is info about b +// * spanning on two lines and aligned perfectly +// * spanning one more line alined perfectly +// * spanning another line with more margin +// * @param c this is info about b +// * not aligned text about parameter will eat only one space +// */ +// function jsDocCommentAlignmentTest3(a: string, b, c) { +// } +// jsDocCommentAlignmentTest3("hello",1, 2); +// ^ +// | ---------------------------------------------------------------------- +// | jsDocCommentAlignmentTest3(**a: string**, b: any, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | jsDocCommentAlignmentTest3(a: string, **b: any**, c: any): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | jsDocCommentAlignmentTest3(a: string, b: any, **c: any**): void +// | ---------------------------------------------------------------------- +// +// ^ +// | ---------------------------------------------------------------------- +// | No signaturehelp at /**/. +// | ---------------------------------------------------------------------- +// class NoQuickInfoClass { +// } +[ + { + "marker": { + "Position": 63, + "LSPosition": { + "line": 4, + "character": 8 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "simple(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 198, + "LSPosition": { + "line": 11, + "character": 11 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "multiLine(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 302, + "LSPosition": { + "line": 16, + "character": 16 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocSingleLine(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 422, + "LSPosition": { + "line": 24, + "character": 15 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMultiLine(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 631, + "LSPosition": { + "line": 33, + "character": 20 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMultiLineMerge(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 737, + "LSPosition": { + "line": 40, + "character": 20 + }, + "Name": "6", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMixedComments1(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 869, + "LSPosition": { + "line": 46, + "character": 20 + }, + "Name": "7", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMixedComments2(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1005, + "LSPosition": { + "line": 52, + "character": 20 + }, + "Name": "8", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMixedComments3(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1164, + "LSPosition": { + "line": 59, + "character": 20 + }, + "Name": "9", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMixedComments4(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1350, + "LSPosition": { + "line": 67, + "character": 20 + }, + "Name": "10", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMixedComments5(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1536, + "LSPosition": { + "line": 76, + "character": 20 + }, + "Name": "11", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocMixedComments6(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1618, + "LSPosition": { + "line": 81, + "character": 15 + }, + "Name": "12", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "noHelpComment1(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1703, + "LSPosition": { + "line": 86, + "character": 15 + }, + "Name": "13", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "noHelpComment2(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1752, + "LSPosition": { + "line": 90, + "character": 15 + }, + "Name": "14", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "noHelpComment3(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1928, + "LSPosition": { + "line": 98, + "character": 4 + }, + "Name": "16", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "sum(a: number, b: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1932, + "LSPosition": { + "line": 98, + "character": 8 + }, + "Name": "17", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "sum(a: number, b: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 2166, + "LSPosition": { + "line": 108, + "character": 9 + }, + "Name": "19", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "multiply(a: number, b: number, c?: number, d?: any, e?: any): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: number" + }, + { + "label": "d?: any" + }, + { + "label": "e?: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2169, + "LSPosition": { + "line": 108, + "character": 12 + }, + "Name": "20", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "multiply(a: number, b: number, c?: number, d?: any, e?: any): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: number" + }, + { + "label": "d?: any" + }, + { + "label": "e?: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 2173, + "LSPosition": { + "line": 108, + "character": 16 + }, + "Name": "21", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "multiply(a: number, b: number, c?: number, d?: any, e?: any): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: number" + }, + { + "label": "d?: any" + }, + { + "label": "e?: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 2178, + "LSPosition": { + "line": 108, + "character": 21 + }, + "Name": "22", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "multiply(a: number, b: number, c?: number, d?: any, e?: any): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: number" + }, + { + "label": "d?: any" + }, + { + "label": "e?: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 3 + } + }, + { + "marker": { + "Position": 2182, + "LSPosition": { + "line": 108, + "character": 25 + }, + "Name": "23", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "multiply(a: number, b: number, c?: number, d?: any, e?: any): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: number" + }, + { + "label": "d?: any" + }, + { + "label": "e?: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 4 + } + }, + { + "marker": { + "Position": 2372, + "LSPosition": { + "line": 118, + "character": 3 + }, + "Name": "25", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(a: number): any", + "parameters": [ + { + "label": "a: number" + } + ] + }, + { + "label": "f1(b: string): any", + "parameters": [ + { + "label": "b: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2380, + "LSPosition": { + "line": 119, + "character": 3 + }, + "Name": "26", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f1(a: number): any", + "parameters": [ + { + "label": "a: number" + } + ] + }, + { + "label": "f1(b: string): any", + "parameters": [ + { + "label": "b: string" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2823, + "LSPosition": { + "line": 131, + "character": 9 + }, + "Name": "28", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: () => string" + }, + { + "label": "d?: () => string" + }, + { + "label": "e?: () => string" + }, + { + "label": "f?: () => string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 2827, + "LSPosition": { + "line": 131, + "character": 13 + }, + "Name": "29", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: () => string" + }, + { + "label": "d?: () => string" + }, + { + "label": "e?: () => string" + }, + { + "label": "f?: () => string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 2832, + "LSPosition": { + "line": 131, + "character": 18 + }, + "Name": "30", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: () => string" + }, + { + "label": "d?: () => string" + }, + { + "label": "e?: () => string" + }, + { + "label": "f?: () => string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 2839, + "LSPosition": { + "line": 131, + "character": 25 + }, + "Name": "31", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: () => string" + }, + { + "label": "d?: () => string" + }, + { + "label": "e?: () => string" + }, + { + "label": "f?: () => string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 3 + } + }, + { + "marker": { + "Position": 2846, + "LSPosition": { + "line": 131, + "character": 32 + }, + "Name": "32", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: () => string" + }, + { + "label": "d?: () => string" + }, + { + "label": "e?: () => string" + }, + { + "label": "f?: () => string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 4 + } + }, + { + "marker": { + "Position": 2853, + "LSPosition": { + "line": 131, + "character": 39 + }, + "Name": "33", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "subtract(a: number, b: number, c?: () => string, d?: () => string, e?: () => string, f?: () => string): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c?: () => string" + }, + { + "label": "d?: () => string" + }, + { + "label": "e?: () => string" + }, + { + "label": "f?: () => string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 5 + } + }, + { + "marker": { + "Position": 3085, + "LSPosition": { + "line": 140, + "character": 7 + }, + "Name": "34", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "square(a: number): number", + "parameters": [ + { + "label": "a: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 3276, + "LSPosition": { + "line": 148, + "character": 7 + }, + "Name": "35", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "divide(a: number, b: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 3280, + "LSPosition": { + "line": 148, + "character": 11 + }, + "Name": "36", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "divide(a: number, b: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 3491, + "LSPosition": { + "line": 157, + "character": 7 + }, + "Name": "37", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fooBar(foo: string, bar: string): string", + "parameters": [ + { + "label": "foo: string" + }, + { + "label": "bar: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 3497, + "LSPosition": { + "line": 157, + "character": 13 + }, + "Name": "38", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fooBar(foo: string, bar: string): string", + "parameters": [ + { + "label": "foo: string" + }, + { + "label": "bar: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 3874, + "LSPosition": { + "line": 169, + "character": 11 + }, + "Name": "39", + "Data": {} + }, + "item": null + }, + { + "marker": { + "Position": 3906, + "LSPosition": { + "line": 171, + "character": 15 + }, + "Name": "40", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocParamTest(a: number, b: number, c: number, d: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + }, + { + "label": "d: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 3910, + "LSPosition": { + "line": 171, + "character": 19 + }, + "Name": "41", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocParamTest(a: number, b: number, c: number, d: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + }, + { + "label": "d: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 3914, + "LSPosition": { + "line": 171, + "character": 23 + }, + "Name": "42", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocParamTest(a: number, b: number, c: number, d: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + }, + { + "label": "d: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 3918, + "LSPosition": { + "line": 171, + "character": 27 + }, + "Name": "43", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocParamTest(a: number, b: number, c: number, d: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + }, + { + "label": "d: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 3 + } + }, + { + "marker": { + "Position": 4059, + "LSPosition": { + "line": 177, + "character": 27 + }, + "Name": "45", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocCommentAlignmentTest1(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 4210, + "LSPosition": { + "line": 183, + "character": 27 + }, + "Name": "46", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocCommentAlignmentTest2(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 4826, + "LSPosition": { + "line": 197, + "character": 27 + }, + "Name": "47", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocCommentAlignmentTest3(a: string, b: any, c: any): void", + "parameters": [ + { + "label": "a: string" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 4834, + "LSPosition": { + "line": 197, + "character": 35 + }, + "Name": "48", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocCommentAlignmentTest3(a: string, b: any, c: any): void", + "parameters": [ + { + "label": "a: string" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 4837, + "LSPosition": { + "line": 197, + "character": 38 + }, + "Name": "49", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "jsDocCommentAlignmentTest3(a: string, b: any, c: any): void", + "parameters": [ + { + "label": "a: string" + }, + { + "label": "b: any" + }, + { + "label": "c: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 4841, + "LSPosition": { + "line": 198, + "character": 0 + }, + "Name": "", + "Data": {} + }, + "item": null + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsFunctionDeclaration.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsFunctionDeclaration.baseline new file mode 100644 index 0000000000..7eeca6af5e --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsFunctionDeclaration.baseline @@ -0,0 +1,139 @@ +// === SignatureHelp === +=== /signatureHelpCommentsFunctionDeclaration.ts === +// /** This comment should appear for foo*/ +// function foo() { +// } +// foo(); +// ^ +// | ---------------------------------------------------------------------- +// | foo(): void +// | ---------------------------------------------------------------------- +// /** This is comment for function signature*/ +// function fooWithParameters(/** this is comment about a*/a: string, +// /** this is comment for b*/ +// b: number) { +// var d = a; +// } +// fooWithParameters("a",10); +// ^ +// | ---------------------------------------------------------------------- +// | fooWithParameters(**a: string**, b: number): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fooWithParameters(a: string, **b: number**): void +// | ---------------------------------------------------------------------- +// /** +// * Does something +// * @param a a string +// */ +// declare function fn(a: string); +// fn("hello"); +// ^ +// | ---------------------------------------------------------------------- +// | fn(**a: string**): any +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 64, + "LSPosition": { + "line": 3, + "character": 4 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "foo(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 263, + "LSPosition": { + "line": 10, + "character": 18 + }, + "Name": "10", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fooWithParameters(a: string, b: number): void", + "parameters": [ + { + "label": "a: string" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 267, + "LSPosition": { + "line": 10, + "character": 22 + }, + "Name": "11", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fooWithParameters(a: string, b: number): void", + "parameters": [ + { + "label": "a: string" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 351, + "LSPosition": { + "line": 16, + "character": 3 + }, + "Name": "12", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: string): any", + "parameters": [ + { + "label": "a: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsFunctionExpression.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsFunctionExpression.baseline new file mode 100644 index 0000000000..ddd0d0daad --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpCommentsFunctionExpression.baseline @@ -0,0 +1,123 @@ +// === SignatureHelp === +=== /signatureHelpCommentsFunctionExpression.ts === +// /** lambdaFoo var comment*/ +// var lambdaFoo = /** this is lambda comment*/ (/**param a*/a: number, /**param b*/b: number) => a + b; +// var lambddaNoVarComment = /** this is lambda multiplication*/ (/**param a*/a: number, /**param b*/b: number) => a * b; +// lambdaFoo(10, 20); +// ^ +// | ---------------------------------------------------------------------- +// | lambdaFoo(**a: number**, b: number): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | lambdaFoo(a: number, **b: number**): number +// | ---------------------------------------------------------------------- +// function anotherFunc(a: number) { +// /** documentation +// @param b {string} inner parameter */ +// var lambdaVar = /** inner docs */(b: string) => { +// var localVar = "Hello "; +// return localVar + b; +// } +// return lambdaVar("World") + a; +// } +// /** +// * On variable +// * @param s the first parameter! +// * @returns the parameter's length +// */ +// var assigned = /** +// * Summary on expression +// * @param s param on expression +// * @returns return on expression +// */function(/** On parameter */s: string) { +// return s.length; +// } +// assigned("hey"); +// ^ +// | ---------------------------------------------------------------------- +// | assigned(**s: string**): number +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 259, + "LSPosition": { + "line": 3, + "character": 10 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "lambdaFoo(a: number, b: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 263, + "LSPosition": { + "line": 3, + "character": 14 + }, + "Name": "6", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "lambdaFoo(a: number, b: number): number", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 862, + "LSPosition": { + "line": 25, + "character": 9 + }, + "Name": "18", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "assigned(s: string): number", + "parameters": [ + { + "label": "s: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpConstructorCallParamProperties.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpConstructorCallParamProperties.baseline new file mode 100644 index 0000000000..a9c2da5bea --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpConstructorCallParamProperties.baseline @@ -0,0 +1,42 @@ +// === SignatureHelp === +=== /signatureHelpConstructorCallParamProperties.ts === +// class Circle { +// /** +// * Initialize a circle. +// * @param radius The radius of the circle. +// */ +// constructor(private radius: number) { +// } +// } +// var a = new Circle( +// ^ +// | ---------------------------------------------------------------------- +// | Circle(**radius: number**): Circle +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 179, + "LSPosition": { + "line": 8, + "character": 19 + }, + "Name": "", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Circle(radius: number): Circle", + "parameters": [ + { + "label": "radius: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpExpandedRestTuplesLocalLabels1.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpExpandedRestTuplesLocalLabels1.baseline new file mode 100644 index 0000000000..97fcdc0a24 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpExpandedRestTuplesLocalLabels1.baseline @@ -0,0 +1,1339 @@ +// === SignatureHelp === +=== /signatureHelpExpandedRestTuplesLocalLabels1.ts === +// interface AppleInfo { +// color: "green" | "red"; +// } +// +// interface BananaInfo { +// curvature: number; +// } +// +// type FruitAndInfo1 = ["apple", AppleInfo] | ["banana", BananaInfo]; +// +// function logFruitTuple1(...[fruit, info]: FruitAndInfo1) {} +// logFruitTuple1(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple1(**fruit: "apple"**, info: AppleInfo): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple2(...[, info]: FruitAndInfo1) {} +// logFruitTuple2(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple2(**arg_0: "apple"**, info: AppleInfo): void +// | ---------------------------------------------------------------------- +// logFruitTuple2("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple2(arg_0: "apple", **info: AppleInfo**): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple3(...[fruit, ...rest]: FruitAndInfo1) {} +// logFruitTuple3(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple3(**fruit: "apple"**, rest_0: AppleInfo): void +// | ---------------------------------------------------------------------- +// logFruitTuple3("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple3(fruit: "apple", **rest_0: AppleInfo**): void +// | ---------------------------------------------------------------------- +// function logFruitTuple4(...[fruit, ...[info]]: FruitAndInfo1) {} +// logFruitTuple4(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple4(**fruit: "apple"**, info: AppleInfo): void +// | ---------------------------------------------------------------------- +// logFruitTuple4("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple4(fruit: "apple", **info: AppleInfo**): void +// | ---------------------------------------------------------------------- +// +// type FruitAndInfo2 = ["apple", ...AppleInfo[]] | ["banana", ...BananaInfo[]]; +// +// function logFruitTuple5(...[fruit, firstInfo]: FruitAndInfo2) {} +// logFruitTuple5(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple5(**fruit: "apple"**, ...firstInfo_n: AppleInfo[]): void +// | ---------------------------------------------------------------------- +// logFruitTuple5("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple5(fruit: "apple", **...firstInfo_n: AppleInfo[]**): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple6(...[fruit, ...fruitInfo]: FruitAndInfo2) {} +// logFruitTuple6(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple6(**fruit: "apple"**, ...fruitInfo: AppleInfo[]): void +// | ---------------------------------------------------------------------- +// logFruitTuple6("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple6(fruit: "apple", **...fruitInfo: AppleInfo[]**): void +// | ---------------------------------------------------------------------- +// +// type FruitAndInfo3 = ["apple", ...AppleInfo[], number] | ["banana", ...BananaInfo[], number]; +// +// function logFruitTuple7(...[fruit, fruitInfoOrNumber, secondFruitInfoOrNumber]: FruitAndInfo3) {} +// logFruitTuple7(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple7(**fruit: "apple"**, ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple7("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple7(fruit: "apple", **...fruitInfoOrNumber_n: AppleInfo[]**, secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple7("apple", { color: "red" }, ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple7(fruit: "apple", ...fruitInfoOrNumber_n: AppleInfo[], **secondFruitInfoOrNumber: number**): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple8(...[fruit, , secondFruitInfoOrNumber]: FruitAndInfo3) {} +// logFruitTuple8(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple8(**fruit: "apple"**, ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple8("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple8(fruit: "apple", **...arg_1: AppleInfo[]**, secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple8("apple", { color: "red" }, ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple8(fruit: "apple", ...arg_1: AppleInfo[], **secondFruitInfoOrNumber: number**): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple9(...[...[fruit, fruitInfoOrNumber, secondFruitInfoOrNumber]]: FruitAndInfo3) {} +// logFruitTuple9(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple9(**fruit: "apple"**, ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple9("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple9(fruit: "apple", **...fruitInfoOrNumber_n: AppleInfo[]**, secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple9("apple", { color: "red" }, ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple9(fruit: "apple", ...fruitInfoOrNumber_n: AppleInfo[], **secondFruitInfoOrNumber: number**): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple10(...[fruit, {}, secondFruitInfoOrNumber]: FruitAndInfo3) {} +// logFruitTuple10(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple10(**fruit: "apple"**, ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple10("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple10(fruit: "apple", **...arg_1: AppleInfo[]**, secondFruitInfoOrNumber: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple10("apple", { color: "red" }, ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple10(fruit: "apple", ...arg_1: AppleInfo[], **secondFruitInfoOrNumber: number**): void +// | ---------------------------------------------------------------------- +// +// function logFruitTuple11(...{}: FruitAndInfo3) {} +// logFruitTuple11(); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple11(**arg_0: "apple"**, ...arg_1: AppleInfo[], arg_2: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple11("apple", ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple11(arg_0: "apple", **...arg_1: AppleInfo[]**, arg_2: number): void +// | ---------------------------------------------------------------------- +// logFruitTuple11("apple", { color: "red" }, ); +// ^ +// | ---------------------------------------------------------------------- +// | logFruitTuple11(arg_0: "apple", ...arg_1: AppleInfo[], **arg_2: number**): void +// | ---------------------------------------------------------------------- +// function withPair(...[first, second]: [number, named: string]) {} +// withPair(); +// ^ +// | ---------------------------------------------------------------------- +// | withPair(**first: number**, named: string): void +// | ---------------------------------------------------------------------- +// withPair(101, ); +// ^ +// | ---------------------------------------------------------------------- +// | withPair(first: number, **named: string**): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 251, + "LSPosition": { + "line": 11, + "character": 16 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple1(fruit: \"apple\", info: AppleInfo): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "info: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple1(fruit: \"banana\", info: BananaInfo): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "info: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 327, + "LSPosition": { + "line": 14, + "character": 16 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple2(arg_0: \"apple\", info: AppleInfo): void", + "parameters": [ + { + "label": "arg_0: \"apple\"" + }, + { + "label": "info: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple2(arg_0: \"banana\", info: BananaInfo): void", + "parameters": [ + { + "label": "arg_0: \"banana\"" + }, + { + "label": "info: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 355, + "LSPosition": { + "line": 15, + "character": 25 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple2(arg_0: \"apple\", info: AppleInfo): void", + "parameters": [ + { + "label": "arg_0: \"apple\"" + }, + { + "label": "info: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple2(arg_0: \"banana\", info: BananaInfo): void", + "parameters": [ + { + "label": "arg_0: \"banana\"" + }, + { + "label": "info: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 439, + "LSPosition": { + "line": 18, + "character": 16 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple3(fruit: \"apple\", rest_0: AppleInfo): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "rest_0: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple3(fruit: \"banana\", rest_0: BananaInfo): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "rest_0: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 467, + "LSPosition": { + "line": 19, + "character": 25 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple3(fruit: \"apple\", rest_0: AppleInfo): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "rest_0: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple3(fruit: \"banana\", rest_0: BananaInfo): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "rest_0: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 552, + "LSPosition": { + "line": 21, + "character": 16 + }, + "Name": "6", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple4(fruit: \"apple\", info: AppleInfo): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "info: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple4(fruit: \"banana\", info: BananaInfo): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "info: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 580, + "LSPosition": { + "line": 22, + "character": 25 + }, + "Name": "7", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple4(fruit: \"apple\", info: AppleInfo): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "info: AppleInfo" + } + ] + }, + { + "label": "logFruitTuple4(fruit: \"banana\", info: BananaInfo): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "info: BananaInfo" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 746, + "LSPosition": { + "line": 27, + "character": 16 + }, + "Name": "8", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple5(fruit: \"apple\", ...firstInfo_n: AppleInfo[]): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...firstInfo_n: AppleInfo[]" + } + ] + }, + { + "label": "logFruitTuple5(fruit: \"banana\", ...firstInfo_n: BananaInfo[]): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...firstInfo_n: BananaInfo[]" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 774, + "LSPosition": { + "line": 28, + "character": 25 + }, + "Name": "9", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple5(fruit: \"apple\", ...firstInfo_n: AppleInfo[]): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...firstInfo_n: AppleInfo[]" + } + ] + }, + { + "label": "logFruitTuple5(fruit: \"banana\", ...firstInfo_n: BananaInfo[]): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...firstInfo_n: BananaInfo[]" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 863, + "LSPosition": { + "line": 31, + "character": 16 + }, + "Name": "10", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple6(fruit: \"apple\", ...fruitInfo: AppleInfo[]): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfo: AppleInfo[]" + } + ] + }, + { + "label": "logFruitTuple6(fruit: \"banana\", ...fruitInfo: BananaInfo[]): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfo: BananaInfo[]" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 891, + "LSPosition": { + "line": 32, + "character": 25 + }, + "Name": "11", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple6(fruit: \"apple\", ...fruitInfo: AppleInfo[]): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfo: AppleInfo[]" + } + ] + }, + { + "label": "logFruitTuple6(fruit: \"banana\", ...fruitInfo: BananaInfo[]): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfo: BananaInfo[]" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 1106, + "LSPosition": { + "line": 37, + "character": 16 + }, + "Name": "12", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple7(fruit: \"apple\", ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfoOrNumber_n: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple7(fruit: \"banana\", ...fruitInfoOrNumber_n: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfoOrNumber_n: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1134, + "LSPosition": { + "line": 38, + "character": 25 + }, + "Name": "13", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple7(fruit: \"apple\", ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfoOrNumber_n: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple7(fruit: \"banana\", ...fruitInfoOrNumber_n: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfoOrNumber_n: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 1180, + "LSPosition": { + "line": 39, + "character": 43 + }, + "Name": "14", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple7(fruit: \"apple\", ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfoOrNumber_n: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple7(fruit: \"banana\", ...fruitInfoOrNumber_n: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfoOrNumber_n: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 1282, + "LSPosition": { + "line": 42, + "character": 16 + }, + "Name": "15", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple8(fruit: \"apple\", ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple8(fruit: \"banana\", ...arg_1: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1310, + "LSPosition": { + "line": 43, + "character": 25 + }, + "Name": "16", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple8(fruit: \"apple\", ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple8(fruit: \"banana\", ...arg_1: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 1356, + "LSPosition": { + "line": 44, + "character": 43 + }, + "Name": "17", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple8(fruit: \"apple\", ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple8(fruit: \"banana\", ...arg_1: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 1480, + "LSPosition": { + "line": 47, + "character": 16 + }, + "Name": "18", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple9(fruit: \"apple\", ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfoOrNumber_n: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple9(fruit: \"banana\", ...fruitInfoOrNumber_n: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfoOrNumber_n: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1508, + "LSPosition": { + "line": 48, + "character": 25 + }, + "Name": "19", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple9(fruit: \"apple\", ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfoOrNumber_n: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple9(fruit: \"banana\", ...fruitInfoOrNumber_n: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfoOrNumber_n: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 1554, + "LSPosition": { + "line": 49, + "character": 43 + }, + "Name": "20", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple9(fruit: \"apple\", ...fruitInfoOrNumber_n: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...fruitInfoOrNumber_n: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple9(fruit: \"banana\", ...fruitInfoOrNumber_n: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...fruitInfoOrNumber_n: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 1660, + "LSPosition": { + "line": 52, + "character": 17 + }, + "Name": "21", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple10(fruit: \"apple\", ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple10(fruit: \"banana\", ...arg_1: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1689, + "LSPosition": { + "line": 53, + "character": 26 + }, + "Name": "22", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple10(fruit: \"apple\", ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple10(fruit: \"banana\", ...arg_1: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 1736, + "LSPosition": { + "line": 54, + "character": 44 + }, + "Name": "23", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple10(fruit: \"apple\", ...arg_1: AppleInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + }, + { + "label": "logFruitTuple10(fruit: \"banana\", ...arg_1: BananaInfo[], secondFruitInfoOrNumber: number): void", + "parameters": [ + { + "label": "fruit: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "secondFruitInfoOrNumber: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 1808, + "LSPosition": { + "line": 57, + "character": 17 + }, + "Name": "24", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple11(arg_0: \"apple\", ...arg_1: AppleInfo[], arg_2: number): void", + "parameters": [ + { + "label": "arg_0: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "arg_2: number" + } + ] + }, + { + "label": "logFruitTuple11(arg_0: \"banana\", ...arg_1: BananaInfo[], arg_2: number): void", + "parameters": [ + { + "label": "arg_0: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "arg_2: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1837, + "LSPosition": { + "line": 58, + "character": 26 + }, + "Name": "25", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple11(arg_0: \"apple\", ...arg_1: AppleInfo[], arg_2: number): void", + "parameters": [ + { + "label": "arg_0: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "arg_2: number" + } + ] + }, + { + "label": "logFruitTuple11(arg_0: \"banana\", ...arg_1: BananaInfo[], arg_2: number): void", + "parameters": [ + { + "label": "arg_0: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "arg_2: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 1884, + "LSPosition": { + "line": 59, + "character": 44 + }, + "Name": "26", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "logFruitTuple11(arg_0: \"apple\", ...arg_1: AppleInfo[], arg_2: number): void", + "parameters": [ + { + "label": "arg_0: \"apple\"" + }, + { + "label": "...arg_1: AppleInfo[]" + }, + { + "label": "arg_2: number" + } + ] + }, + { + "label": "logFruitTuple11(arg_0: \"banana\", ...arg_1: BananaInfo[], arg_2: number): void", + "parameters": [ + { + "label": "arg_0: \"banana\"" + }, + { + "label": "...arg_1: BananaInfo[]" + }, + { + "label": "arg_2: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 1964, + "LSPosition": { + "line": 61, + "character": 10 + }, + "Name": "27", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "withPair(first: number, named: string): void", + "parameters": [ + { + "label": "first: number" + }, + { + "label": "named: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1982, + "LSPosition": { + "line": 62, + "character": 15 + }, + "Name": "28", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "withPair(first: number, named: string): void", + "parameters": [ + { + "label": "first: number" + }, + { + "label": "named: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpIteratorNext.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpIteratorNext.baseline new file mode 100644 index 0000000000..eda29800b5 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpIteratorNext.baseline @@ -0,0 +1,287 @@ +// === SignatureHelp === +=== /signatureHelpIteratorNext.ts === +// declare const iterator: Iterator; +// +// iterator.next(); +// ^ +// | ---------------------------------------------------------------------- +// | next(): IteratorResult +// | ---------------------------------------------------------------------- +// iterator.next( 0); +// ^ +// | ---------------------------------------------------------------------- +// | next(**value: number**): IteratorResult +// | ---------------------------------------------------------------------- +// +// declare const generator: Generator; +// +// generator.next(); +// ^ +// | ---------------------------------------------------------------------- +// | next(): IteratorResult +// | ---------------------------------------------------------------------- +// generator.next( 0); +// ^ +// | ---------------------------------------------------------------------- +// | next(**value: number**): IteratorResult +// | ---------------------------------------------------------------------- +// +// declare const asyncIterator: AsyncIterator; +// +// asyncIterator.next(); +// ^ +// | ---------------------------------------------------------------------- +// | next(): Promise> +// | ---------------------------------------------------------------------- +// asyncIterator.next( 0); +// ^ +// | ---------------------------------------------------------------------- +// | next(**value: number**): Promise> +// | ---------------------------------------------------------------------- +// +// declare const asyncGenerator: AsyncGenerator; +// +// asyncGenerator.next(); +// ^ +// | ---------------------------------------------------------------------- +// | next(): Promise> +// | ---------------------------------------------------------------------- +// asyncGenerator.next( 0); +// ^ +// | ---------------------------------------------------------------------- +// | next(**value: number**): Promise> +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 73, + "LSPosition": { + "line": 2, + "character": 15 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): IteratorResult", + "parameters": [] + }, + { + "label": "next(value: number): IteratorResult", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 91, + "LSPosition": { + "line": 3, + "character": 15 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): IteratorResult", + "parameters": [] + }, + { + "label": "next(value: number): IteratorResult", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 173, + "LSPosition": { + "line": 7, + "character": 16 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): IteratorResult", + "parameters": [] + }, + { + "label": "next(value: number): IteratorResult", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 192, + "LSPosition": { + "line": 8, + "character": 16 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): IteratorResult", + "parameters": [] + }, + { + "label": "next(value: number): IteratorResult", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 286, + "LSPosition": { + "line": 12, + "character": 20 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): Promise>", + "parameters": [] + }, + { + "label": "next(value: number): Promise>", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 309, + "LSPosition": { + "line": 13, + "character": 20 + }, + "Name": "6", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): Promise>", + "parameters": [] + }, + { + "label": "next(value: number): Promise>", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 406, + "LSPosition": { + "line": 17, + "character": 21 + }, + "Name": "7", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): Promise>", + "parameters": [] + }, + { + "label": "next(value: number): Promise>", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 430, + "LSPosition": { + "line": 18, + "character": 21 + }, + "Name": "8", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "next(): Promise>", + "parameters": [] + }, + { + "label": "next(value: number): Promise>", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSDocCallbackTag.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSDocCallbackTag.baseline new file mode 100644 index 0000000000..d9d476bfcb --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSDocCallbackTag.baseline @@ -0,0 +1,131 @@ +// === SignatureHelp === +=== /jsdocCallbackTag.js === +// /** +// * @callback FooHandler - A kind of magic +// * @param {string} eventName - So many words +// * @param eventName2 {number | string} - Silence is golden +// * @param eventName3 - Osterreich mos def +// * @return {number} - DIVEKICK +// */ +// /** +// * @type {FooHandler} callback +// */ +// var t; +// +// /** +// * @callback FooHandler2 - What, another one? +// * @param {string=} eventName - it keeps happening +// * @param {string} [eventName2] - i WARNED you dog +// */ +// /** +// * @type {FooHandler2} callback +// */ +// var t2; +// t("!", 12, false); +// ^ +// | ---------------------------------------------------------------------- +// | t(**eventName: string**, eventName2: string | number, eventName3: any): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | t(eventName: string, **eventName2: string | number**, eventName3: any): number +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | t(eventName: string, eventName2: string | number, **eventName3: any**): number +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 480, + "LSPosition": { + "line": 21, + "character": 2 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "t(eventName: string, eventName2: string | number, eventName3: any): number", + "parameters": [ + { + "label": "eventName: string" + }, + { + "label": "eventName2: string | number" + }, + { + "label": "eventName3: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 485, + "LSPosition": { + "line": 21, + "character": 7 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "t(eventName: string, eventName2: string | number, eventName3: any): number", + "parameters": [ + { + "label": "eventName: string" + }, + { + "label": "eventName2: string | number" + }, + { + "label": "eventName3: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 489, + "LSPosition": { + "line": 21, + "character": 11 + }, + "Name": "6", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "t(eventName: string, eventName2: string | number, eventName3: any): number", + "parameters": [ + { + "label": "eventName: string" + }, + { + "label": "eventName2: string | number" + }, + { + "label": "eventName3: any" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSDocTags.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSDocTags.baseline new file mode 100644 index 0000000000..b4af169f8c --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSDocTags.baseline @@ -0,0 +1,166 @@ +// === SignatureHelp === +=== /signatureHelpJSDocTags.ts === +// /** +// * This is class Foo. +// * @mytag comment1 comment2 +// */ +// class Foo { +// /** +// * This is the constructor. +// * @myjsdoctag this is a comment +// */ +// constructor(value: number) {} +// /** +// * method1 documentation +// * @mytag comment1 comment2 +// */ +// static method1() {} +// /** +// * @mytag +// */ +// method2() {} +// /** +// * @mytag comment1 comment2 +// */ +// property1: string; +// /** +// * @mytag1 some comments +// * some more comments about mytag1 +// * @mytag2 +// * here all the comments are on a new line +// * @mytag3 +// * @mytag +// */ +// property2: number; +// /** +// * @returns {number} a value +// */ +// method3(): number { return 3; } +// /** +// * @param {string} foo A value. +// * @returns {number} Another value +// * @mytag +// */ +// method4(foo: string): number { return 3; } +// /** @mytag */ +// method5() {} +// /** method documentation +// * @mytag a JSDoc tag +// */ +// newMethod() {} +// } +// var foo = new Foo(4); +// ^ +// | ---------------------------------------------------------------------- +// | Foo(**value: number**): Foo +// | ---------------------------------------------------------------------- +// Foo.method1(); +// ^ +// | ---------------------------------------------------------------------- +// | method1(): void +// | ---------------------------------------------------------------------- +// foo.method2(); +// ^ +// | ---------------------------------------------------------------------- +// | method2(): void +// | ---------------------------------------------------------------------- +// foo.method3(); +// ^ +// | ---------------------------------------------------------------------- +// | method3(): number +// | ---------------------------------------------------------------------- +// foo.method4(); +// foo.property1; +// foo.property2; +// foo.method5(); +// foo.newMet +[ + { + "marker": { + "Position": 981, + "LSPosition": { + "line": 49, + "character": 18 + }, + "Name": "10", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Foo(value: number): Foo", + "parameters": [ + { + "label": "value: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 997, + "LSPosition": { + "line": 50, + "character": 12 + }, + "Name": "11", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "method1(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1012, + "LSPosition": { + "line": 51, + "character": 12 + }, + "Name": "12", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "method2(): void", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 1027, + "LSPosition": { + "line": 52, + "character": 12 + }, + "Name": "13", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "method3(): number", + "parameters": [] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSMissingPropertyAccess.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSMissingPropertyAccess.baseline new file mode 100644 index 0000000000..3ef7b0bf7a --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpJSMissingPropertyAccess.baseline @@ -0,0 +1,21 @@ +// === SignatureHelp === +=== /test.js === +// foo.filter() +// ^ +// | ---------------------------------------------------------------------- +// | No signaturehelp at /**/. +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 11, + "LSPosition": { + "line": 0, + "character": 11 + }, + "Name": "", + "Data": {} + }, + "item": null + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs1.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs1.baseline new file mode 100644 index 0000000000..4dd6dc8b41 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs1.baseline @@ -0,0 +1,188 @@ +// === SignatureHelp === +=== /signatureHelpRestArgs1.ts === +// function fn(a: number, b: number, c: number) {} +// const a = [1, 2] as const; +// const b = [1] as const; +// +// fn(...a, ); +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, b: number, **c: number**): void +// | ---------------------------------------------------------------------- +// fn(, ...a); +// ^ +// | ---------------------------------------------------------------------- +// | fn(**a: number**, b: number, c: number): void +// | ---------------------------------------------------------------------- +// +// fn(...b, ); +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, **b: number**, c: number): void +// | ---------------------------------------------------------------------- +// fn(, ...b, ); +// ^ +// | ---------------------------------------------------------------------- +// | fn(**a: number**, b: number, c: number): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, b: number, **c: number**): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 109, + "LSPosition": { + "line": 4, + "character": 9 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 115, + "LSPosition": { + "line": 5, + "character": 3 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 134, + "LSPosition": { + "line": 7, + "character": 9 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 140, + "LSPosition": { + "line": 8, + "character": 3 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 148, + "LSPosition": { + "line": 8, + "character": 11 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs2.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs2.baseline new file mode 100644 index 0000000000..42f95f62b8 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs2.baseline @@ -0,0 +1,28 @@ +// === SignatureHelp === +=== /index.js === +// const promisify = function (thisArg, fnName) { +// const fn = thisArg[fnName]; +// return function () { +// return new Promise((resolve) => { +// fn.call(thisArg, ...arguments, ); +// ^ +// | ---------------------------------------------------------------------- +// | No signaturehelp at /*1*/. +// | ---------------------------------------------------------------------- +// }); +// }; +// }; +[ + { + "marker": { + "Position": 189, + "LSPosition": { + "line": 4, + "character": 43 + }, + "Name": "1", + "Data": {} + }, + "item": null + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs3.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs3.baseline new file mode 100644 index 0000000000..4da40c046b --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpRestArgs3.baseline @@ -0,0 +1,79 @@ +// === SignatureHelp === +=== /signatureHelpRestArgs3.ts === +// const layers = Object.assign({}, ...[]); +// ^ +// | ---------------------------------------------------------------------- +// | assign(target: object, **...sources: any[]**): any +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 33, + "LSPosition": { + "line": 0, + "character": 33 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "assign(target: T, source: U): T & U", + "parameters": [ + { + "label": "target: T" + }, + { + "label": "source: U" + } + ] + }, + { + "label": "assign(target: T, source1: U, source2: V): T & U & V", + "parameters": [ + { + "label": "target: T" + }, + { + "label": "source1: U" + }, + { + "label": "source2: V" + } + ] + }, + { + "label": "assign(target: T, source1: U, source2: V, source3: W): T & U & V & W", + "parameters": [ + { + "label": "target: T" + }, + { + "label": "source1: U" + }, + { + "label": "source2: V" + }, + { + "label": "source3: W" + } + ] + }, + { + "label": "assign(target: object, ...sources: any[]): any", + "parameters": [ + { + "label": "target: object" + }, + { + "label": "...sources: any[]" + } + ] + } + ], + "activeSignature": 3, + "activeParameter": 1 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpSkippedArgs1.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpSkippedArgs1.baseline new file mode 100644 index 0000000000..72b1c36645 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpSkippedArgs1.baseline @@ -0,0 +1,181 @@ +// === SignatureHelp === +=== /signatureHelpSkippedArgs1.ts === +// function fn(a: number, b: number, c: number) {} +// fn(, , , , ); +// ^ +// | ---------------------------------------------------------------------- +// | fn(**a: number**, b: number, c: number): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, **b: number**, c: number): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, b: number, **c: number**): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, b: number, c: number): void +// | ---------------------------------------------------------------------- +// ^ +// | ---------------------------------------------------------------------- +// | fn(a: number, b: number, c: number): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 51, + "LSPosition": { + "line": 1, + "character": 3 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 53, + "LSPosition": { + "line": 1, + "character": 5 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 55, + "LSPosition": { + "line": 1, + "character": 7 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 57, + "LSPosition": { + "line": 1, + "character": 9 + }, + "Name": "4", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 3 + } + }, + { + "marker": { + "Position": 59, + "LSPosition": { + "line": 1, + "character": 11 + }, + "Name": "5", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "fn(a: number, b: number, c: number): void", + "parameters": [ + { + "label": "a: number" + }, + { + "label": "b: number" + }, + { + "label": "c: number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 4 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpTypeArguments2.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpTypeArguments2.baseline new file mode 100644 index 0000000000..b18da8a20e --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpTypeArguments2.baseline @@ -0,0 +1,168 @@ +// === SignatureHelp === +=== /signatureHelpTypeArguments2.ts === +// /** some documentation +// * @template T some documentation 2 +// * @template W +// * @template U,V others +// * @param a ok +// * @param b not ok +// */ +// function f(a: number, b: string, c: boolean): void { } +// f<; +// ^ +// | ---------------------------------------------------------------------- +// | f<**T**, U, V, W>(a: number, b: string, c: boolean): void +// | ---------------------------------------------------------------------- +// f(a: number, b: string, c: boolean): void +// | ---------------------------------------------------------------------- +// f(a: number, b: string, c: boolean): void +// | ---------------------------------------------------------------------- +// f(a: number, b: string, c: boolean): void +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 205, + "LSPosition": { + "line": 8, + "character": 2 + }, + "Name": "f0", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: number, b: string, c: boolean): void", + "parameters": [ + { + "label": "T" + }, + { + "label": "U" + }, + { + "label": "V" + }, + { + "label": "W" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 217, + "LSPosition": { + "line": 9, + "character": 10 + }, + "Name": "f1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: number, b: string, c: boolean): void", + "parameters": [ + { + "label": "T" + }, + { + "label": "U" + }, + { + "label": "V" + }, + { + "label": "W" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 237, + "LSPosition": { + "line": 10, + "character": 18 + }, + "Name": "f2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: number, b: string, c: boolean): void", + "parameters": [ + { + "label": "T" + }, + { + "label": "U" + }, + { + "label": "V" + }, + { + "label": "W" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 2 + } + }, + { + "marker": { + "Position": 266, + "LSPosition": { + "line": 11, + "character": 27 + }, + "Name": "f3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: number, b: string, c: boolean): void", + "parameters": [ + { + "label": "T" + }, + { + "label": "U" + }, + { + "label": "V" + }, + { + "label": "W" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 3 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpWithUnknown.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpWithUnknown.baseline new file mode 100644 index 0000000000..b0c6b6254b --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelpWithUnknown.baseline @@ -0,0 +1,34 @@ +// === SignatureHelp === +=== /signatureHelpWithUnknown.ts === +// eval(\ +// ^ +// | ---------------------------------------------------------------------- +// | eval(**x: string**): any +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 6, + "LSPosition": { + "line": 0, + "character": 6 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "eval(x: string): any", + "parameters": [ + { + "label": "x: string" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelp_unionType.baseline b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelp_unionType.baseline new file mode 100644 index 0000000000..dfd2d40524 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/SignatureHelp_unionType.baseline @@ -0,0 +1,107 @@ +// === SignatureHelp === +=== /signatureHelp_unionType.ts === +// declare const a: (fn?: ((x: string) => string) | ((y: number) => number)) => void; +// declare const b: (x: string | number) => void; +// +// interface Callback { +// (x: string): string; +// (x: number): number; +// (x: string | number): string | number; +// } +// declare function c(callback: Callback): void; +// a(() => { +// ^ +// | ---------------------------------------------------------------------- +// | a(**fn?: ((x: string) => string) | ((y: number) => number)**): void +// | ---------------------------------------------------------------------- +// return undefined; +// }); +// +// b(); +// ^ +// | ---------------------------------------------------------------------- +// | b(**x: string | number**): void +// | ---------------------------------------------------------------------- +// +// c(() => {}); +// ^ +// | ---------------------------------------------------------------------- +// | Callback(**x: string | number**): string | number +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 296, + "LSPosition": { + "line": 9, + "character": 3 + }, + "Name": "1", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "a(fn?: ((x: string) => string) | ((y: number) => number)): void", + "parameters": [ + { + "label": "fn?: ((x: string) => string) | ((y: number) => number)" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 332, + "LSPosition": { + "line": 13, + "character": 2 + }, + "Name": "2", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "b(x: string | number): void", + "parameters": [ + { + "label": "x: string | number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + }, + { + "marker": { + "Position": 339, + "LSPosition": { + "line": 15, + "character": 3 + }, + "Name": "3", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "Callback(x: string | number): string | number", + "parameters": [ + { + "label": "x: string | number" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 0 + } + } +] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/signatureHelp/TrailingCommaSignatureHelp.baseline b/testdata/baselines/reference/fourslash/signatureHelp/TrailingCommaSignatureHelp.baseline new file mode 100644 index 0000000000..3de5364af9 --- /dev/null +++ b/testdata/baselines/reference/fourslash/signatureHelp/TrailingCommaSignatureHelp.baseline @@ -0,0 +1,85 @@ +// === SignatureHelp === +=== /trailingCommaSignatureHelp.ts === +// function str(n: number): string; +// /** +// * Stringifies a number with radix +// * @param radix The radix +// */ +// function str(n: number, radix: number): string; +// function str(n: number, radix?: number): string { return ""; } +// +// str(1, ) +// ^ +// | ---------------------------------------------------------------------- +// | str(n: number, **radix: number**): string +// | ---------------------------------------------------------------------- +// +// declare function f(a: T): T; +// f(2, ); +// ^ +// | ---------------------------------------------------------------------- +// | f(a: 2): 2 +// | ---------------------------------------------------------------------- +[ + { + "marker": { + "Position": 221, + "LSPosition": { + "line": 8, + "character": 7 + }, + "Name": "a", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "str(n: number): string", + "parameters": [ + { + "label": "n: number" + } + ] + }, + { + "label": "str(n: number, radix: number): string", + "parameters": [ + { + "label": "n: number" + }, + { + "label": "radix: number" + } + ] + } + ], + "activeSignature": 1, + "activeParameter": 1 + } + }, + { + "marker": { + "Position": 261, + "LSPosition": { + "line": 11, + "character": 5 + }, + "Name": "b", + "Data": {} + }, + "item": { + "signatures": [ + { + "label": "f(a: 2): 2", + "parameters": [ + { + "label": "a: 2" + } + ] + } + ], + "activeSignature": 0, + "activeParameter": 1 + } + } +] \ No newline at end of file