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.
This commit is contained in:
Zhengbo Li 2015-05-29 17:20:41 -07:00
parent 57f3e04b3f
commit c597bd63fc
3 changed files with 49 additions and 2 deletions

View File

@ -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];
}

View File

@ -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.
*/

View File

@ -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 } = <protocol.ProjectInfoRequestArgs>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);