Skip to content

Commit 57f66b8

Browse files
authored
Merge pull request microsoft#9148 from Microsoft/add-isDefinition-to-references
Add isDefinition to references
2 parents 8917ddf + 102a890 commit 57f66b8

22 files changed

+191
-12
lines changed

src/harness/fourslash.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,7 @@ namespace FourSlash {
730730
}
731731
}
732732

733-
public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean) {
733+
public verifyReferencesAtPositionListContains(fileName: string, start: number, end: number, isWriteAccess?: boolean, isDefinition?: boolean) {
734734
const references = this.getReferencesAtCaret();
735735

736736
if (!references || references.length === 0) {
@@ -743,11 +743,14 @@ namespace FourSlash {
743743
if (typeof isWriteAccess !== "undefined" && reference.isWriteAccess !== isWriteAccess) {
744744
this.raiseError(`verifyReferencesAtPositionListContains failed - item isWriteAccess value does not match, actual: ${reference.isWriteAccess}, expected: ${isWriteAccess}.`);
745745
}
746+
if (typeof isDefinition !== "undefined" && reference.isDefinition !== isDefinition) {
747+
this.raiseError(`verifyReferencesAtPositionListContains failed - item isDefinition value does not match, actual: ${reference.isDefinition}, expected: ${isDefinition}.`);
748+
}
746749
return;
747750
}
748751
}
749752

750-
const missingItem = { fileName: fileName, start: start, end: end, isWriteAccess: isWriteAccess };
753+
const missingItem = { fileName, start, end, isWriteAccess, isDefinition };
751754
this.raiseError(`verifyReferencesAtPositionListContains failed - could not find the item: ${stringify(missingItem)} in the returned list: (${stringify(references)})`);
752755
}
753756

@@ -2837,8 +2840,8 @@ namespace FourSlashInterface {
28372840
this.state.verifyReferencesCountIs(count, /*localFilesOnly*/ false);
28382841
}
28392842

2840-
public referencesAtPositionContains(range: FourSlash.Range, isWriteAccess?: boolean) {
2841-
this.state.verifyReferencesAtPositionListContains(range.fileName, range.start, range.end, isWriteAccess);
2843+
public referencesAtPositionContains(range: FourSlash.Range, isWriteAccess?: boolean, isDefinition?: boolean) {
2844+
this.state.verifyReferencesAtPositionListContains(range.fileName, range.start, range.end, isWriteAccess, isDefinition);
28422845
}
28432846

28442847
public signatureHelpPresent() {

src/server/client.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ namespace ts.server {
376376
fileName: fileName,
377377
textSpan: ts.createTextSpanFromBounds(start, end),
378378
isWriteAccess: entry.isWriteAccess,
379+
isDefinition: entry.isDefinition,
379380
};
380381
});
381382
}
@@ -536,6 +537,7 @@ namespace ts.server {
536537
fileName,
537538
textSpan: ts.createTextSpanFromBounds(start, end),
538539
isWriteAccess: entry.isWriteAccess,
540+
isDefinition: false
539541
};
540542
});
541543
}

src/server/protocol.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,11 @@ declare namespace ts.server.protocol {
304304
* True if reference is a write location, false otherwise.
305305
*/
306306
isWriteAccess: boolean;
307+
308+
/**
309+
* True if reference is a definition, false otherwise.
310+
*/
311+
isDefinition: boolean;
307312
}
308313

309314
/**

src/server/session.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ namespace ts.server {
379379
start,
380380
end,
381381
file: fileName,
382-
isWriteAccess
382+
isWriteAccess,
383383
};
384384
});
385385
}
@@ -555,7 +555,8 @@ namespace ts.server {
555555
start: start,
556556
lineText: lineText,
557557
end: compilerService.host.positionToLineOffset(ref.fileName, ts.textSpanEnd(ref.textSpan)),
558-
isWriteAccess: ref.isWriteAccess
558+
isWriteAccess: ref.isWriteAccess,
559+
isDefinition: ref.isDefinition
559560
};
560561
});
561562
},

src/services/services.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,7 @@ namespace ts {
12091209
textSpan: TextSpan;
12101210
fileName: string;
12111211
isWriteAccess: boolean;
1212+
isDefinition: boolean;
12121213
}
12131214

12141215
export interface DocumentHighlights {
@@ -5753,7 +5754,8 @@ namespace ts {
57535754
result.push({
57545755
fileName: entry.fileName,
57555756
textSpan: highlightSpan.textSpan,
5756-
isWriteAccess: highlightSpan.kind === HighlightSpanKind.writtenReference
5757+
isWriteAccess: highlightSpan.kind === HighlightSpanKind.writtenReference,
5758+
isDefinition: false
57575759
});
57585760
}
57595761
}
@@ -6187,7 +6189,8 @@ namespace ts {
61876189
references: [{
61886190
fileName: sourceFile.fileName,
61896191
textSpan: createTextSpan(position, searchText.length),
6190-
isWriteAccess: false
6192+
isWriteAccess: false,
6193+
isDefinition: false
61916194
}]
61926195
});
61936196
}
@@ -6741,7 +6744,8 @@ namespace ts {
67416744
return {
67426745
fileName: node.getSourceFile().fileName,
67436746
textSpan: createTextSpanFromBounds(start, end),
6744-
isWriteAccess: isWriteAccess(node)
6747+
isWriteAccess: isWriteAccess(node),
6748+
isDefinition: isDeclarationName(node) || isLiteralComputedPropertyDeclarationName(node)
67456749
};
67466750
}
67476751

src/services/shims.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ namespace ts {
164164

165165
/**
166166
* Returns a JSON-encoded value of the type:
167-
* { fileName: string; textSpan: { start: number; length: number}; isWriteAccess: boolean }[]
167+
* { fileName: string; textSpan: { start: number; length: number}; isWriteAccess: boolean, isDefinition?: boolean }[]
168168
*/
169169
getReferencesAtPosition(fileName: string, position: number): string;
170170

@@ -1141,4 +1141,4 @@ namespace TypeScript.Services {
11411141
/* @internal */
11421142
const toolsVersion = "1.9";
11431143

1144-
/* tslint:enable:no-unused-variable */
1144+
/* tslint:enable:no-unused-variable */

tests/cases/fourslash/fourslash.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ declare namespace FourSlashInterface {
125125
completionListAllowsNewIdentifier(): void;
126126
memberListIsEmpty(): void;
127127
referencesCountIs(count: number): void;
128-
referencesAtPositionContains(range: Range, isWriteAccess?: boolean): void;
128+
referencesAtPositionContains(range: Range, isWriteAccess?: boolean, isDefinition?: boolean): void;
129129
signatureHelpPresent(): void;
130130
errorExistsBetweenMarkers(startMarker: string, endMarker: string): void;
131131
errorExistsAfterMarker(markerName?: string): void;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path='fourslash.ts' />
2+
////var [|{| "isDefinition": true |}f|] = x => x + 1;
3+
////[|{| "isDefinition": false |}f|](12);
4+
var firstRange = test.ranges()[0];
5+
goTo.position(firstRange.start, firstRange.fileName);
6+
test.ranges().forEach(range => {
7+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
8+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path='fourslash.ts' />
2+
////const { [|{| "isDefinition": true |}x|], y } = { x: 1, y: 2 };
3+
////const z = [|{| "isDefinition": false |}x|];
4+
var firstRange = test.ranges()[0];
5+
goTo.position(firstRange.start, firstRange.fileName);
6+
test.ranges().forEach(range => {
7+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
8+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/// <reference path='fourslash.ts' />
2+
////class [|{| "isDefinition": true |}C|] {
3+
//// n: number;
4+
//// constructor() {
5+
//// this.n = 12;
6+
//// }
7+
////}
8+
////let c = new [|{| "isDefinition": false |}C|]();
9+
var firstRange = test.ranges()[0];
10+
goTo.position(firstRange.start, firstRange.fileName);
11+
test.ranges().forEach(range => {
12+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
13+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/// <reference path='fourslash.ts' />
2+
////let o = { ["[|{| "isDefinition": true |}foo|]"]: 12 };
3+
////let y = o.[|{| "isDefinition": false |}foo|];
4+
////let z = o['[|{| "isDefinition": false |}foo|]'];
5+
var firstRange = test.ranges()[0];
6+
goTo.position(firstRange.start, firstRange.fileName);
7+
test.ranges().forEach(range => {
8+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
9+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// <reference path='fourslash.ts' />
2+
////enum [|{| "isDefinition": true |}E|] {
3+
//// First,
4+
//// Second
5+
////}
6+
////let first = [|{| "isDefinition": false |}E|].First;
7+
var firstRange = test.ranges()[0];
8+
goTo.position(firstRange.start, firstRange.fileName);
9+
test.ranges().forEach(range => {
10+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
11+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// <reference path='fourslash.ts' />
2+
// @Filename: m.ts
3+
////export var [|{| "isDefinition": true |}x|] = 12;
4+
// @Filename: main.ts
5+
////import { [|{| "isDefinition": true |}x|] } from "./m";
6+
////const y = [|{| "isDefinition": false |}x|];
7+
var firstRange = test.ranges()[0];
8+
goTo.position(firstRange.start, firstRange.fileName);
9+
test.ranges().forEach(range => {
10+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
11+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/// <reference path='fourslash.ts' />
2+
////function [|{| "isDefinition": true |}func|](x: number) {
3+
////}
4+
////[|{| "isDefinition": false |}func|](x)
5+
var firstRange = test.ranges()[0];
6+
goTo.position(firstRange.start, firstRange.fileName);
7+
test.ranges().forEach(range => {
8+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
9+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
////interface [|{| "isDefinition": true |}I|] {
3+
//// p: number;
4+
////}
5+
////let i: [|{| "isDefinition": false |}I|] = { p: 12 };
6+
var firstRange = test.ranges()[0];
7+
goTo.position(firstRange.start, firstRange.fileName);
8+
test.ranges().forEach(range => {
9+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
10+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/// <reference path='fourslash.ts' />
2+
////interface [|{| "isDefinition": true |}Numbers|] {
3+
//// p: number;
4+
////}
5+
////interface [|{| "isDefinition": true |}Numbers|] {
6+
//// m: number;
7+
////}
8+
////class [|{| "isDefinition": true |}Numbers|] {
9+
//// f(n: number) {
10+
//// return this.p + this.m + n;
11+
//// }
12+
////}
13+
////let i: [|{| "isDefinition": false |}Numbers|] = new [|{| "isDefinition": false |}Numbers|]();
14+
////let x = i.f(i.p + i.m);
15+
var firstRange = test.ranges()[0];
16+
goTo.position(firstRange.start, firstRange.fileName);
17+
test.ranges().forEach(range => {
18+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
19+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
////namespace [|{| "isDefinition": true |}Numbers|] {
3+
//// export var n = 12;
4+
////}
5+
////let x = [|{| "isDefinition": false |}Numbers|].n + 1;
6+
var firstRange = test.ranges()[0];
7+
goTo.position(firstRange.start, firstRange.fileName);
8+
test.ranges().forEach(range => {
9+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
10+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path='fourslash.ts' />
2+
////let o = { [|{| "isDefinition": true |}1|]: 12 };
3+
////let y = o[[|{| "isDefinition": false |}1|]];
4+
var firstRange = test.ranges()[0];
5+
goTo.position(firstRange.start, firstRange.fileName);
6+
test.ranges().forEach(range => {
7+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
8+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/// <reference path='fourslash.ts' />
2+
////function f([|{| "isDefinition": true |}x|]: number) {
3+
//// return [|{| "isDefinition": false |}x|] + 1
4+
////}
5+
var firstRange = test.ranges()[0];
6+
goTo.position(firstRange.start, firstRange.fileName);
7+
test.ranges().forEach(range => {
8+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
9+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path='fourslash.ts' />
2+
////let o = { "[|{| "isDefinition": true |}x|]": 12 };
3+
////let y = o.[|{| "isDefinition": false |}x|];
4+
var firstRange = test.ranges()[0];
5+
goTo.position(firstRange.start, firstRange.fileName);
6+
test.ranges().forEach(range => {
7+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
8+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path='fourslash.ts' />
2+
////type [|{| "isDefinition": true |}Alias|]= number;
3+
////let n: [|{| "isDefinition": false |}Alias|] = 12;
4+
var firstRange = test.ranges()[0];
5+
goTo.position(firstRange.start, firstRange.fileName);
6+
test.ranges().forEach(range => {
7+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
8+
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/// <reference path='fourslash.ts' />
2+
////var [|{| "isDefinition": true |}x|] = 0;
3+
////var assignmentRightHandSide = [|{| "isDefinition": false |}x|];
4+
////var assignmentRightHandSide2 = 1 + [|{| "isDefinition": false |}x|];
5+
////
6+
////[|{| "isDefinition": false |}x|] = 1;
7+
////[|{| "isDefinition": false |}x|] = [|{| "isDefinition": false |}x|] + [|{| "isDefinition": false |}x|];
8+
////
9+
////[|{| "isDefinition": false |}x|] == 1;
10+
////[|{| "isDefinition": false |}x|] <= 1;
11+
////
12+
////var preIncrement = ++[|{| "isDefinition": false |}x|];
13+
////var postIncrement = [|{| "isDefinition": false |}x|]++;
14+
////var preDecrement = --[|{| "isDefinition": false |}x|];
15+
////var postDecrement = [|{| "isDefinition": false |}x|]--;
16+
////
17+
////[|{| "isDefinition": false |}x|] += 1;
18+
////[|{| "isDefinition": false |}x|] <<= 1;
19+
var firstRange = test.ranges()[0];
20+
goTo.position(firstRange.start, firstRange.fileName);
21+
test.ranges().forEach(range => {
22+
verify.referencesAtPositionContains(range, undefined, range.marker.data.isDefinition);
23+
});

0 commit comments

Comments
 (0)