Skip to content

Commit 407284b

Browse files
author
Andy Hanson
committed
Support testing definition range of a reference gruop
1 parent 1c9cd96 commit 407284b

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

src/harness/fourslash.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,20 +1102,27 @@ namespace FourSlash {
11021102
}
11031103

11041104
public verifyReferenceGroups(startRanges: Range | Range[], parts: FourSlashInterface.ReferenceGroup[]): void {
1105-
const fullExpected = ts.map(parts, ({ definition, ranges }) => ({ definition, ranges: ranges.map(rangeToReferenceEntry) }));
1105+
interface ReferenceGroupJson {
1106+
definition: string | { text: string, range: ts.TextSpan };
1107+
references: ts.ReferenceEntry[];
1108+
}
1109+
const fullExpected = ts.map<FourSlashInterface.ReferenceGroup, ReferenceGroupJson>(parts, ({ definition, ranges }) => ({
1110+
definition: typeof definition === "string" ? definition : { ...definition, range: textSpanFromRange(definition.range) },
1111+
references: ranges.map(rangeToReferenceEntry),
1112+
}));
11061113

11071114
for (const startRange of toArray(startRanges)) {
11081115
this.goToRangeStart(startRange);
1109-
const fullActual = ts.map(this.findReferencesAtCaret(), ({ definition, references }) => ({
1110-
definition: definition.displayParts.map(d => d.text).join(""),
1111-
ranges: references
1116+
const fullActual = ts.map<ts.ReferencedSymbol, ReferenceGroupJson>(this.findReferencesAtCaret(), ({ definition, references }, i) => ({
1117+
definition: typeof fullExpected[i].definition === "string" ? definition.name : { text: definition.name, range: definition.textSpan },
1118+
references,
11121119
}));
11131120
this.assertObjectsEqual(fullActual, fullExpected);
11141121
}
11151122

11161123
function rangeToReferenceEntry(r: Range): ts.ReferenceEntry {
11171124
const { isWriteAccess, isDefinition, isInString } = (r.marker && r.marker.data) || { isWriteAccess: false, isDefinition: false, isInString: undefined };
1118-
const result: ts.ReferenceEntry = { fileName: r.fileName, textSpan: { start: r.start, length: r.end - r.start }, isWriteAccess: !!isWriteAccess, isDefinition: !!isDefinition };
1125+
const result: ts.ReferenceEntry = { fileName: r.fileName, textSpan: textSpanFromRange(r), isWriteAccess: !!isWriteAccess, isDefinition: !!isDefinition };
11191126
if (isInString !== undefined) {
11201127
result.isInString = isInString;
11211128
}
@@ -1139,7 +1146,7 @@ namespace FourSlash {
11391146
}
11401147
}
11411148

1142-
public verifySingleReferenceGroup(definition: string, ranges?: Range[]) {
1149+
public verifySingleReferenceGroup(definition: FourSlashInterface.ReferenceGroupDefinition, ranges?: Range[]) {
11431150
ranges = ranges || this.getRanges();
11441151
this.verifyReferenceGroups(ranges, [{ definition, ranges }]);
11451152
}
@@ -4080,7 +4087,7 @@ namespace FourSlashInterface {
40804087
this.state.verifyNoReferences(markerNameOrRange);
40814088
}
40824089

4083-
public singleReferenceGroup(definition: string, ranges?: FourSlash.Range[]) {
4090+
public singleReferenceGroup(definition: ReferenceGroupDefinition, ranges?: FourSlash.Range[]) {
40844091
this.state.verifySingleReferenceGroup(definition, ranges);
40854092
}
40864093

@@ -4592,10 +4599,12 @@ namespace FourSlashInterface {
45924599
}
45934600

45944601
export interface ReferenceGroup {
4595-
definition: string;
4602+
definition: ReferenceGroupDefinition;
45964603
ranges: FourSlash.Range[];
45974604
}
45984605

4606+
export type ReferenceGroupDefinition = string | { text: string, range: FourSlash.Range };
4607+
45994608
export interface ApplyRefactorOptions {
46004609
refactorName: string;
46014610
actionName: string;

src/services/findAllReferences.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace ts.FindAllReferences {
4444
export function findReferencedSymbols(program: Program, cancellationToken: CancellationToken, sourceFiles: ReadonlyArray<SourceFile>, sourceFile: SourceFile, position: number): ReferencedSymbol[] | undefined {
4545
const referencedSymbols = findAllReferencedSymbols(program, cancellationToken, sourceFiles, sourceFile, position);
4646
const checker = program.getTypeChecker();
47-
return !referencedSymbols || !referencedSymbols.length ? undefined : mapDefined(referencedSymbols, ({ definition, references }) =>
47+
return !referencedSymbols || !referencedSymbols.length ? undefined : mapDefined<SymbolAndEntries, ReferencedSymbol>(referencedSymbols, ({ definition, references }) =>
4848
// Only include referenced symbols that have a valid definition.
4949
definition && { definition: definitionToReferencedSymbolDefinitionInfo(definition, checker), references: references.map(toReferenceEntry) });
5050
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////const [|{| "isWriteAccess": true, "isDefinition": true |}x|] = 0;
4+
////[|x|];
5+
6+
// TODO: GH#21301
7+
8+
const ranges = test.ranges();
9+
const [r0, r1] = ranges;
10+
verify.referenceGroups(r1, [
11+
{
12+
definition: { text: "const x: 0", range: r1 },
13+
ranges,
14+
},
15+
])

tests/cases/fourslash/fourslash.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ declare namespace FourSlashInterface {
258258
* For each of startRanges, asserts the ranges that are referenced from there.
259259
* This uses the 'findReferences' command instead of 'getReferencesAtPosition', so references are grouped by their definition.
260260
*/
261-
referenceGroups(startRanges: Range | Range[], parts: Array<{ definition: string, ranges: Range[] }>): void;
262-
singleReferenceGroup(definition: string, ranges?: Range[]): void;
261+
referenceGroups(startRanges: Range | Range[], parts: Array<{ definition: ReferencesDefinition, ranges: Range[] }>): void;
262+
singleReferenceGroup(definition: ReferencesDefinition, ranges?: Range[]): void;
263263
rangesAreOccurrences(isWriteAccess?: boolean): void;
264264
rangesWithSameTextAreRenameLocations(): void;
265265
rangesAreRenameLocations(options?: Range[] | { findInStrings?: boolean, findInComments?: boolean, ranges?: Range[] });
@@ -512,6 +512,11 @@ declare namespace FourSlashInterface {
512512
textSpan?: TextSpan;
513513
};
514514
}
515+
516+
interface ReferencesDefinition {
517+
text: string;
518+
range: Range;
519+
}
515520
}
516521
declare function verifyOperationIsCancelled(f: any): void;
517522
declare var test: FourSlashInterface.test_;

0 commit comments

Comments
 (0)