TypeScript/tests/cases/fourslash/commentsOverloads.ts
Jean Pierre 79dcd3dba1 Correctly resolve tags for function overloads (#30253)
* Correctly resolve tags for function overloads. Fixes #30181

* Better fix for #30181. Added more unit tests

* Fix commentsOverloads tests

* Fallback to first signature when doc and tags are empty
2020-01-10 08:54:26 -08:00

520 lines
22 KiB
TypeScript

/// <reference path='fourslash.ts' />
/////** this is signature 1*/
////function /*1*/f1(/**param a*/a: number): number;
////function /*2*/f1(b: string): number;
////function /*3*/f1(aOrb: any) {
//// return 10;
////}
////f/*4q*/1(/*4*/"hello");
////f/*o4q*/1(/*o4*/10);
////function /*5*/f2(/**param a*/a: number): number;
/////** this is signature 2*/
////function /*6*/f2(b: string): number;
/////** this is f2 var comment*/
////function /*7*/f2(aOrb: any) {
//// return 10;
////}
////f/*8q*/2(/*8*/"hello");
////f/*o8q*/2(/*o8*/10);
////function /*9*/f3(a: number): number;
////function /*10*/f3(b: string): number;
////function /*11*/f3(aOrb: any) {
//// return 10;
////}
////f/*12q*/3(/*12*/"hello");
////f/*o12q*/3(/*o12*/10);
/////** this is signature 4 - with number parameter*/
////function /*13*/f4(/**param a*/a: number): number;
/////** this is signature 4 - with string parameter*/
////function /*14*/f4(b: string): number;
////function /*15*/f4(aOrb: any) {
//// return 10;
////}
////f/*16q*/4(/*16*/"hello");
////f/*o16q*/4(/*o16*/10);
/////*17*/
////interface i1 {
//// /**this signature 1*/
//// (/**param a*/ a: number): number;
//// /**this is signature 2*/
//// (b: string): number;
//// /** foo 1*/
//// foo(a: number): number;
//// /** foo 2*/
//// foo(b: string): number;
//// foo2(a: number): number;
//// /** foo2 2*/
//// foo2(b: string): number;
//// foo3(a: number): number;
//// foo3(b: string): number;
//// /** foo4 1*/
//// foo4(a: number): number;
//// foo4(b: string): number;
//// /** new 1*/
//// new (a: string);
//// new (b: number);
////}
////var i1_i: i1;
////interface i2 {
//// new (a: string);
//// /** new 2*/
//// new (b: number);
//// (a: number): number;
//// /**this is signature 2*/
//// (b: string): number;
////}
////var i2_i: i2;
////interface i3 {
//// /** new 1*/
//// new (a: string);
//// /** new 2*/
//// new (b: number);
//// /**this is signature 1*/
//// (a: number): number;
//// (b: string): number;
////}
////var i3_i: i3;
////interface i4 {
//// new (a: string);
//// new (b: number);
//// (a: number): number;
//// (b: string): number;
////}
////var i4_i: i4;
////new /*18*/i1/*19q*/_i(/*19*/10);
////new i/*20q*/1_i(/*20*/"Hello");
////i/*21q*/1_i(/*21*/10);
////i/*22q*/1_i(/*22*/"hello");
////i1_i./*23*/f/*24q*/oo(/*24*/10);
////i1_i.f/*25q*/oo(/*25*/"hello");
////i1_i.fo/*26q*/o2(/*26*/10);
////i1_i.fo/*27q*/o2(/*27*/"hello");
////i1_i.fo/*28q*/o3(/*28*/10);
////i1_i.fo/*29q*/o3(/*29*/"hello");
////i1_i.fo/*30q*/o4(/*30*/10);
////i1_i.fo/*31q*/o4(/*31*/"hello");
////new i2/*32q*/_i(/*32*/10);
////new i2/*33q*/_i(/*33*/"Hello");
////i/*34q*/2_i(/*34*/10);
////i2/*35q*/_i(/*35*/"hello");
////new i/*36q*/3_i(/*36*/10);
////new i3/*37q*/_i(/*37*/"Hello");
////i3/*38q*/_i(/*38*/10);
////i3/*39q*/_i(/*39*/"hello");
////new i4/*40q*/_i(/*40*/10);
////new i/*41q*/4_i(/*41*/"Hello");
////i4/*42q*/_i(/*42*/10);
////i4/*43q*/_i(/*43*/"hello");
////class c {
//// public /*93*/prop1(a: number): number;
//// public /*94*/prop1(b: string): number;
//// public /*95*/prop1(aorb: any) {
//// return 10;
//// }
//// /** prop2 1*/
//// public /*96*/prop2(a: number): number;
//// public /*97*/prop2(b: string): number;
//// public /*98*/prop2(aorb: any) {
//// return 10;
//// }
//// public /*99*/prop3(a: number): number;
//// /** prop3 2*/
//// public /*100*/prop3(b: string): number;
//// public /*101*/prop3(aorb: any) {
//// return 10;
//// }
//// /** prop4 1*/
//// public /*102*/prop4(a: number): number;
//// /** prop4 2*/
//// public /*103*/prop4(b: string): number;
//// public /*104*/prop4(aorb: any) {
//// return 10;
//// }
//// /** prop5 1*/
//// public /*105*/prop5(a: number): number;
//// /** prop5 2*/
//// public /*106*/prop5(b: string): number;
//// /** Prop5 implementaion*/
//// public /*107*/prop5(aorb: any) {
//// return 10;
//// }
////}
////class c1 {
//// /*78*/constructor(a: number);
//// /*79*/constructor(b: string);
//// /*80*/constructor(aorb: any) {
//// }
////}
////class c2 {
//// /** c2 1*/
//// /*81*/constructor(a: number);
//// /*82*/constructor(b: string);
//// /*83*/constructor(aorb: any) {
//// }
////}
////class c3 {
//// /*84*/constructor(a: number);
//// /** c3 2*/
//// /*85*/constructor(b: string);
//// /*86*/constructor(aorb: any) {
//// }
////}
////class c4 {
//// /** c4 1*/
//// /*87*/constructor(a: number);
//// /** c4 2*/
//// /*88*/constructor(b: string);
//// /*89*/constructor(aorb: any) {
//// }
////}
////class c5 {
//// /** c5 1*/
//// /*90*/constructor(a: number);
//// /** c5 2*/
//// /*91*/constructor(b: string);
//// /** c5 implementation*/
//// /*92*/constructor(aorb: any) {
//// }
////}
////var c_i = new c();
////c_i./*44*/pro/*45q*/p1(/*45*/10);
////c_i.pr/*46q*/op1(/*46*/"hello");
////c_i.pr/*47q*/op2(/*47*/10);
////c_i.pr/*48q*/op2(/*48*/"hello");
////c_i.pro/*49q*/p3(/*49*/10);
////c_i.pr/*50q*/op3(/*50*/"hello");
////c_i.pr/*51q*/op4(/*51*/10);
////c_i.pr/*52q*/op4(/*52*/"hello");
////c_i.pr/*53q*/op5(/*53*/10);
////c_i.pr/*54q*/op5(/*54*/"hello");
////var c1/*66*/_i_1 = new c/*55q*/1(/*55*/10);
////var c1_i_2 = new c/*56q*/1(/*56*/"hello");
////var c2_i_1 = new c/*57q*/2(/*57*/10);
////var c/*67*/2_i_2 = new c/*58q*/2(/*58*/"hello");
////var c3_i_1 = new c/*59q*/3(/*59*/10);
////var c/*68*/3_i_2 = new c/*60q*/3(/*60*/"hello");
////var c4/*69*/_i_1 = new c/*61q*/4(/*61*/10);
////var c4_i_2 = new c/*62q*/4(/*62*/"hello");
////var c/*70*/5_i_1 = new c/*63q*/5(/*63*/10);
////var c5_i_2 = new c/*64q*/5(/*64*/"hello");
/////** This is multiOverload F1 1*/
////function multiOverload(a: number): string;
/////** This is multiOverload F1 2*/
////function multiOverload(b: string): string;
/////** This is multiOverload F1 3*/
////function multiOverload(c: boolean): string;
/////** This is multiOverload Implementation */
////function multiOverload(d): string {
//// return "Hello";
////}
////multiOverl/*71*/oad(10);
////multiOverl/*72*/oad("hello");
////multiOverl/*73*/oad(true);
/////** This is ambient F1 1*/
////declare function ambientF1(a: number): string;
/////** This is ambient F1 2*/
////declare function ambientF1(b: string): string;
/////** This is ambient F1 3*/
////declare function ambientF1(c: boolean): boolean;
/////*65*/
////ambient/*74*/F1(10);
////ambient/*75*/F1("hello");
////ambient/*76*/F1(true);
////function foo(a/*77*/a: i3) {
////}
////foo(null);
verify.quickInfos({
1: ["function f1(a: number): number (+1 overload)", "this is signature 1"],
2: ["function f1(b: string): number (+1 overload)", "this is signature 1"],
3: ["function f1(a: number): number (+1 overload)", "this is signature 1"],
"4q": ["function f1(b: string): number (+1 overload)", "this is signature 1"],
o4q: ["function f1(a: number): number (+1 overload)", "this is signature 1"]
});
verify.signatureHelp({ marker: "4", overloadsCount: 2 });
verify.signatureHelp({ marker: "o4", overloadsCount: 2, docComment: "this is signature 1", parameterDocComment: "param a" });
verify.quickInfos({
5: "function f2(a: number): number (+1 overload)",
6: ["function f2(b: string): number (+1 overload)", "this is signature 2"],
7: "function f2(a: number): number (+1 overload)",
"8q": ["function f2(b: string): number (+1 overload)", "this is signature 2"],
o8q: "function f2(a: number): number (+1 overload)",
});
verify.signatureHelp(
{ marker: "8", overloadsCount: 2, docComment: "this is signature 2" },
{ marker: "o8", overloadsCount: 2, parameterDocComment: "param a" },
);
verify.quickInfos({
9: "function f3(a: number): number (+1 overload)",
10: "function f3(b: string): number (+1 overload)",
11: "function f3(a: number): number (+1 overload)",
"12q": "function f3(b: string): number (+1 overload)",
o12q: "function f3(a: number): number (+1 overload)"
});
verify.signatureHelp({ marker: ["12", "o12"], overloadsCount: 2 });
verify.quickInfos({
13: ["function f4(a: number): number (+1 overload)", "this is signature 4 - with number parameter"],
14: ["function f4(b: string): number (+1 overload)", "this is signature 4 - with string parameter"],
15: ["function f4(a: number): number (+1 overload)", "this is signature 4 - with number parameter"],
"16q": ["function f4(b: string): number (+1 overload)", "this is signature 4 - with string parameter"],
o16q: ["function f4(a: number): number (+1 overload)", "this is signature 4 - with number parameter"]
});
verify.signatureHelp(
{ marker: "16", overloadsCount: 2, docComment: "this is signature 4 - with string parameter" },
{ marker: "o16", overloadsCount: 2, docComment: "this is signature 4 - with number parameter", parameterDocComment: "param a" },
);
verify.completions(
{
marker: "17",
includes: [
{ name: "f1", text: "function f1(a: number): number (+1 overload)", documentation: "this is signature 1" },
{ name: "f2", text: "function f2(a: number): number (+1 overload)" },
{ name: "f3", text: "function f3(a: number): number (+1 overload)" },
{ name: "f4", text: "function f4(a: number): number (+1 overload)", documentation: "this is signature 4 - with number parameter" },
],
},
{
marker: "18",
includes: [
{ name: "i1_i", text: "var i1_i: i1\nnew (b: number) => any (+1 overload)", documentation: "new 1" },
{ name: "i2_i", text: "var i2_i: i2\nnew (a: string) => any (+1 overload)" },
{ name: "i3_i", text: "var i3_i: i3\nnew (a: string) => any (+1 overload)", documentation: "new 1" },
{ name: "i4_i", text: "var i4_i: i4\nnew (a: string) => any (+1 overload)" },
],
excludes: ["i1", "i2", "i3", "i4"],
},
);
verify.signatureHelp({ marker: "19", overloadsCount: 2 });
verify.quickInfoAt("19q", "var i1_i: i1\nnew (b: number) => any (+1 overload)", "new 1");
verify.signatureHelp({ marker: "20", overloadsCount: 2, docComment: "new 1" });
verify.quickInfoAt("20q", "var i1_i: i1\nnew (a: string) => any (+1 overload)", "new 1");
verify.signatureHelp({ marker: "21", overloadsCount: 2, docComment: "this signature 1", parameterDocComment: "param a" });
verify.quickInfoAt("21q", "var i1_i: i1\n(a: number) => number (+1 overload)", "this signature 1");
verify.signatureHelp({ marker: "22", overloadsCount: 2, docComment: "this is signature 2" });
goTo.marker('22q');
verify.quickInfoAt("22q", "var i1_i: i1\n(b: string) => number (+1 overload)", "this is signature 2");
verify.completions({
marker: "23",
includes: [
{ name: "foo" , text: "(method) i1.foo(a: number): number (+1 overload)", documentation: "foo 1" },
{ name: "foo2", text: "(method) i1.foo2(a: number): number (+1 overload)" },
{ name: "foo3", text: "(method) i1.foo3(a: number): number (+1 overload)" },
{ name: "foo4", text: "(method) i1.foo4(a: number): number (+1 overload)", documentation: "foo4 1" },
],
});
verify.signatureHelp({ marker: "24", overloadsCount: 2, docComment: "foo 1" });
verify.quickInfoAt("24q", "(method) i1.foo(a: number): number (+1 overload)", "foo 1");
verify.signatureHelp({ marker: "25", overloadsCount: 2, docComment: "foo 2" });
verify.quickInfoAt("25q", "(method) i1.foo(b: string): number (+1 overload)", "foo 2");
verify.signatureHelp({ marker: "26", overloadsCount: 2 });
verify.quickInfoAt("26q", "(method) i1.foo2(a: number): number (+1 overload)");
verify.signatureHelp({ marker: "27", overloadsCount: 2, docComment: "foo2 2" });
verify.quickInfoAt("27q", "(method) i1.foo2(b: string): number (+1 overload)", "foo2 2");
verify.signatureHelp({ marker: "28", overloadsCount: 2 });
verify.quickInfoAt("28q", "(method) i1.foo3(a: number): number (+1 overload)");
verify.signatureHelp({ marker: "29", overloadsCount: 2 });
verify.quickInfoAt("29q", "(method) i1.foo3(b: string): number (+1 overload)");
verify.signatureHelp({ marker: "30", overloadsCount: 2, docComment: "foo4 1" });
verify.quickInfoAt("30q", "(method) i1.foo4(a: number): number (+1 overload)", "foo4 1");
verify.signatureHelp({ marker: "31", overloadsCount: 2 });
verify.quickInfoAt("31q", "(method) i1.foo4(b: string): number (+1 overload)", "foo4 1");
verify.signatureHelp({ marker: "32", overloadsCount: 2, docComment: "new 2" });
verify.quickInfoAt("32q", "var i2_i: i2\nnew (b: number) => any (+1 overload)", "new 2");
verify.signatureHelp({ marker: "33", overloadsCount: 2 });
verify.quickInfoAt("33q", "var i2_i: i2\nnew (a: string) => any (+1 overload)");
verify.signatureHelp({ marker: "34", overloadsCount: 2 });
verify.quickInfoAt("34q", "var i2_i: i2\n(a: number) => number (+1 overload)");
verify.signatureHelp({ marker: "35", overloadsCount: 2, docComment: "this is signature 2" });
verify.quickInfoAt("35q", "var i2_i: i2\n(b: string) => number (+1 overload)", "this is signature 2");
verify.signatureHelp({ marker: "36", overloadsCount: 2, docComment: "new 2" });
verify.quickInfoAt("36q", "var i3_i: i3\nnew (b: number) => any (+1 overload)", "new 2");
verify.signatureHelp({ marker: "37", overloadsCount: 2, docComment: "new 1" });
verify.quickInfoAt("37q", "var i3_i: i3\nnew (a: string) => any (+1 overload)", "new 1");
verify.signatureHelp({ marker: "38", overloadsCount: 2, docComment: "this is signature 1" });
verify.quickInfoAt("38q", "var i3_i: i3\n(a: number) => number (+1 overload)", "this is signature 1");
verify.signatureHelp({ marker: "39", overloadsCount: 2 });
verify.quickInfoAt("39q", "var i3_i: i3\n(b: string) => number (+1 overload)", "this is signature 1");
verify.signatureHelp({ marker: "40", overloadsCount: 2 });
verify.quickInfoAt("40q", "var i4_i: i4\nnew (b: number) => any (+1 overload)");
verify.signatureHelp({ marker: "41", overloadsCount: 2 });
verify.quickInfoAt("41q", "var i4_i: i4\nnew (a: string) => any (+1 overload)");
verify.signatureHelp({ marker: "42", overloadsCount: 2 });
verify.quickInfoAt("42q", "var i4_i: i4\n(a: number) => number (+1 overload)");
verify.signatureHelp({ marker: "43", overloadsCount: 2 });
verify.quickInfoAt("43q", "var i4_i: i4\n(b: string) => number (+1 overload)");
verify.completions({
marker: "44",
exact: [
{ name: "prop1", text: "(method) c.prop1(a: number): number (+1 overload)" },
{ name: "prop2", text: "(method) c.prop2(a: number): number (+1 overload)", documentation: "prop2 1" },
{ name: "prop3", text: "(method) c.prop3(a: number): number (+1 overload)" },
{ name: "prop4", text: "(method) c.prop4(a: number): number (+1 overload)", documentation: "prop4 1" },
{ name: "prop5", text: "(method) c.prop5(a: number): number (+1 overload)", documentation: "prop5 1" },
],
});
verify.signatureHelp({ marker: "45", overloadsCount: 2 });
verify.quickInfoAt("45q", "(method) c.prop1(a: number): number (+1 overload)");
verify.signatureHelp({ marker: "46", overloadsCount: 2 });
verify.quickInfoAt("46q", "(method) c.prop1(b: string): number (+1 overload)");
verify.signatureHelp({ marker: "47", overloadsCount: 2, docComment: "prop2 1" });
verify.quickInfoAt("47q", "(method) c.prop2(a: number): number (+1 overload)", "prop2 1");
verify.signatureHelp({ marker: "48", overloadsCount: 2 });
verify.quickInfoAt("48q", "(method) c.prop2(b: string): number (+1 overload)", "prop2 1");
verify.signatureHelp({ marker: "49", overloadsCount: 2 });
verify.quickInfoAt("49q", "(method) c.prop3(a: number): number (+1 overload)");
verify.signatureHelp({ marker: "50", overloadsCount: 2, docComment: "prop3 2" });
verify.quickInfoAt("50q", "(method) c.prop3(b: string): number (+1 overload)", "prop3 2");
verify.signatureHelp({ marker: "51", overloadsCount: 2, docComment: "prop4 1" });
verify.quickInfoAt("51q", "(method) c.prop4(a: number): number (+1 overload)", "prop4 1");
verify.signatureHelp({ marker: "52", overloadsCount: 2, docComment: "prop4 2" });
verify.quickInfoAt("52q", "(method) c.prop4(b: string): number (+1 overload)", "prop4 2");
verify.signatureHelp({ marker: "53", overloadsCount: 2, docComment: "prop5 1" });
verify.quickInfoAt("53q", "(method) c.prop5(a: number): number (+1 overload)", "prop5 1");
verify.signatureHelp({ marker: "54", overloadsCount: 2, docComment: "prop5 2" });
verify.quickInfoAt("54q", "(method) c.prop5(b: string): number (+1 overload)", "prop5 2");
verify.signatureHelp({ marker: "55", overloadsCount: 2 });
verify.quickInfoAt("55q", "constructor c1(a: number): c1 (+1 overload)");
verify.signatureHelp({ marker: "56", overloadsCount: 2 });
verify.quickInfoAt("56q", "constructor c1(b: string): c1 (+1 overload)");
verify.signatureHelp({ marker: "57", overloadsCount: 2, docComment: "c2 1" });
verify.quickInfoAt("57q", "constructor c2(a: number): c2 (+1 overload)", "c2 1");
verify.signatureHelp({ marker: "58", overloadsCount: 2 });
verify.quickInfoAt("58q", "constructor c2(b: string): c2 (+1 overload)", "c2 1");
verify.signatureHelp({ marker: "59", overloadsCount: 2 });
verify.quickInfoAt("59q", "constructor c3(a: number): c3 (+1 overload)");
verify.signatureHelp({ marker: "60", overloadsCount: 2, docComment: "c3 2" });
verify.quickInfoAt("60q", "constructor c3(b: string): c3 (+1 overload)", "c3 2");
verify.signatureHelp({ marker: "61", overloadsCount: 2, docComment: "c4 1" });
verify.quickInfoAt("61q", "constructor c4(a: number): c4 (+1 overload)", "c4 1");
verify.signatureHelp({ marker: "62", overloadsCount: 2, docComment: "c4 2" });
verify.quickInfoAt("62q", "constructor c4(b: string): c4 (+1 overload)", "c4 2");
verify.signatureHelp({ marker: "63", overloadsCount: 2, docComment: "c5 1" });
verify.quickInfoAt("63q", "constructor c5(a: number): c5 (+1 overload)", "c5 1");
verify.signatureHelp({ marker: "64", overloadsCount: 2, docComment: "c5 2" });
verify.quickInfoAt("64q", "constructor c5(b: string): c5 (+1 overload)", "c5 2");
verify.completions({
marker: "65",
includes: [
{ name: "c", text: "class c" },
{ name: "c1", text: "class c1" },
{ name: "c2", text: "class c2" },
{ name: "c3", text: "class c3" },
{ name: "c4", text: "class c4" },
{ name: "c5", text: "class c5" },
{ name: "c_i", text: "var c_i: c" },
{ name: "c1_i_1", text: "var c1_i_1: c1" },
{ name: "c2_i_1", text: "var c2_i_1: c2" },
{ name: "c3_i_1", text: "var c3_i_1: c3" },
{ name: "c4_i_1", text: "var c4_i_1: c4" },
{ name: "c5_i_1", text: "var c5_i_1: c5" },
{ name: "c1_i_2", text: "var c1_i_2: c1" },
{ name: "c2_i_2", text: "var c2_i_2: c2" },
{ name: "c3_i_2", text: "var c3_i_2: c3" },
{ name: "c4_i_2", text: "var c4_i_2: c4" },
{ name: "c5_i_2", text: "var c5_i_2: c5" },
{ name: "multiOverload", text: "function multiOverload(a: number): string (+2 overloads)", documentation: "This is multiOverload F1 1" },
{ name: "ambientF1", text: "function ambientF1(a: number): string (+2 overloads)", documentation: "This is ambient F1 1" },
],
});
verify.quickInfos({
66: "var c1_i_1: c1",
67: "var c2_i_2: c2",
68: "var c3_i_2: c3",
69: "var c4_i_1: c4",
70: "var c5_i_1: c5",
71: ["function multiOverload(a: number): string (+2 overloads)", "This is multiOverload F1 1"],
72: ["function multiOverload(b: string): string (+2 overloads)", "This is multiOverload F1 2"],
73: ["function multiOverload(c: boolean): string (+2 overloads)", "This is multiOverload F1 3"],
74: ["function ambientF1(a: number): string (+2 overloads)", "This is ambient F1 1"],
75: ["function ambientF1(b: string): string (+2 overloads)", "This is ambient F1 2"],
76: ["function ambientF1(c: boolean): boolean (+2 overloads)", "This is ambient F1 3"],
77: "(parameter) aa: i3",
78: "constructor c1(a: number): c1 (+1 overload)",
79: "constructor c1(b: string): c1 (+1 overload)",
80: "constructor c1(a: number): c1 (+1 overload)",
81: ["constructor c2(a: number): c2 (+1 overload)", "c2 1"],
82: ["constructor c2(b: string): c2 (+1 overload)", "c2 1"],
83: ["constructor c2(a: number): c2 (+1 overload)", "c2 1"],
84: "constructor c3(a: number): c3 (+1 overload)",
85: ["constructor c3(b: string): c3 (+1 overload)", "c3 2"],
86: "constructor c3(a: number): c3 (+1 overload)",
87: ["constructor c4(a: number): c4 (+1 overload)", "c4 1"],
88: ["constructor c4(b: string): c4 (+1 overload)", "c4 2"],
89: ["constructor c4(a: number): c4 (+1 overload)", "c4 1"],
90: ["constructor c5(a: number): c5 (+1 overload)", "c5 1"],
91: ["constructor c5(b: string): c5 (+1 overload)", "c5 2"],
92: ["constructor c5(a: number): c5 (+1 overload)", "c5 1"],
93: "(method) c.prop1(a: number): number (+1 overload)",
94: "(method) c.prop1(b: string): number (+1 overload)",
95: "(method) c.prop1(a: number): number (+1 overload)",
96: ["(method) c.prop2(a: number): number (+1 overload)", "prop2 1"],
97: ["(method) c.prop2(b: string): number (+1 overload)", "prop2 1"],
98: ["(method) c.prop2(a: number): number (+1 overload)", "prop2 1"],
99: "(method) c.prop3(a: number): number (+1 overload)",
100: ["(method) c.prop3(b: string): number (+1 overload)", "prop3 2"],
101: "(method) c.prop3(a: number): number (+1 overload)",
102: ["(method) c.prop4(a: number): number (+1 overload)", "prop4 1"],
103: ["(method) c.prop4(b: string): number (+1 overload)", "prop4 2"],
104: ["(method) c.prop4(a: number): number (+1 overload)", "prop4 1"],
105: ["(method) c.prop5(a: number): number (+1 overload)", "prop5 1"],
106: ["(method) c.prop5(b: string): number (+1 overload)", "prop5 2"],
107: ["(method) c.prop5(a: number): number (+1 overload)", "prop5 1"]
});