diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 864cc0268e..78947dd88e 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -1981,28 +1981,17 @@ namespace ts.server { totalNonTsFileSize += this.host.getFileSize(fileName); if (totalNonTsFileSize > maxProgramSizeForNonTsFiles || totalNonTsFileSize > availableSpace) { - this.logger.info(getExceedLimitMessage({ propertyReader, hasTSFileExtension: ts.hasTSFileExtension, host: this.host }, totalNonTsFileSize)); // eslint-disable-line @typescript-eslint/no-unnecessary-qualifier + const top5LargestFiles = fileNames.map(f => propertyReader.getFileName(f)) + .filter(name => !hasTSFileExtension(name)) + .map(name => ({ name, size: this.host.getFileSize!(name) })) + .sort((a, b) => b.size - a.size) + .slice(0, 5); + this.logger.info(`Non TS file size exceeded limit (${totalNonTsFileSize}). Largest files: ${top5LargestFiles.map(file => `${file.name}:${file.size}`).join(", ")}`); // Keep the size as zero since it's disabled return fileName; } } - this.projectToSizeMap.set(name, totalNonTsFileSize); - - return; - - function getExceedLimitMessage(context: { propertyReader: FilePropertyReader, hasTSFileExtension: (filename: string) => boolean, host: ServerHost }, totalNonTsFileSize: number) { - const files = getTop5LargestFiles(context); - - return `Non TS file size exceeded limit (${totalNonTsFileSize}). Largest files: ${files.map(file => `${file.name}:${file.size}`).join(", ")}`; - } - function getTop5LargestFiles({ propertyReader, hasTSFileExtension, host }: { propertyReader: FilePropertyReader, hasTSFileExtension: (filename: string) => boolean, host: ServerHost }) { - return fileNames.map(f => propertyReader.getFileName(f)) - .filter(name => hasTSFileExtension(name)) - .map(name => ({ name, size: host.getFileSize!(name) })) // TODO: GH#18217 - .sort((a, b) => b.size - a.size) - .slice(0, 5); - } } private createExternalProject(projectFileName: string, files: protocol.ExternalFile[], options: protocol.ExternalProjectCompilerOptions, typeAcquisition: TypeAcquisition, excludedFiles: NormalizedPath[]) { diff --git a/src/server/project.ts b/src/server/project.ts index 7c95a633da..5d80bcf393 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -147,7 +147,8 @@ namespace ts.server { /*@internal*/ private hasAddedorRemovedFiles = false; - private lastFileExceededProgramSize: string | undefined; + /*@internal*/ + lastFileExceededProgramSize: string | undefined; // wrapper over the real language service that will suppress all semantic operations protected languageService: LanguageService; diff --git a/src/testRunner/unittests/tsserver/events/projectLanguageServiceState.ts b/src/testRunner/unittests/tsserver/events/projectLanguageServiceState.ts index da6718ef9c..d61b022ae9 100644 --- a/src/testRunner/unittests/tsserver/events/projectLanguageServiceState.ts +++ b/src/testRunner/unittests/tsserver/events/projectLanguageServiceState.ts @@ -7,7 +7,7 @@ namespace ts.projectSystem { }; const f2 = { path: "/a/largefile.js", - content: "" + content: "", }; const config = { path: "/a/jsconfig.json", @@ -47,5 +47,39 @@ namespace ts.projectSystem { assert.equal(events[1].data.project.getProjectName(), config.path, "config path"); assert.isTrue(events[1].data.languageServiceEnabled, "Language service state"); }); + + it("Large file size is determined correctly", () => { + const f1: File = { + path: "/a/app.js", + content: "let x = 1;" + }; + const f2: File = { + path: "/a/largefile.js", + content: "", + fileSize: server.maxProgramSizeForNonTsFiles + 1 + }; + const f3: File = { + path: "/a/extremlylarge.d.ts", + content: "", + fileSize: server.maxProgramSizeForNonTsFiles + 100 + }; + const config = { + path: "/a/jsconfig.json", + content: "{}" + }; + const host = createServerHost([f1, f2, f3, libFile, config]); + const logs: string[] = []; + const logger: server.Logger = { + ...nullLogger, + info: s => logs.push(s) + }; + const service = createProjectService(host, { logger }); + service.openClientFile(f1.path); + checkNumberOfProjects(service, { configuredProjects: 1 }); + const project = service.configuredProjects.get(config.path)!; + assert.isFalse(project.languageServiceEnabled, "Language service enabled"); + assert.equal(project.lastFileExceededProgramSize, f2.path); + assert.isTrue(contains(logs, `Non TS file size exceeded limit (${f1.content.length + f2.fileSize!}). Largest files: ${f2.path}:${f2.fileSize}, ${f1.path}:${f1.content.length}`)); + }); }); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index be9c82b1e1..1598efef32 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -9267,7 +9267,6 @@ declare namespace ts.server { private missingFilesMap; private generatedFilesMap; private plugins; - private lastFileExceededProgramSize; protected languageService: LanguageService; languageServiceEnabled: boolean; readonly trace?: (s: string) => void;