diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 110e59c46e1..8d313c9a1a6 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -1818,6 +1818,21 @@ module FourSlash { } } + private verifyProjectInfo(expected: string[]) { + if (this.testType == FourSlashTestType.Server) { + let actual = (this.languageService).getProjectInfo( + this.activeFile.fileName, + /* needFileNameList */ true + ); + assert.equal( + expected.join(","), + actual.fileNameList.map( file => { + return file.replace(this.basePath + "/", "") + }).join(",") + ); + } + } + public verifySemanticClassifications(expected: { classificationType: string; text: string }[]) { var actual = this.languageService.getSemanticClassifications(this.activeFile.fileName, ts.createTextSpan(0, this.activeFile.content.length)); diff --git a/src/server/client.ts b/src/server/client.ts index 3582d508322..2cfd911b7b5 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -171,6 +171,21 @@ module ts.server { documentation: [{ kind: "text", text: response.body.documentation }] }; } + + getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo { + var args: protocol.ProjectInfoRequestArgs = { + file: fileName, + needFileNameList: !!needFileNameList + }; + + var request = this.processRequest(CommandNames.ProjectInfo, args); + var response = this.processResponse(request); + + return { + configFileName: response.body.configFileName, + fileNameList: response.body.fileNameList + }; + } getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { var lineOffset = this.positionToOneBasedLineOffset(fileName, position); diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index 6df5b420243..41e25661112 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -90,25 +90,29 @@ declare module ts.server.protocol { /** * Arguments for ProjectInfoResponse messages. */ - export interface ProjectInfoRequestArgs { - /** - * The file for the request (absolute pathname required). - */ - file: string; + export interface ProjectInfoRequestArgs extends FileRequestArgs { /** * Indicate if the file name list of the project is needed */ needFileNameList: boolean; } + export interface ProjectInfoRequest extends Request { + arguments: ProjectInfoRequestArgs + } + /** * Response message for "projectInfo" request */ - export interface ProjectInfoResponse { + export interface ProjectInfo { configFileName: string; fileNameList?: string[]; } + export interface ProjectInfoResponse extends Response { + body?: ProjectInfo; + } + /** * Request whose sole parameter is a file name. */ diff --git a/src/server/session.ts b/src/server/session.ts index 621edd35f4f..a4cb3e59b4e 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -339,18 +339,19 @@ module ts.server { }); } - getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfoResponse { + getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo { fileName = ts.normalizePath(fileName) let project = this.projectService.getProjectForFile(fileName) - let projectInfoResponse: protocol.ProjectInfoResponse = { + let projectInfo: protocol.ProjectInfo = { configFileName: project.projectFilename } if (needFileNameList) { - projectInfoResponse.fileNameList = project.getFileNameList(); + projectInfo.fileNameList = project.getFileNameList(); } - return projectInfoResponse; + + return projectInfo; } getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index 21c65c699ab..b3ffa96e1b6 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -455,6 +455,10 @@ module FourSlashInterface { public getSemanticDiagnostics(expected: string) { FourSlash.currentTestState.getSemanticDiagnostics(expected); } + + public ProjectInfo(expected: string []) { + FourSlash.currentTestState.verifyProjectInfo(expected); + } } export class edit { diff --git a/tests/cases/fourslash/server/projectInfo.ts b/tests/cases/fourslash/server/projectInfo.ts new file mode 100644 index 00000000000..d08c7dd85f1 --- /dev/null +++ b/tests/cases/fourslash/server/projectInfo.ts @@ -0,0 +1,10 @@ +/// + +// @Filename: a.ts +//// import test from "b" + +// @Filename: b.ts +//// export var test = "test String" + +goTo.file("a.ts") +verify.ProjectInfo(["lib.d.ts", "b.ts", "a.ts"])