Skip to content

Commit ea2c9e8

Browse files
committed
Merge pull request microsoft#3307 from zhengbli/ms_master
Add APIs to provide project info for a given file
2 parents e671bd6 + a7550db commit ea2c9e8

File tree

7 files changed

+146
-23
lines changed

7 files changed

+146
-23
lines changed

src/harness/fourslash.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,21 @@ module FourSlash {
18181818
}
18191819
}
18201820

1821+
private verifyProjectInfo(expected: string[]) {
1822+
if (this.testType == FourSlashTestType.Server) {
1823+
let actual = (<ts.server.SessionClient>this.languageService).getProjectInfo(
1824+
this.activeFile.fileName,
1825+
/* needFileNameList */ true
1826+
);
1827+
assert.equal(
1828+
expected.join(","),
1829+
actual.fileNameList.map( file => {
1830+
return file.replace(this.basePath + "/", "")
1831+
}).join(",")
1832+
);
1833+
}
1834+
}
1835+
18211836
public verifySemanticClassifications(expected: { classificationType: string; text: string }[]) {
18221837
var actual = this.languageService.getSemanticClassifications(this.activeFile.fileName,
18231838
ts.createTextSpan(0, this.activeFile.content.length));

src/server/client.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,21 @@ module ts.server {
171171
documentation: [{ kind: "text", text: response.body.documentation }]
172172
};
173173
}
174+
175+
getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo {
176+
var args: protocol.ProjectInfoRequestArgs = {
177+
file: fileName,
178+
needFileNameList: needFileNameList
179+
};
180+
181+
var request = this.processRequest<protocol.ProjectInfoRequest>(CommandNames.ProjectInfo, args);
182+
var response = this.processResponse<protocol.ProjectInfoResponse>(request);
183+
184+
return {
185+
configFileName: response.body.configFileName,
186+
fileNameList: response.body.fileNameList
187+
};
188+
}
174189

175190
getCompletionsAtPosition(fileName: string, position: number): CompletionInfo {
176191
var lineOffset = this.positionToOneBasedLineOffset(fileName, position);

src/server/editorServices.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,11 @@ module ts.server {
305305
return this.projectService.openFile(filename, false);
306306
}
307307

308+
getFileNameList() {
309+
let sourceFiles = this.program.getSourceFiles();
310+
return sourceFiles.map(sourceFile => sourceFile.fileName);
311+
}
312+
308313
getSourceFile(info: ScriptInfo) {
309314
return this.filenameToSourceFile[info.fileName];
310315
}

src/server/protocol.d.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,45 @@ declare module ts.server.protocol {
8787
file: string;
8888
}
8989

90+
/**
91+
* Arguments for ProjectInfoRequest request.
92+
*/
93+
export interface ProjectInfoRequestArgs extends FileRequestArgs {
94+
/**
95+
* Indicate if the file name list of the project is needed
96+
*/
97+
needFileNameList: boolean;
98+
}
99+
100+
/**
101+
* A request to get the project information of the current file
102+
*/
103+
export interface ProjectInfoRequest extends Request {
104+
arguments: ProjectInfoRequestArgs
105+
}
106+
107+
/**
108+
* Response message body for "projectInfo" request
109+
*/
110+
export interface ProjectInfo {
111+
/**
112+
* For configured project, this is the normalized path of the 'tsconfig.json' file
113+
* For inferred project, this is undefined
114+
*/
115+
configFileName: string;
116+
/**
117+
* The list of normalized file name in the project, including 'lib.d.ts'
118+
*/
119+
fileNameList?: string[];
120+
}
121+
122+
/**
123+
* Response message for "projectInfo" request
124+
*/
125+
export interface ProjectInfoResponse extends Response {
126+
body?: ProjectInfo;
127+
}
128+
90129
/**
91130
* Request whose sole parameter is a file name.
92131
*/

src/server/session.ts

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -76,29 +76,30 @@ module ts.server {
7676
}
7777

7878
export module CommandNames {
79-
export var Brace = "brace";
80-
export var Change = "change";
81-
export var Close = "close";
82-
export var Completions = "completions";
83-
export var CompletionDetails = "completionEntryDetails";
84-
export var Configure = "configure";
85-
export var Definition = "definition";
86-
export var Exit = "exit";
87-
export var Format = "format";
88-
export var Formatonkey = "formatonkey";
89-
export var Geterr = "geterr";
90-
export var NavBar = "navbar";
91-
export var Navto = "navto";
92-
export var Occurrences = "occurrences";
93-
export var Open = "open";
94-
export var Quickinfo = "quickinfo";
95-
export var References = "references";
96-
export var Reload = "reload";
97-
export var Rename = "rename";
98-
export var Saveto = "saveto";
99-
export var SignatureHelp = "signatureHelp";
100-
export var TypeDefinition = "typeDefinition";
101-
export var Unknown = "unknown";
79+
export const Brace = "brace";
80+
export const Change = "change";
81+
export const Close = "close";
82+
export const Completions = "completions";
83+
export const CompletionDetails = "completionEntryDetails";
84+
export const Configure = "configure";
85+
export const Definition = "definition";
86+
export const Exit = "exit";
87+
export const Format = "format";
88+
export const Formatonkey = "formatonkey";
89+
export const Geterr = "geterr";
90+
export const NavBar = "navbar";
91+
export const Navto = "navto";
92+
export const Occurrences = "occurrences";
93+
export const Open = "open";
94+
export const Quickinfo = "quickinfo";
95+
export const References = "references";
96+
export const Reload = "reload";
97+
export const Rename = "rename";
98+
export const Saveto = "saveto";
99+
export const SignatureHelp = "signatureHelp";
100+
export const TypeDefinition = "typeDefinition";
101+
export const ProjectInfo = "projectInfo";
102+
export const Unknown = "unknown";
102103
}
103104

104105
module Errors {
@@ -338,6 +339,21 @@ module ts.server {
338339
});
339340
}
340341

342+
getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo {
343+
fileName = ts.normalizePath(fileName)
344+
let project = this.projectService.getProjectForFile(fileName)
345+
346+
let projectInfo: protocol.ProjectInfo = {
347+
configFileName: project.projectFilename
348+
}
349+
350+
if (needFileNameList) {
351+
projectInfo.fileNameList = project.getFileNameList();
352+
}
353+
354+
return projectInfo;
355+
}
356+
341357
getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody {
342358
var file = ts.normalizePath(fileName);
343359
var project = this.projectService.getProjectForFile(file);
@@ -951,6 +967,11 @@ module ts.server {
951967
response = this.getOccurrences(line, offset, fileName);
952968
break;
953969
}
970+
case CommandNames.ProjectInfo: {
971+
var { file, needFileNameList } = <protocol.ProjectInfoRequestArgs>request.arguments;
972+
response = this.getProjectInfo(file, needFileNameList);
973+
break;
974+
}
954975
default: {
955976
this.projectService.log("Unrecognized JSON command: " + message);
956977
this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command);

tests/cases/fourslash/fourslash.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,10 @@ module FourSlashInterface {
455455
public getSemanticDiagnostics(expected: string) {
456456
FourSlash.currentTestState.getSemanticDiagnostics(expected);
457457
}
458+
459+
public ProjectInfo(expected: string []) {
460+
FourSlash.currentTestState.verifyProjectInfo(expected);
461+
}
458462
}
459463

460464
export class edit {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/// <reference path="../fourslash.ts"/>
2+
3+
// @Filename: a.ts
4+
////export var test = "test String"
5+
6+
// @Filename: b.ts
7+
////import test from "a"
8+
9+
// @Filename: c.ts
10+
/////// <reference path="a.ts"/>
11+
/////// <reference path="b.ts"/>
12+
13+
// @Filename: d.ts
14+
////console.log("nothing");
15+
16+
goTo.file("a.ts")
17+
verify.ProjectInfo(["lib.d.ts", "a.ts"])
18+
goTo.file("b.ts")
19+
verify.ProjectInfo(["lib.d.ts", "a.ts", "b.ts"])
20+
goTo.file("c.ts")
21+
verify.ProjectInfo(["lib.d.ts", "a.ts", "b.ts", "c.ts"])
22+
goTo.file("d.ts")
23+
verify.ProjectInfo(["lib.d.ts", "d.ts"])
24+

0 commit comments

Comments
 (0)