From e1600ab800bb82d581f807432be65412a5d4b02b Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 9 Dec 2022 12:52:45 -0800 Subject: [PATCH] Add baselining of modules and type refs --- src/testRunner/unittests/tsc/helpers.ts | 46 +++++++++++++++++++- src/testRunner/unittests/tscWatch/helpers.ts | 12 +++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/testRunner/unittests/tsc/helpers.ts b/src/testRunner/unittests/tsc/helpers.ts index acb23487741..a5c3e950f14 100644 --- a/src/testRunner/unittests/tsc/helpers.ts +++ b/src/testRunner/unittests/tsc/helpers.ts @@ -35,6 +35,7 @@ export interface TestTscCompile extends TestTscCompileLikeBase { baselineReadFileCalls?: boolean; baselinePrograms?: boolean; baselineDependencies?: boolean; + baselineModulesAndTypeRefs?: boolean; } export type CommandLineProgram = [ts.Program, ts.BuilderProgram?]; @@ -206,6 +207,11 @@ export function testTscCompile(input: TestTscCompile) { baselinePrograms(baseline, getPrograms!, ts.emptyArray, baselineDependencies); sys.write(baseline.join("\n")); } + if (input.baselineModulesAndTypeRefs) { + const baseline: string[] = []; + baselineModulesAndTypeRefs(baseline, getPrograms!()); + sys.write(baseline.join("\n")); + } if (baselineReadFileCalls) { sys.write(`readFiles:: ${JSON.stringify(actualReadFileMap, /*replacer*/ undefined, " ")} `); } @@ -249,6 +255,40 @@ function storeDtsSignatures(sys: TscCompileSystem, programs: readonly CommandLin } } +function baselineCache(baseline: string[], cacheType: string, cache: ts.ModeAwareCache | undefined) { + if (!cache?.size()) return; + baseline.push(`${cacheType}:`); + cache.forEach((resolved, key, mode) => baseline.push(`${key}: ${mode ? ts.getNameOfCompilerOptionValue(mode, ts.moduleOptionDeclaration.type) + ": " : ""}${JSON.stringify( + { ...resolved, refCount: undefined, files: undefined, isInvalidated: undefined, }, + /*replacer*/ undefined, + 2, + )}`)); +} + +export function baselineModulesAndTypeRefs(baseline: string[], programs: readonly CommandLineProgram[]) { + for (const [program] of programs) { + for (const f of program.getSourceFiles()) { + if (!f.resolvedModules && !f.resolvedTypeReferenceDirectiveNames && !f.packageJsonScope) continue; + baseline.push(`File: ${f.fileName}`); + if (f.packageJsonScope) { + baseline.push(`packageJsonScope:: ${JSON.stringify( + f.packageJsonScope, + /*replacer*/ undefined, + 2, + )}`); + } + baselineCache(baseline, "resolvedModules", f.resolvedModules); + baselineCache(baseline, "resolvedTypeReferenceDirectiveNames", f.resolvedTypeReferenceDirectiveNames); + baseline.push(""); + } + const autoTypes = program.getAutomaticTypeDirectiveResolutions(); + if (autoTypes.size()) { + baselineCache(baseline, "automaticTypeDirectiveResolutions", autoTypes); + baseline.push(""); + } + } +} + export function baselinePrograms(baseline: string[], getPrograms: () => readonly CommandLineProgram[], oldPrograms: readonly (CommandLineProgram | undefined)[], baselineDependencies: boolean | undefined) { const programs = getPrograms(); for (let i = 0; i < programs.length; i++) { @@ -903,7 +943,7 @@ export interface VerifyTscWithEditsInput extends TestTscCompile { */ export function verifyTsc({ subScenario, fs, scenario, commandLineArgs, environmentVariables, - baselineSourceMap, modifyFs, baselineReadFileCalls, baselinePrograms, + baselineSourceMap, modifyFs, baselineReadFileCalls, baselinePrograms, baselineDependencies, baselineModulesAndTypeRefs, edits }: VerifyTscWithEditsInput) { describe(`tsc ${commandLineArgs.join(" ")} ${scenario}:: ${subScenario}`, () => { @@ -921,6 +961,8 @@ export function verifyTsc({ baselineSourceMap, baselineReadFileCalls, baselinePrograms, + baselineDependencies, + baselineModulesAndTypeRefs, environmentVariables, }); edits?.forEach(( @@ -937,6 +979,8 @@ export function verifyTsc({ baselineSourceMap, baselineReadFileCalls, baselinePrograms, + baselineDependencies, + baselineModulesAndTypeRefs, environmentVariables, })); }); diff --git a/src/testRunner/unittests/tscWatch/helpers.ts b/src/testRunner/unittests/tscWatch/helpers.ts index 6cedbc57d9d..91546452386 100644 --- a/src/testRunner/unittests/tscWatch/helpers.ts +++ b/src/testRunner/unittests/tscWatch/helpers.ts @@ -12,6 +12,7 @@ import { TestServerHostTrackingWrittenFiles, } from "../virtualFileSystemWithWatch"; import { + baselineModulesAndTypeRefs, baselinePrograms, commandLineCallbacks, CommandLineCallbacks, @@ -42,6 +43,7 @@ export interface TscWatchCompileChange extends TscWatchCheckOptions { scenario: string; @@ -66,7 +68,7 @@ function tscWatchCompile(input: TscWatchCompile) { const { scenario, subScenario, commandLineArgs, edits, - baselineSourceMap, baselineDependencies + baselineSourceMap, baselineDependencies, baselineModulesAndTypeRefs, } = input; if (!isWatch(commandLineArgs)) sys.exit = exitCode => sys.exitCode = exitCode; @@ -86,6 +88,7 @@ function tscWatchCompile(input: TscWatchCompile) { getPrograms, baselineSourceMap, baselineDependencies, + baselineModulesAndTypeRefs, edits, watchOrSolution }); @@ -184,7 +187,7 @@ export interface RunWatchBaseline extends BaselineB export function runWatchBaseline({ scenario, subScenario, commandLineArgs, getPrograms, sys, baseline, oldSnap, - baselineSourceMap, baselineDependencies, + baselineSourceMap, baselineDependencies, baselineModulesAndTypeRefs, edits, watchOrSolution }: RunWatchBaseline) { baseline.push(`${sys.getExecutingFilePath()} ${commandLineArgs.join(" ")}`); @@ -196,6 +199,7 @@ export function runWatchBaseline readonly CommandLineProgram[]; } -export function watchBaseline({ baseline, getPrograms, oldPrograms, sys, oldSnap, baselineSourceMap, baselineDependencies }: WatchBaseline) { +export function watchBaseline({ baseline, getPrograms, oldPrograms, sys, oldSnap, baselineSourceMap, baselineDependencies, baselineModulesAndTypeRefs: shouldBaselineModulesAndTypeRefs }: WatchBaseline) { if (baselineSourceMap) generateSourceMapBaselineFiles(sys); sys.serializeOutput(baseline); const programs = baselinePrograms(baseline, getPrograms, oldPrograms, baselineDependencies); + if (shouldBaselineModulesAndTypeRefs) baselineModulesAndTypeRefs(baseline, programs); sys.serializeWatches(baseline); baseline.push(`exitCode:: ExitStatus.${ts.ExitStatus[sys.exitCode as ts.ExitStatus]}`, ""); sys.diff(baseline, oldSnap);