From 3db6d803d5cc03dbaa41599b6859d02a8cea8527 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Thu, 25 Mar 2021 15:52:04 -0700 Subject: [PATCH] Don't build type catalog during server tracing (#43354) Bonus: this also drops the redundant type catalog from the non-diagnostics-producing checker. --- src/compiler/checker.ts | 7 ++----- src/compiler/program.ts | 1 - src/compiler/tracing.ts | 15 ++++++++++++--- src/compiler/types.ts | 4 ---- src/executeCommandLine/executeCommandLine.ts | 2 +- src/tsserver/nodeServer.ts | 2 +- .../baselines/reference/api/tsserverlibrary.d.ts | 1 - tests/baselines/reference/api/typescript.d.ts | 1 - 8 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6ee049350e8..56ee20ad700 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -340,8 +340,6 @@ namespace ts { let instantiationDepth = 0; let currentNode: Node | undefined; - const typeCatalog: Type[] = []; // NB: id is index + 1 - const emptySymbols = createSymbolTable(); const arrayVariances = [VarianceFlags.Covariant]; @@ -386,7 +384,6 @@ namespace ts { getNodeCount: () => sum(host.getSourceFiles(), "nodeCount"), getIdentifierCount: () => sum(host.getSourceFiles(), "identifierCount"), getSymbolCount: () => sum(host.getSourceFiles(), "symbolCount") + symbolCount, - getTypeCatalog: () => typeCatalog, getTypeCount: () => typeCount, getInstantiationCount: () => totalInstantiationCount, getRelationCacheSizes: () => ({ @@ -3818,8 +3815,8 @@ namespace ts { const result = new Type(checker, flags); typeCount++; result.id = typeCount; - if (tracing) { - typeCatalog.push(result); + if (produceDiagnostics) { // Only record types from one checker + tracing?.recordType(result); } return result; } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 4c2bba00d33..8fd327d74ac 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1057,7 +1057,6 @@ namespace ts { getNodeCount: () => getDiagnosticsProducingTypeChecker().getNodeCount(), getIdentifierCount: () => getDiagnosticsProducingTypeChecker().getIdentifierCount(), getSymbolCount: () => getDiagnosticsProducingTypeChecker().getSymbolCount(), - getTypeCatalog: () => getDiagnosticsProducingTypeChecker().getTypeCatalog(), getTypeCount: () => getDiagnosticsProducingTypeChecker().getTypeCount(), getInstantiationCount: () => getDiagnosticsProducingTypeChecker().getInstantiationCount(), getRelationCacheSizes: () => getDiagnosticsProducingTypeChecker().getRelationCacheSizes(), diff --git a/src/compiler/tracing.ts b/src/compiler/tracing.ts index c9b7e3ca991..31c1c8910cf 100644 --- a/src/compiler/tracing.ts +++ b/src/compiler/tracing.ts @@ -17,6 +17,8 @@ namespace ts { // eslint-disable-line one-namespace-per-file let mode: Mode; + const typeCatalog: Type[] = []; // NB: id is index + 1 + let legendPath: string | undefined; const legend: TraceRecord[] = []; @@ -39,6 +41,7 @@ namespace ts { // eslint-disable-line one-namespace-per-file } mode = tracingMode; + typeCatalog.length = 0; if (legendPath === undefined) { legendPath = combinePaths(traceDir, "legend.json"); @@ -76,15 +79,15 @@ namespace ts { // eslint-disable-line one-namespace-per-file } /** Stops tracing for the in-progress project and dumps the type catalog. */ - export function stopTracing(typeCatalog?: readonly Type[]) { + export function stopTracing() { Debug.assert(tracing, "Tracing is not in progress"); - Debug.assert(!!typeCatalog === (mode !== "server")); // Have a type catalog iff not in server mode + Debug.assert(!!typeCatalog.length === (mode !== "server")); // Have a type catalog iff not in server mode fs.writeSync(traceFd, `\n]\n`); fs.closeSync(traceFd); tracing = undefined; - if (typeCatalog) { + if (typeCatalog.length) { dumpTypes(typeCatalog); } else { @@ -94,6 +97,12 @@ namespace ts { // eslint-disable-line one-namespace-per-file } } + export function recordType(type: Type): void { + if (mode !== "server") { + typeCatalog.push(type); + } + } + export const enum Phase { Parse = "parse", Program = "program", diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 3d70582fdaf..a3afdfbf77c 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3868,8 +3868,6 @@ namespace ts { /* @internal */ getClassifiableNames(): Set<__String>; - getTypeCatalog(): readonly Type[]; - getNodeCount(): number; getIdentifierCount(): number; getSymbolCount(): number; @@ -4209,8 +4207,6 @@ namespace ts { /* @internal */ getGlobalDiagnostics(): Diagnostic[]; /* @internal */ getEmitResolver(sourceFile?: SourceFile, cancellationToken?: CancellationToken): EmitResolver; - /* @internal */ getTypeCatalog(): readonly Type[]; - /* @internal */ getNodeCount(): number; /* @internal */ getIdentifierCount(): number; /* @internal */ getSymbolCount(): number; diff --git a/src/executeCommandLine/executeCommandLine.ts b/src/executeCommandLine/executeCommandLine.ts index a926f474dd5..105341978f5 100644 --- a/src/executeCommandLine/executeCommandLine.ts +++ b/src/executeCommandLine/executeCommandLine.ts @@ -675,7 +675,7 @@ namespace ts { const compilerOptions = program.getCompilerOptions(); if (canTrace(sys, compilerOptions)) { - tracing?.stopTracing(program.getTypeCatalog()); + tracing?.stopTracing(); } let statistics: Statistic[]; diff --git a/src/tsserver/nodeServer.ts b/src/tsserver/nodeServer.ts index 212a22e356d..f2fadc74227 100644 --- a/src/tsserver/nodeServer.ts +++ b/src/tsserver/nodeServer.ts @@ -743,7 +743,7 @@ namespace ts.server { exit() { this.logger.info("Exiting..."); this.projectService.closeLog(); - tracing?.stopTracing(ts.emptyArray); + tracing?.stopTracing(); process.exit(0); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 75b3a9747c0..9137dc54f3a 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2092,7 +2092,6 @@ declare namespace ts { * Gets a type checker that can be used to semantically analyze source files in the program. */ getTypeChecker(): TypeChecker; - getTypeCatalog(): readonly Type[]; getNodeCount(): number; getIdentifierCount(): number; getSymbolCount(): number; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index c0edb345ad5..c18a30d445c 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2092,7 +2092,6 @@ declare namespace ts { * Gets a type checker that can be used to semantically analyze source files in the program. */ getTypeChecker(): TypeChecker; - getTypeCatalog(): readonly Type[]; getNodeCount(): number; getIdentifierCount(): number; getSymbolCount(): number;