Skip to content

Commit 0ca9a36

Browse files
authored
Merge pull request microsoft#26420 from Microsoft/largeNonTsFiles
Check large file size only for non ts files
2 parents 75071a2 + 7e117f2 commit 0ca9a36

File tree

2 files changed

+68
-53
lines changed

2 files changed

+68
-53
lines changed

src/server/scriptInfo.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,16 @@ namespace ts.server {
166166
let text: string;
167167
const fileName = tempFileName || this.fileName;
168168
const getText = () => text === undefined ? (text = this.host.readFile(fileName) || "") : text;
169-
const fileSize = this.host.getFileSize ? this.host.getFileSize(fileName) : getText().length;
170-
if (fileSize > maxFileSize) {
171-
Debug.assert(!!this.info.containingProjects.length);
172-
const service = this.info.containingProjects[0].projectService;
173-
service.logger.info(`Skipped loading contents of large file ${fileName} for info ${this.info.fileName}: fileSize: ${fileSize}`);
174-
this.info.containingProjects[0].projectService.sendLargeFileReferencedEvent(fileName, fileSize);
175-
return "";
169+
// Only non typescript files have size limitation
170+
if (!hasTypeScriptFileExtension(this.fileName)) {
171+
const fileSize = this.host.getFileSize ? this.host.getFileSize(fileName) : getText().length;
172+
if (fileSize > maxFileSize) {
173+
Debug.assert(!!this.info.containingProjects.length);
174+
const service = this.info.containingProjects[0].projectService;
175+
service.logger.info(`Skipped loading contents of large file ${fileName} for info ${this.info.fileName}: fileSize: ${fileSize}`);
176+
this.info.containingProjects[0].projectService.sendLargeFileReferencedEvent(fileName, fileSize);
177+
return "";
178+
}
176179
}
177180
return getText();
178181
}

src/testRunner/unittests/tsserverProjectSystem.ts

Lines changed: 58 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9022,13 +9022,19 @@ export const x = 10;`
90229022

90239023
describe("tsserverProjectSystem with large file", () => {
90249024
const projectRoot = "/user/username/projects/project";
9025-
const largeFile: File = {
9026-
path: `${projectRoot}/src/large.ts`,
9027-
content: "export var x = 10;",
9028-
fileSize: server.maxFileSize + 1
9029-
};
90309025

9031-
function createSessionWithEventHandler(host: TestServerHost) {
9026+
function getLargeFile(useLargeTsFile: boolean) {
9027+
return `src/large.${useLargeTsFile ? "ts" : "js"}`;
9028+
}
9029+
9030+
function createSessionWithEventHandler(files: File[], useLargeTsFile: boolean) {
9031+
const largeFile: File = {
9032+
path: `${projectRoot}/${getLargeFile(useLargeTsFile)}`,
9033+
content: "export var x = 10;",
9034+
fileSize: server.maxFileSize + 1
9035+
};
9036+
files.push(largeFile);
9037+
const host = createServerHost(files);
90329038
const largeFileReferencedEvents: server.LargeFileReferencedEvent[] = [];
90339039
const session = createSession(host, {
90349040
eventHandler: e => {
@@ -9038,55 +9044,61 @@ export const x = 10;`
90389044
}
90399045
});
90409046

9041-
return { session, verifyLargeFileReferencedEvent };
9047+
return { session, verifyLargeFile };
90429048

9043-
function verifyLargeFileReferencedEvent() {
9044-
assert.equal(largeFileReferencedEvents.length, 1);
9045-
assert.deepEqual(largeFileReferencedEvents, [{
9049+
function verifyLargeFile(project: server.Project) {
9050+
checkProjectActualFiles(project, files.map(f => f.path));
9051+
9052+
// large file for non ts file should be empty and for ts file should have content
9053+
const service = session.getProjectService();
9054+
const info = service.getScriptInfo(largeFile.path)!;
9055+
assert.equal(info.cacheSourceFile.sourceFile.text, useLargeTsFile ? largeFile.content : "");
9056+
9057+
assert.deepEqual(largeFileReferencedEvents, useLargeTsFile ? emptyArray : [{
90469058
eventName: server.LargeFileReferencedEvent,
90479059
data: { file: largeFile.path, fileSize: largeFile.fileSize, maxFileSize: server.maxFileSize }
90489060
}]);
90499061
}
90509062
}
90519063

9052-
it("when large file is included by tsconfig", () => {
9053-
const file: File = {
9054-
path: `${projectRoot}/src/file.ts`,
9055-
content: "export var y = 10;"
9056-
};
9057-
const tsconfig: File = {
9058-
path: `${projectRoot}/tsconfig.json`,
9059-
content: JSON.stringify({ files: ["src/file.ts", "src/large.ts"] })
9060-
};
9061-
const files = [file, largeFile, libFile, tsconfig];
9062-
const host = createServerHost(files);
9063-
const { session, verifyLargeFileReferencedEvent } = createSessionWithEventHandler(host);
9064-
const service = session.getProjectService();
9065-
openFilesForSession([file], session);
9066-
checkNumberOfProjects(service, { configuredProjects: 1 });
9067-
const project = service.configuredProjects.get(tsconfig.path)!;
9068-
checkProjectActualFiles(project, [file.path, libFile.path, largeFile.path, tsconfig.path]);
9069-
const info = service.getScriptInfo(largeFile.path)!;
9070-
assert.equal(info.cacheSourceFile.sourceFile.text, "");
9071-
verifyLargeFileReferencedEvent();
9064+
function verifyLargeFile(useLargeTsFile: boolean) {
9065+
it("when large file is included by tsconfig", () => {
9066+
const file: File = {
9067+
path: `${projectRoot}/src/file.ts`,
9068+
content: "export var y = 10;"
9069+
};
9070+
const tsconfig: File = {
9071+
path: `${projectRoot}/tsconfig.json`,
9072+
content: JSON.stringify({ files: ["src/file.ts", getLargeFile(useLargeTsFile)], compilerOptions: { target: 1, allowJs: true } })
9073+
};
9074+
const files = [file, libFile, tsconfig];
9075+
const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile);
9076+
const service = session.getProjectService();
9077+
openFilesForSession([file], session);
9078+
checkNumberOfProjects(service, { configuredProjects: 1 });
9079+
verifyLargeFile(service.configuredProjects.get(tsconfig.path)!);
9080+
});
9081+
9082+
it("when large file is included by module resolution", () => {
9083+
const file: File = {
9084+
path: `${projectRoot}/src/file.ts`,
9085+
content: `export var y = 10;import {x} from "./large"`
9086+
};
9087+
const files = [file, libFile];
9088+
const { session, verifyLargeFile } = createSessionWithEventHandler(files, useLargeTsFile);
9089+
const service = session.getProjectService();
9090+
openFilesForSession([file], session);
9091+
checkNumberOfProjects(service, { inferredProjects: 1 });
9092+
verifyLargeFile(service.inferredProjects[0]);
9093+
});
9094+
}
9095+
9096+
describe("large file is ts file", () => {
9097+
verifyLargeFile(/*useLargeTsFile*/ true);
90729098
});
90739099

9074-
it("when large file is included by module resolution", () => {
9075-
const file: File = {
9076-
path: `${projectRoot}/src/file.ts`,
9077-
content: `export var y = 10;import {x} from "./large"`
9078-
};
9079-
const files = [file, largeFile, libFile];
9080-
const host = createServerHost(files);
9081-
const { session, verifyLargeFileReferencedEvent } = createSessionWithEventHandler(host);
9082-
const service = session.getProjectService();
9083-
openFilesForSession([file], session);
9084-
checkNumberOfProjects(service, { inferredProjects: 1 });
9085-
const project = service.inferredProjects[0];
9086-
checkProjectActualFiles(project, [file.path, libFile.path, largeFile.path]);
9087-
const info = service.getScriptInfo(largeFile.path)!;
9088-
assert.equal(info.cacheSourceFile.sourceFile.text, "");
9089-
verifyLargeFileReferencedEvent();
9100+
describe("large file is js file", () => {
9101+
verifyLargeFile(/*useLargeTsFile*/ false);
90909102
});
90919103
});
90929104

0 commit comments

Comments
 (0)