Merge pull request #26420 from Microsoft/largeNonTsFiles

Check large file size only for non ts files
This commit is contained in:
Sheetal Nandi 2018-08-16 10:28:24 -07:00 committed by GitHub
commit 0ca9a36610
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 53 deletions

View file

@ -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();
}

View file

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