diff --git a/src/server/scriptInfo.ts b/src/server/scriptInfo.ts index 7d18b6ef5e..c6992e91b8 100644 --- a/src/server/scriptInfo.ts +++ b/src/server/scriptInfo.ts @@ -166,13 +166,16 @@ namespace ts.server { let text: string; const fileName = tempFileName || this.fileName; const getText = () => text === undefined ? (text = this.host.readFile(fileName) || "") : text; - const fileSize = this.host.getFileSize ? this.host.getFileSize(fileName) : getText().length; - if (fileSize > maxFileSize) { - Debug.assert(!!this.info.containingProjects.length); - const service = this.info.containingProjects[0].projectService; - service.logger.info(`Skipped loading contents of large file ${fileName} for info ${this.info.fileName}: fileSize: ${fileSize}`); - this.info.containingProjects[0].projectService.sendLargeFileReferencedEvent(fileName, fileSize); - return ""; + // Only non typescript files have size limitation + if (!hasTypeScriptFileExtension(this.fileName)) { + const fileSize = this.host.getFileSize ? this.host.getFileSize(fileName) : getText().length; + if (fileSize > maxFileSize) { + Debug.assert(!!this.info.containingProjects.length); + const service = this.info.containingProjects[0].projectService; + service.logger.info(`Skipped loading contents of large file ${fileName} for info ${this.info.fileName}: fileSize: ${fileSize}`); + this.info.containingProjects[0].projectService.sendLargeFileReferencedEvent(fileName, fileSize); + return ""; + } } return getText(); } diff --git a/src/testRunner/unittests/tsserverProjectSystem.ts b/src/testRunner/unittests/tsserverProjectSystem.ts index 81c62ed808..efe2771e93 100644 --- a/src/testRunner/unittests/tsserverProjectSystem.ts +++ b/src/testRunner/unittests/tsserverProjectSystem.ts @@ -9022,13 +9022,19 @@ 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 - }; - function createSessionWithEventHandler(host: TestServerHost) { + function getLargeFile(useLargeTsFile: boolean) { + return `src/large.${useLargeTsFile ? "ts" : "js"}`; + } + + function createSessionWithEventHandler(files: File[], useLargeTsFile: boolean) { + const largeFile: File = { + path: `${projectRoot}/${getLargeFile(useLargeTsFile)}`, + content: "export var x = 10;", + fileSize: server.maxFileSize + 1 + }; + files.push(largeFile); + const host = createServerHost(files); const largeFileReferencedEvents: server.LargeFileReferencedEvent[] = []; const session = createSession(host, { eventHandler: e => { @@ -9038,55 +9044,61 @@ export const x = 10;` } }); - return { session, verifyLargeFileReferencedEvent }; + return { session, verifyLargeFile }; - function verifyLargeFileReferencedEvent() { - assert.equal(largeFileReferencedEvents.length, 1); - assert.deepEqual(largeFileReferencedEvents, [{ + function verifyLargeFile(project: server.Project) { + checkProjectActualFiles(project, files.map(f => f.path)); + + // large file for non ts file should be empty and for ts file should have content + const service = session.getProjectService(); + const info = service.getScriptInfo(largeFile.path)!; + assert.equal(info.cacheSourceFile.sourceFile.text, useLargeTsFile ? largeFile.content : ""); + + assert.deepEqual(largeFileReferencedEvents, useLargeTsFile ? emptyArray : [{ eventName: server.LargeFileReferencedEvent, data: { file: largeFile.path, fileSize: largeFile.fileSize, maxFileSize: server.maxFileSize } }]); } } - 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 { session, verifyLargeFileReferencedEvent } = createSessionWithEventHandler(host); - const service = session.getProjectService(); - openFilesForSession([file], session); - checkNumberOfProjects(service, { 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, ""); - verifyLargeFileReferencedEvent(); + function verifyLargeFile(useLargeTsFile: boolean) { + 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", getLargeFile(useLargeTsFile)], compilerOptions: { target: 1, allowJs: true } }) + }; + const files = [file, libFile, tsconfig]; + const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile); + const service = session.getProjectService(); + openFilesForSession([file], session); + checkNumberOfProjects(service, { configuredProjects: 1 }); + verifyLargeFile(service.configuredProjects.get(tsconfig.path)!); + }); + + 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, libFile]; + const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile); + const service = session.getProjectService(); + openFilesForSession([file], session); + checkNumberOfProjects(service, { inferredProjects: 1 }); + verifyLargeFile(service.inferredProjects[0]); + }); + } + + describe("large file is ts file", () => { + verifyLargeFile(/*useLargeTsFile*/ true); }); - 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 { session, verifyLargeFileReferencedEvent } = createSessionWithEventHandler(host); - const service = session.getProjectService(); - openFilesForSession([file], session); - checkNumberOfProjects(service, { 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, ""); - verifyLargeFileReferencedEvent(); + describe("large file is js file", () => { + verifyLargeFile(/*useLargeTsFile*/ false); }); });