Skip to content

Commit c75f6d0

Browse files
author
Andy Hanson
committed
Add multiple overloads for verify.goToDefinition.
Use explicit pairs `verify.goToDefinition([["a", "b"], ["c", "d"]])` instead of `verify.goToDefinition("a", "b", "c", "d")`. Also provide an option `verify.goToDefinition({ a: "b", c: "d" })` for cases where the starts are not theirselves lists.
1 parent 37f8eac commit c75f6d0

24 files changed

+145
-106
lines changed

src/harness/fourslash.ts

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -529,24 +529,35 @@ namespace FourSlash {
529529
this.verifyGoToDefinitionWorker(endMarker instanceof Array ? endMarker : [endMarker]);
530530
}
531531

532-
public verifyGoToDefinition(startsAndEnds: (string | string[])[]) {
533-
if (startsAndEnds.length % 2) {
534-
throw new Error("verify.goToDefinition needs an even number of arguments.");
532+
public verifyGoToDefinition(arg0: any, endMarkerNames?: string | string[]) {
533+
if (endMarkerNames) {
534+
this.verifyGoToDefinitionPlain(arg0, endMarkerNames);
535535
}
536-
537-
for (let i = 0; i < startsAndEnds.length; i += 2) {
538-
const start = startsAndEnds[i];
539-
const end = startsAndEnds[i + 1];
540-
541-
if (start instanceof Array) {
542-
for (const s of start) {
543-
this.verifyGoToDefinitionSingle(s, end);
536+
else if (arg0 instanceof Array) {
537+
const pairs: [string | string[], string | string[]][] = arg0;
538+
for (const [start, end] of pairs) {
539+
this.verifyGoToDefinitionPlain(start, end);
540+
}
541+
}
542+
else {
543+
const obj: { [startMarkerName: string]: string | string[] } = arg0;
544+
for (const startMarkerName in obj) {
545+
if (ts.hasProperty(obj, startMarkerName)) {
546+
this.verifyGoToDefinitionPlain(startMarkerName, obj[startMarkerName]);
544547
}
545548
}
546-
else {
547-
this.verifyGoToDefinitionSingle(start, end);
549+
}
550+
}
551+
552+
private verifyGoToDefinitionPlain(startMarkerNames: string | string[], endMarkerNames: string | string[]) {
553+
if (startMarkerNames instanceof Array) {
554+
for (const start of startMarkerNames) {
555+
this.verifyGoToDefinitionSingle(start, endMarkerNames);
548556
}
549557
}
558+
else {
559+
this.verifyGoToDefinitionSingle(startMarkerNames, endMarkerNames);
560+
}
550561
}
551562

552563
public verifyGoToDefinitionForMarkers(markerNames: string[]) {
@@ -555,9 +566,9 @@ namespace FourSlash {
555566
}
556567
}
557568

558-
private verifyGoToDefinitionSingle(start: string, end: string | string[]) {
559-
this.goToMarker(start);
560-
this.verifyGoToDefinitionWorker(end instanceof Array ? end : [end]);
569+
private verifyGoToDefinitionSingle(startMarkerName: string, endMarkerNames: string | string[]) {
570+
this.goToMarker(startMarkerName);
571+
this.verifyGoToDefinitionWorker(endMarkerNames instanceof Array ? endMarkerNames : [endMarkerNames]);
561572
}
562573

563574
private verifyGoToDefinitionWorker(endMarkers: string[]) {
@@ -2947,8 +2958,11 @@ namespace FourSlashInterface {
29472958
this.state.verifyGoToDefinitionIs(endMarkers);
29482959
}
29492960

2950-
public goToDefinition(...startsAndEnds: (string | string[])[]) {
2951-
this.state.verifyGoToDefinition(startsAndEnds);
2961+
public goToDefinition(startMarkerName: string | string[], endMarkerName: string | string[]): void;
2962+
public goToDefinition(startsAndEnds: [string | string[], string | string[]][]): void;
2963+
public goToDefinition(startsAndEnds: { [startMarkerName: string]: string | string[] }): void;
2964+
public goToDefinition(arg0: any, endMarkerName?: string | string[]) {
2965+
this.state.verifyGoToDefinition(arg0, endMarkerName);
29522966
}
29532967

29542968
public goToDefinitionForMarkers(...markerNames: string[]) {

tests/cases/fourslash/ambientShorthandGotoDefinition.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,25 @@
1212

1313
goTo.marker("useFoo");
1414
verify.quickInfoIs("import foo");
15-
verify.goToDefinition(
16-
"useFoo", "importFoo",
17-
"importFoo", "module");
15+
verify.goToDefinition({
16+
useFoo: "importFoo",
17+
importFoo: "module"
18+
});
1819

1920
goTo.marker("useBar");
2021
verify.quickInfoIs("import bar");
2122
verify.goToDefinition("useBar", "module");
2223

2324
goTo.marker("useBaz");
2425
verify.quickInfoIs("import baz");
25-
verify.goToDefinition(
26-
"useBaz", "importBaz",
27-
"idBaz", "module");
26+
verify.goToDefinition({
27+
useBaz: "importBaz",
28+
idBaz: "module"
29+
});
2830

2931
goTo.marker("useBang");
3032
verify.quickInfoIs("import bang = require(\"jquery\")");
31-
verify.goToDefinition(
32-
"useBang", "importBang",
33-
"idBang", "module");
33+
verify.goToDefinition({
34+
useBang: "importBang",
35+
idBang: "module"
36+
});

tests/cases/fourslash/fourslash.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,12 @@ declare namespace FourSlashInterface {
156156
* `verify.goToDefinition("a", "b");` verifies that go-to-definition at marker "a" takes you to marker "b".
157157
* `verify.goToDefinition(["a", "aa"], "b");` verifies that markers "a" and "aa" have the same definition "b".
158158
* `verify.goToDefinition("a", ["b", "bb"]);` verifies that "a" has multiple definitions available.
159-
* Finally, `verify.goToDefinition("a", "b", "c", "d");` is just `verify.goToDefinition("a", "b"); verify.goToDefinition("c", "d");`.
160159
*/
161-
goToDefinition(...startsAndEnds: (string | string[])[]): void;
160+
goToDefinition(startMarkerNames: string | string[], endMarkerNames: string | string[]): void;
161+
/** Performs `goToDefinition` for each pair. */
162+
goToDefinition(startsAndEnds: [string | string[], string | string[]][]): void;
163+
/** Performs `goToDefinition` on each key and value. */
164+
goToDefinition(startsAndEnds: { [startMarkerName: string]: string | string[] }): void;
162165
/** Verifies goToDefinition for each `${markerName}Reference` -> `${markerName}Definition` */
163166
goToDefinitionForMarkers(...markerNames: string[]): void;
164167
verifyGetEmitOutputForCurrentFile(expected: string): void;

tests/cases/fourslash/goToDeclarationDecoratorOverloads.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
//// @/*useDecSymbol*/dec [s]() {}
1414
////}
1515

16-
verify.goToDefinition(
17-
"useDecString", "defDecString",
18-
"useDecSymbol", "defDecSymbol");
16+
verify.goToDefinition({
17+
useDecString: "defDecString",
18+
useDecSymbol: "defDecSymbol"
19+
});

tests/cases/fourslash/goToDefinitionAlias.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
//// x;
2424
////}
2525

26-
verify.goToDefinition(
27-
["alias1Type", "alias1Value"], "alias1Definition",
28-
["alias2Type", "alias2Value"], "alias2Definition");
26+
verify.goToDefinition([
27+
[["alias1Type", "alias1Value"], "alias1Definition"],
28+
[["alias2Type", "alias2Value"], "alias2Definition"]
29+
]);

tests/cases/fourslash/goToDefinitionConstructorOverloads.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
////var constructorOverload = new /*constructorOverloadReference1*/ConstructorOverload();
1010
////var constructorOverload = new /*constructorOverloadReference2*/ConstructorOverload("foo");
1111

12-
verify.goToDefinition(
13-
"constructorOverloadReference1", "constructorOverload1",
14-
"constructorOverloadReference2", "constructorOverload2",
15-
"constructorOverload1", "constructorDefinition");
12+
verify.goToDefinition({
13+
constructorOverloadReference1: "constructorOverload1",
14+
constructorOverloadReference2: "constructorOverload2",
15+
constructorOverload1: "constructorDefinition"
16+
});

tests/cases/fourslash/goToDefinitionDecorator.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
//// return target => target;
1717
////}
1818

19-
verify.goToDefinition(
20-
"decoratorUse", "decoratorDefinition",
21-
"decoratorFactoryUse", "decoratorFactoryDefinition");
19+
verify.goToDefinition({
20+
decoratorUse: "decoratorDefinition",
21+
decoratorFactoryUse: "decoratorFactoryDefinition"
22+
});

tests/cases/fourslash/goToDefinitionFunctionOverloads.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
/////*functionOverloadReference2*/functionOverload("123");
99
/////*brokenOverload*/functionOverload({});
1010

11-
verify.goToDefinition(
12-
"functionOverloadReference1", "functionOverload1",
13-
"functionOverloadReference2", "functionOverload2",
14-
"brokenOverload", "functionOverload1",
15-
"functionOverload", "functionOverloadDefinition");
11+
verify.goToDefinition({
12+
functionOverloadReference1: "functionOverload1",
13+
functionOverloadReference2: "functionOverload2",
14+
brokenOverload: "functionOverload1",
15+
functionOverload: "functionOverloadDefinition"
16+
});

tests/cases/fourslash/goToDefinitionFunctionOverloadsInClass.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//// constructor() { }
1212
////}
1313

14-
verify.goToDefinition(
15-
"staticFunctionOverload", "staticFunctionOverloadDefinition",
16-
"functionOverload", "functionOverloadDefinition");
14+
verify.goToDefinition({
15+
staticFunctionOverload: "staticFunctionOverloadDefinition",
16+
functionOverload: "functionOverloadDefinition"
17+
});

tests/cases/fourslash/goToDefinitionInMemberDeclaration.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
//// }
2020
////}
2121

22-
verify.goToDefinition(
23-
["interfaceReference", "interfaceReferenceInList", "interfaceReferenceInConstructor"], "interfaceDefinition",
24-
["classReference", "classReferenceInInitializer"], "classDefinition",
25-
["enumReference", "enumReferenceInInitializer"], "enumDefinition",
26-
"selfReference", "selfDefinition");
22+
verify.goToDefinition([
23+
[["interfaceReference", "interfaceReferenceInList", "interfaceReferenceInConstructor"], "interfaceDefinition"],
24+
[["classReference", "classReferenceInInitializer"], "classDefinition"],
25+
[["enumReference", "enumReferenceInInitializer"], "enumDefinition"],
26+
["selfReference", "selfDefinition"]
27+
]);

0 commit comments

Comments
 (0)