From c597bd63fcee789e2c3d525928db36e28c2e292d Mon Sep 17 00:00:00 2001 From: Zhengbo Li Date: Fri, 29 May 2015 17:20:41 -0700 Subject: [PATCH] Add APIs to provide project info for a given file Return the path of the config file and the file name list of the project (optionally). This is helpful in differentiate the build command behavior for loose files and configured projects in sublime. --- src/server/editorServices.ts | 5 +++++ src/server/protocol.d.ts | 22 ++++++++++++++++++++++ src/server/session.ts | 24 ++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 9c87a20c851..bc9e685825c 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -305,6 +305,11 @@ module ts.server { return this.projectService.openFile(filename, false); } + getFileNameList() { + let sourceFiles = this.program.getSourceFiles(); + return sourceFiles.map(sourceFile => sourceFile.fileName); + } + getSourceFile(info: ScriptInfo) { return this.filenameToSourceFile[info.fileName]; } diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index b95d5e99864..f857595069d 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -87,6 +87,28 @@ declare module ts.server.protocol { file: string; } + /** + * Arguments for ProjectInfo messages. + */ + export interface ProjectInfoRequestArgs { + /** + * The file for the request (absolute pathname required). + */ + file: string; + /** + * Indicate if the file name list of the project is needed + */ + needFileNameList: boolean; + } + + /** + * Response message for "projectInfo" request + */ + export interface ProjectInfo { + configFileName: string; + fileNameList?: string[]; + } + /** * Request whose sole parameter is a file name. */ diff --git a/src/server/session.ts b/src/server/session.ts index baf0a085ad4..4a779be0787 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -96,8 +96,9 @@ module ts.server { export var Reload = "reload"; export var Rename = "rename"; export var Saveto = "saveto"; - export var SignatureHelp = "signatureHelp"; - export var TypeDefinition = "typeDefinition"; + export var SignatureHelp = "signatureHelp"; + export var TypeDefinition = "typeDefinition"; + export var ProjectInfo = "projectInfo"; export var Unknown = "unknown"; } @@ -338,6 +339,20 @@ module ts.server { }); } + getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo { + fileName = ts.normalizePath(fileName) + let project = this.projectService.getProjectForFile(fileName) + + let projectInfo: protocol.ProjectInfo = { + configFileName: project.projectFilename + } + + if (needFileNameList) { + projectInfo.fileNameList = project.getFileNameList(); + } + return projectInfo; + } + getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -951,6 +966,11 @@ module ts.server { response = this.getOccurrences(line, offset, fileName); break; } + case CommandNames.ProjectInfo: { + var { file, needFileNameList } = request.arguments; + response = this.getProjectInfo(file, needFileNameList); + break; + } default: { this.projectService.log("Unrecognized JSON command: " + message); this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command);