diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index a0ea670dc7..56026bb70d 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -1,5 +1,7 @@ namespace ts.server { export const maxProgramSizeForNonTsFiles = 20 * 1024 * 1024; + /*@internal*/ + export const maxFileSize = 4 * 1024 * 1024; // tslint:disable variable-name export const ProjectsUpdatedInBackgroundEvent = "projectsUpdatedInBackground"; diff --git a/src/server/scriptInfo.ts b/src/server/scriptInfo.ts index b5e892162a..cf85933e2e 100644 --- a/src/server/scriptInfo.ts +++ b/src/server/scriptInfo.ts @@ -163,7 +163,10 @@ namespace ts.server { } private getFileText(tempFileName?: string) { - return this.host.readFile(tempFileName || this.fileName) || ""; + let text: string; + const getText = () => text === undefined ? (text = this.host.readFile(tempFileName || this.fileName) || "") : text; + const size = this.host.getFileSize ? this.host.getFileSize(tempFileName || this.fileName) : getText().length; + return size > maxFileSize ? "" : getText(); } private switchToScriptVersionCache(): ScriptVersionCache { diff --git a/src/testRunner/unittests/tsserverProjectSystem.ts b/src/testRunner/unittests/tsserverProjectSystem.ts index eb6b5cdfe9..c89d29ffc5 100644 --- a/src/testRunner/unittests/tsserverProjectSystem.ts +++ b/src/testRunner/unittests/tsserverProjectSystem.ts @@ -9020,6 +9020,51 @@ export const x = 10;` }); }); + describe("tsserverProjectSystem with large file", () => { + const projectRoot = "/user/username/projects/project"; + const largeFile: File = { + path: `${projectRoot}/src/large.ts`, + content: "export var x = 10;", + fileSize: server.maxFileSize + 1 + }; + + it("when large file is included by tsconfig", () => { + const file: File = { + path: `${projectRoot}/src/file.ts`, + content: "export var y = 10;" + }; + const tsconfig: File = { + path: `${projectRoot}/tsconfig.json`, + content: JSON.stringify({ files: ["src/file.ts", "src/large.ts"] }) + }; + const files = [file, largeFile, libFile, tsconfig]; + const host = createServerHost(files); + const service = createProjectService(host); + service.openClientFile(file.path); + service.checkNumberOfProjects({ configuredProjects: 1 }); + const project = service.configuredProjects.get(tsconfig.path)!; + checkProjectActualFiles(project, [file.path, libFile.path, largeFile.path, tsconfig.path]); + const info = service.getScriptInfo(largeFile.path)!; + assert.equal(info.cacheSourceFile.sourceFile.text, ""); + }); + + it("when large file is included by module resolution", () => { + const file: File = { + path: `${projectRoot}/src/file.ts`, + content: `export var y = 10;import {x} from "./large"` + }; + const files = [file, largeFile, libFile]; + const host = createServerHost(files); + const service = createProjectService(host); + service.openClientFile(file.path); + service.checkNumberOfProjects({ inferredProjects: 1 }); + const project = service.inferredProjects[0]; + checkProjectActualFiles(project, [file.path, libFile.path, largeFile.path]); + const info = service.getScriptInfo(largeFile.path)!; + assert.equal(info.cacheSourceFile.sourceFile.text, ""); + }); + }); + describe("tsserverProjectSystem syntax operations", () => { function navBarFull(session: TestSession, file: File) { return JSON.stringify(session.executeCommandSeq({ @@ -9575,7 +9620,7 @@ export function Test2() { }); }); - describe("duplicate packages", () => { + describe("tsserverProjectSystem duplicate packages", () => { // Tests that 'moduleSpecifiers.ts' will import from the redirecting file, and not from the file it redirects to, if that can provide a global module specifier. it("works with import fixes", () => { const packageContent = "export const foo: number;";