From 0aa72a78221a382a190e609063add2b7d7c35d69 Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 6 Feb 2018 17:11:59 -0800 Subject: [PATCH] Added backward compatibility and PR comments --- src/server/editorServices.ts | 20 ++++++------- src/server/project.ts | 28 +++++++++++-------- src/server/protocol.ts | 7 +++-- .../reference/api/tsserverlibrary.d.ts | 5 ++-- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index c5f7a9ac1ce..2d8bd2078bb 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -1429,7 +1429,7 @@ namespace ts.server { this, this.documentRegistry, compilerOptions, - /*exceededFilename*/ this.getFilenameForExceededTotalSizeLimitForNonTsFiles(projectFileName, compilerOptions, files, externalFilePropertyReader), + /*lastFileExceededProgramSize*/ this.getFilenameForExceededTotalSizeLimitForNonTsFiles(projectFileName, compilerOptions, files, externalFilePropertyReader), options.compileOnSave === undefined ? true : options.compileOnSave); project.excludedFiles = excludedFiles; @@ -1495,14 +1495,14 @@ namespace ts.server { const cachedDirectoryStructureHost = createCachedDirectoryStructureHost(this.host, this.host.getCurrentDirectory(), this.host.useCaseSensitiveFileNames); const { projectOptions, configFileErrors, configFileSpecs } = this.convertConfigFileContentToProjectOptions(configFileName, cachedDirectoryStructureHost); this.logger.info(`Opened configuration file ${configFileName}`); - const exceededFilename = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(configFileName, projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader); + const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(configFileName, projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader); const project = new ConfiguredProject( configFileName, this, this.documentRegistry, projectOptions.configHasFilesProperty, projectOptions.compilerOptions, - exceededFilename, + lastFileExceededProgramSize, projectOptions.compileOnSave === undefined ? false : projectOptions.compileOnSave, cachedDirectoryStructureHost); @@ -1515,7 +1515,7 @@ namespace ts.server { WatchType.ConfigFilePath, project ); - if (!exceededFilename) { + if (!lastFileExceededProgramSize) { project.watchWildcards(projectOptions.wildcardDirectories); } @@ -1628,9 +1628,9 @@ namespace ts.server { // Update the project project.configFileSpecs = configFileSpecs; project.setProjectErrors(configFileErrors); - const exceededFilename = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader); - if (exceededFilename) { - project.disableLanguageService(exceededFilename); + const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, projectOptions.compilerOptions, projectOptions.files, fileNamePropertyReader); + if (lastFileExceededProgramSize) { + project.disableLanguageService(lastFileExceededProgramSize); project.stopWatchingWildCards(); } else { @@ -2394,9 +2394,9 @@ namespace ts.server { externalProject.excludedFiles = excludedFiles; if (!tsConfigFiles) { const compilerOptions = convertCompilerOptions(proj.options); - const exceededFilename = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, proj.rootFiles, externalFilePropertyReader); - if (exceededFilename) { - externalProject.disableLanguageService(exceededFilename); + const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(proj.projectFileName, compilerOptions, proj.rootFiles, externalFilePropertyReader); + if (lastFileExceededProgramSize) { + externalProject.disableLanguageService(lastFileExceededProgramSize); } else { externalProject.enableLanguageService(); diff --git a/src/server/project.ts b/src/server/project.ts index bc8d704d6a0..0d3b2967a2c 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -126,11 +126,13 @@ namespace ts.server { private cachedUnresolvedImportsPerFile = new UnresolvedImportsMap(); private lastCachedUnresolvedImportsList: SortedReadonlyArray; + /*@internal*/ + private lastFileExceededProgramSize: string | undefined; + // wrapper over the real language service that will suppress all semantic operations protected languageService: LanguageService; public languageServiceEnabled = true; - public exceededFilename: string | undefined; readonly trace?: (s: string) => void; readonly realpath?: (path: string) => string; @@ -213,7 +215,7 @@ namespace ts.server { readonly projectService: ProjectService, private documentRegistry: DocumentRegistry, hasExplicitListOfFiles: boolean, - exceededFilename: string | undefined, + lastFileExceededProgramSize: string | undefined, private compilerOptions: CompilerOptions, public compileOnSaveEnabled: boolean, directoryStructureHost: DirectoryStructureHost, @@ -245,8 +247,8 @@ namespace ts.server { // Use the current directory as resolution root only if the project created using current directory string this.resolutionCache = createResolutionCache(this, currentDirectory && this.currentDirectory, /*logChangesWhenResolvingModule*/ true); this.languageService = createLanguageService(this, this.documentRegistry); - if (exceededFilename) { - this.disableLanguageService(exceededFilename); + if (lastFileExceededProgramSize) { + this.disableLanguageService(lastFileExceededProgramSize); } this.markAsDirty(); } @@ -498,16 +500,17 @@ namespace ts.server { return; } this.languageServiceEnabled = true; + this.lastFileExceededProgramSize = undefined; this.projectService.onUpdateLanguageServiceStateForProject(this, /*languageServiceEnabled*/ true); } - disableLanguageService(exceededFilename: string) { + disableLanguageService(lastFileExceededProgramSize?: string) { if (!this.languageServiceEnabled) { return; } this.languageService.cleanupSemanticCache(); this.languageServiceEnabled = false; - this.exceededFilename = exceededFilename; + this.lastFileExceededProgramSize = lastFileExceededProgramSize; this.builderState = undefined; this.resolutionCache.closeTypeRootsWatch(); this.projectService.onUpdateLanguageServiceStateForProject(this, /*languageServiceEnabled*/ false); @@ -1000,7 +1003,8 @@ namespace ts.server { version: this.projectStructureVersion, isInferred: this.projectKind === ProjectKind.Inferred, options: this.getCompilationSettings(), - exceededFilename: this.exceededFilename + languageServiceDisabled: !this.languageServiceEnabled, + lastFileExceededProgramSize: this.lastFileExceededProgramSize }; const updatedFileNames = this.updatedFileNames; this.updatedFileNames = undefined; @@ -1184,7 +1188,7 @@ namespace ts.server { projectService, documentRegistry, /*files*/ undefined, - /*exceededFileName*/ undefined, + /*lastFileExceededProgramSize*/ undefined, compilerOptions, /*compileOnSaveEnabled*/ false, projectService.host, @@ -1263,7 +1267,7 @@ namespace ts.server { documentRegistry: DocumentRegistry, hasExplicitListOfFiles: boolean, compilerOptions: CompilerOptions, - exceededFilename: string | undefined, + lastFileExceededProgramSize: string | undefined, public compileOnSaveEnabled: boolean, cachedDirectoryStructureHost: CachedDirectoryStructureHost) { super(configFileName, @@ -1271,7 +1275,7 @@ namespace ts.server { projectService, documentRegistry, hasExplicitListOfFiles, - exceededFilename, + lastFileExceededProgramSize, compilerOptions, compileOnSaveEnabled, cachedDirectoryStructureHost, @@ -1458,7 +1462,7 @@ namespace ts.server { projectService: ProjectService, documentRegistry: DocumentRegistry, compilerOptions: CompilerOptions, - exceededFilename: string | undefined, + lastFileExceededProgramSize: string | undefined, public compileOnSaveEnabled: boolean, projectFilePath?: string) { super(externalProjectName, @@ -1466,7 +1470,7 @@ namespace ts.server { projectService, documentRegistry, /*hasExplicitListOfFiles*/ true, - exceededFilename, + lastFileExceededProgramSize, compilerOptions, compileOnSaveEnabled, projectService.host, diff --git a/src/server/protocol.ts b/src/server/protocol.ts index fd1aa3df32f..45c08034e6e 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -1104,11 +1104,14 @@ namespace ts.server.protocol { * Current set of compiler options for project */ options: ts.CompilerOptions; - + /** + * true if project language service is disabled + */ + languageServiceDisabled: boolean; /** * Filename of the last file analyzed before disabling the language service. undefined, if the language service is enabled. */ - exceededFilename: string | undefined; + lastFileExceededProgramSize: string | undefined; } /** diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 5e413f16d87..cd6cc5e2bd9 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -7518,7 +7518,7 @@ declare namespace ts.server { */ emitFile(scriptInfo: ScriptInfo, writeFile: (path: string, data: string, writeByteOrderMark?: boolean) => void): boolean; enableLanguageService(): void; - disableLanguageService(): void; + disableLanguageService(lastFileExceededProgramSize?: string): void; getProjectName(): string; abstract getTypeAcquisition(): TypeAcquisition; protected removeLocalTypingsFromTypeAcquisition(newTypeAcquisition: TypeAcquisition): TypeAcquisition; @@ -7891,7 +7891,8 @@ declare namespace ts.server { private getConfiguredProjectByCanonicalConfigFilePath(canonicalConfigFilePath); private findExternalProjectByProjectName(projectFileName); private convertConfigFileContentToProjectOptions(configFilename, cachedDirectoryStructureHost); - private exceededTotalSizeLimitForNonTsFiles(name, options, fileNames, propertyReader); + /** Get a filename if the language service exceeds the maximum allowed program size; otherwise returns undefined. */ + private getFilenameForExceededTotalSizeLimitForNonTsFiles(name, options, fileNames, propertyReader); private createExternalProject(projectFileName, files, options, typeAcquisition, excludedFiles); private sendProjectTelemetry(projectKey, project, projectOptions?); private addFilesToNonInferredProjectAndUpdateGraph(project, files, propertyReader, typeAcquisition);