Skip to content

Commit b6905af

Browse files
committed
Add getTypeDefinitionAtPosition to tsserver
1 parent 6f1c307 commit b6905af

File tree

5 files changed

+81
-4
lines changed

5 files changed

+81
-4
lines changed

src/server/client.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,29 @@ module ts.server {
301301
}
302302

303303
getTypeDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] {
304-
throw new Error("Not Implemented Yet.");
304+
var lineOffset = this.positionToOneBasedLineOffset(fileName, position);
305+
var args: protocol.FileLocationRequestArgs = {
306+
file: fileName,
307+
line: lineOffset.line,
308+
offset: lineOffset.offset,
309+
};
310+
311+
var request = this.processRequest<protocol.TypeDefinitionRequest>(CommandNames.Type, args);
312+
var response = this.processResponse<protocol.TypeDefinitionResponse>(request);
313+
314+
return response.body.map(entry => {
315+
var fileName = entry.file;
316+
var start = this.lineOffsetToPosition(fileName, entry.start);
317+
var end = this.lineOffsetToPosition(fileName, entry.end);
318+
return {
319+
containerKind: "",
320+
containerName: "",
321+
fileName: fileName,
322+
textSpan: ts.createTextSpanFromBounds(start, end),
323+
kind: "",
324+
name: ""
325+
};
326+
});
305327
}
306328

307329
findReferences(fileName: string, position: number): ReferencedSymbol[]{

src/server/editorServices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,7 @@ module ts.server {
772772
findConfigFile(searchPath: string): string {
773773
while (true) {
774774
var fileName = ts.combinePaths(searchPath, "tsconfig.json");
775-
if (sys.fileExists(fileName)) {
775+
if (this.host.fileExists(fileName)) {
776776
return fileName;
777777
}
778778
var parentPath = ts.getDirectoryPath(searchPath);
@@ -922,7 +922,7 @@ module ts.server {
922922
var proj = this.createProject(configFilename, projectOptions);
923923
for (var i = 0, len = parsedCommandLine.fileNames.length; i < len; i++) {
924924
var rootFilename = parsedCommandLine.fileNames[i];
925-
if (ts.sys.fileExists(rootFilename)) {
925+
if (this.host.fileExists(rootFilename)) {
926926
var info = this.openFile(rootFilename, clientFileName == rootFilename);
927927
proj.addRoot(info);
928928
}

src/server/protocol.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,14 @@ declare module ts.server.protocol {
125125
export interface DefinitionRequest extends FileLocationRequest {
126126
}
127127

128+
/**
129+
* Go to type request; value of command field is
130+
* "type". Return response giving the file locations that
131+
* define the type for the symbol found in file at location line, col.
132+
*/
133+
export interface TypeDefinitionRequest extends FileLocationRequest {
134+
}
135+
128136
/**
129137
* Location in source code expressed as (one-based) line and character offset.
130138
*/
@@ -165,6 +173,13 @@ declare module ts.server.protocol {
165173
body?: FileSpan[];
166174
}
167175

176+
/**
177+
* Definition response message. Gives text range for definition.
178+
*/
179+
export interface TypeDefinitionResponse extends Response {
180+
body?: FileSpan[];
181+
}
182+
168183
/**
169184
* Get occurrences request; value of command field is
170185
* "occurrences". Return response giving spans that are relevant

src/server/session.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ module ts.server {
9797
export var Rename = "rename";
9898
export var Saveto = "saveto";
9999
export var SignatureHelp = "signatureHelp";
100+
export var Type = "type";
100101
export var Unknown = "unknown";
101102
}
102103

@@ -285,7 +286,29 @@ module ts.server {
285286
}));
286287
}
287288

288-
getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[] {
289+
getTypeDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] {
290+
var file = ts.normalizePath(fileName);
291+
var project = this.projectService.getProjectForFile(file);
292+
if (!project) {
293+
throw Errors.NoProject;
294+
}
295+
296+
var compilerService = project.compilerService;
297+
var position = compilerService.host.lineOffsetToPosition(file, line, offset);
298+
299+
var definitions = compilerService.languageService.getTypeDefinitionAtPosition(file, position);
300+
if (!definitions) {
301+
return undefined;
302+
}
303+
304+
return definitions.map(def => ({
305+
file: def.fileName,
306+
start: compilerService.host.positionToLineOffset(def.fileName, def.textSpan.start),
307+
end: compilerService.host.positionToLineOffset(def.fileName, ts.textSpanEnd(def.textSpan))
308+
}));
309+
}
310+
311+
getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[]{
289312
fileName = ts.normalizePath(fileName);
290313
let project = this.projectService.getProjectForFile(fileName);
291314

@@ -817,6 +840,11 @@ module ts.server {
817840
response = this.getDefinition(defArgs.line, defArgs.offset, defArgs.file);
818841
break;
819842
}
843+
case CommandNames.Type: {
844+
var defArgs = <protocol.FileLocationRequestArgs>request.arguments;
845+
response = this.getTypeDefinition(defArgs.line, defArgs.offset, defArgs.file);
846+
break;
847+
}
820848
case CommandNames.References: {
821849
var refArgs = <protocol.FileLocationRequestArgs>request.arguments;
822850
response = this.getReferences(refArgs.line, refArgs.offset, refArgs.file);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/// <reference path="../fourslash.ts"/>
2+
3+
// @Filename: b.ts
4+
////import n = require('a');
5+
////var x/*1*/ = new n.Foo();
6+
7+
// @Filename: a.ts
8+
//// /*2*/export class Foo {}
9+
10+
goTo.marker('1');
11+
goTo.type();
12+
verify.caretAtMarker('2');

0 commit comments

Comments
 (0)