Merge pull request #14713 from RyanCavanaugh/globalSizeLimit-2.1.6

Global size limit (2.1)
This commit is contained in:
Ryan Cavanaugh
2017-03-21 16:30:32 -07:00
committed by GitHub
3 changed files with 58 additions and 6 deletions
@@ -983,6 +983,41 @@ namespace ts.projectSystem {
checkProjectRootFiles(projectService.configuredProjects[0], [commonFile1.path, commonFile2.path]);
});
it("should disable features when the files are too large", () => {
const file1 = {
path: "/a/b/f1.js",
content: "let x =1;",
fileSize: 10 * 1024 * 1024
};
const file2 = {
path: "/a/b/f2.js",
content: "let y =1;",
fileSize: 6 * 1024 * 1024
};
const file3 = {
path: "/a/b/f3.js",
content: "let y =1;",
fileSize: 6 * 1024 * 1024
};
const proj1name = "proj1", proj2name = "proj2", proj3name = "proj3";
const host = createServerHost([file1, file2, file3]);
const projectService = createProjectService(host);
projectService.openExternalProject({ rootFiles: toExternalFiles([file1.path]), options: {}, projectFileName: proj1name });
const proj1 = projectService.findProject(proj1name);
assert.isTrue(proj1.languageServiceEnabled);
projectService.openExternalProject({ rootFiles: toExternalFiles([file2.path]), options: {}, projectFileName: proj2name });
const proj2 = projectService.findProject(proj2name);
assert.isTrue(proj2.languageServiceEnabled);
projectService.openExternalProject({ rootFiles: toExternalFiles([file3.path]), options: {}, projectFileName: proj3name });
const proj3 = projectService.findProject(proj3name);
assert.isFalse(proj3.languageServiceEnabled);
});
it("should use only one inferred project if 'useOneInferredProject' is set", () => {
const file1 = {
path: "/a/b/main.ts",
+22 -5
View File
@@ -254,6 +254,7 @@ namespace ts.server {
private compilerOptionsForInferredProjects: CompilerOptions;
private compileOnSaveForInferredProjects: boolean;
private readonly projectToSizeMap: Map<number> = createMap<number>();
private readonly directoryWatchers: DirectoryWatchers;
private readonly throttledOperations: ThrottledOperations;
@@ -562,9 +563,11 @@ namespace ts.server {
switch (project.projectKind) {
case ProjectKind.External:
removeItemFromSet(this.externalProjects, <ExternalProject>project);
delete this.projectToSizeMap[(project as ExternalProject).externalProjectName];
break;
case ProjectKind.Configured:
removeItemFromSet(this.configuredProjects, <ConfiguredProject>project);
delete this.projectToSizeMap[(project as ConfiguredProject).canonicalConfigFilePath];
break;
case ProjectKind.Inferred:
removeItemFromSet(this.inferredProjects, <InferredProject>project);
@@ -851,10 +854,17 @@ namespace ts.server {
return { success: true, projectOptions, configFileErrors: errors };
}
private exceededTotalSizeLimitForNonTsFiles<T>(options: CompilerOptions, fileNames: T[], propertyReader: FilePropertyReader<T>) {
private exceededTotalSizeLimitForNonTsFiles<T>(name: string, options: CompilerOptions, fileNames: T[], propertyReader: FilePropertyReader<T>) {
if (options && options.disableSizeLimit || !this.host.getFileSize) {
return false;
}
let availableSpace = maxProgramSizeForNonTsFiles;
this.projectToSizeMap[name] = 0;
for (const key in this.projectToSizeMap) {
availableSpace -= (this.projectToSizeMap[key] || 0);
}
let totalNonTsFileSize = 0;
for (const f of fileNames) {
const fileName = propertyReader.getFileName(f);
@@ -863,9 +873,16 @@ namespace ts.server {
}
totalNonTsFileSize += this.host.getFileSize(fileName);
if (totalNonTsFileSize > maxProgramSizeForNonTsFiles) {
// Keep the size as zero since it's disabled
return true;
}
}
if (totalNonTsFileSize > availableSpace) {
return true;
}
this.projectToSizeMap[name] = totalNonTsFileSize;
return false;
}
@@ -876,7 +893,7 @@ namespace ts.server {
this,
this.documentRegistry,
compilerOptions,
/*languageServiceEnabled*/ !this.exceededTotalSizeLimitForNonTsFiles(compilerOptions, files, externalFilePropertyReader),
/*languageServiceEnabled*/ !this.exceededTotalSizeLimitForNonTsFiles(projectFileName, compilerOptions, files, externalFilePropertyReader),
options.compileOnSave === undefined ? true : options.compileOnSave);
this.addFilesToProjectAndUpdateGraph(project, files, externalFilePropertyReader, /*clientFileName*/ undefined, typeAcquisition, /*configFileErrors*/ undefined);
@@ -896,7 +913,7 @@ namespace ts.server {
}
private createAndAddConfiguredProject(configFileName: NormalizedPath, projectOptions: ProjectOptions, configFileErrors: Diagnostic[], clientFileName?: string) {
const sizeLimitExceeded = this.exceededTotalSizeLimitForNonTsFiles(projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader);
const sizeLimitExceeded = this.exceededTotalSizeLimitForNonTsFiles(configFileName, projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader);
const project = new ConfiguredProject(
configFileName,
this,
@@ -1049,7 +1066,7 @@ namespace ts.server {
return configFileErrors;
}
if (this.exceededTotalSizeLimitForNonTsFiles(projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader)) {
if (this.exceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader)) {
project.setCompilerOptions(projectOptions.compilerOptions);
if (!project.languageServiceEnabled) {
// language service is already disabled
@@ -1411,7 +1428,7 @@ namespace ts.server {
if (externalProject) {
if (!tsConfigFiles) {
const compilerOptions = convertCompilerOptions(proj.options);
if (this.exceededTotalSizeLimitForNonTsFiles(compilerOptions, proj.rootFiles, externalFilePropertyReader)) {
if (this.exceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, proj.rootFiles, externalFilePropertyReader)) {
externalProject.disableLanguageService();
}
else {
+1 -1
View File
@@ -886,7 +886,7 @@ namespace ts.server {
export class ExternalProject extends Project {
private typeAcquisition: TypeAcquisition;
constructor(externalProjectName: string,
constructor(public externalProjectName: string,
projectService: ProjectService,
documentRegistry: ts.DocumentRegistry,
compilerOptions: CompilerOptions,