Skip to content
This repository was archived by the owner on Jan 13, 2024. It is now read-only.

Commit 3516ca9

Browse files
pass program update level to getExternalFiles in tsserver plugins so plugins can make decision about their cache based on that (microsoft#56047)
Co-authored-by: Andrew Branch <[email protected]>
1 parent d0d4067 commit 3516ca9

File tree

9 files changed

+213
-115
lines changed

9 files changed

+213
-115
lines changed

src/compiler/tsbuildPublic.ts

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
CompilerHost,
1515
CompilerOptions,
1616
CompilerOptionsValue,
17-
ConfigFileProgramReloadLevel,
1817
convertToRelativePath,
1918
copyProperties,
2019
createCompilerDiagnostic,
@@ -95,6 +94,7 @@ import {
9594
ProgramBundleEmitBuildInfo,
9695
ProgramHost,
9796
ProgramMultiFileEmitBuildInfo,
97+
ProgramUpdateLevel,
9898
readBuilderProgram,
9999
ReadBuildProgramHost,
100100
resolveConfigFileProjectName,
@@ -287,7 +287,7 @@ export interface SolutionBuilder<T extends BuilderProgram> {
287287

288288
// Testing only
289289
/** @internal */ getUpToDateStatusOfProject(project: string): UpToDateStatus;
290-
/** @internal */ invalidateProject(configFilePath: ResolvedConfigFilePath, reloadLevel?: ConfigFileProgramReloadLevel): void;
290+
/** @internal */ invalidateProject(configFilePath: ResolvedConfigFilePath, updateLevel?: ProgramUpdateLevel): void;
291291
/** @internal */ close(): void;
292292
}
293293

@@ -389,7 +389,7 @@ interface SolutionBuilderState<T extends BuilderProgram> extends WatchFactory<Wa
389389

390390
readonly builderPrograms: Map<ResolvedConfigFilePath, T>;
391391
readonly diagnostics: Map<ResolvedConfigFilePath, readonly Diagnostic[]>;
392-
readonly projectPendingBuild: Map<ResolvedConfigFilePath, ConfigFileProgramReloadLevel>;
392+
readonly projectPendingBuild: Map<ResolvedConfigFilePath, ProgramUpdateLevel>;
393393
readonly projectErrorsReported: Map<ResolvedConfigFilePath, true>;
394394

395395
readonly compilerHost: CompilerHost & ReadBuildProgramHost;
@@ -795,13 +795,13 @@ function clearProjectStatus<T extends BuilderProgram>(state: SolutionBuilderStat
795795
state.diagnostics.delete(resolved);
796796
}
797797

798-
function addProjToQueue<T extends BuilderProgram>({ projectPendingBuild }: SolutionBuilderState<T>, proj: ResolvedConfigFilePath, reloadLevel: ConfigFileProgramReloadLevel) {
798+
function addProjToQueue<T extends BuilderProgram>({ projectPendingBuild }: SolutionBuilderState<T>, proj: ResolvedConfigFilePath, updateLevel: ProgramUpdateLevel) {
799799
const value = projectPendingBuild.get(proj);
800800
if (value === undefined) {
801-
projectPendingBuild.set(proj, reloadLevel);
801+
projectPendingBuild.set(proj, updateLevel);
802802
}
803-
else if (value < reloadLevel) {
804-
projectPendingBuild.set(proj, reloadLevel);
803+
else if (value < updateLevel) {
804+
projectPendingBuild.set(proj, updateLevel);
805805
}
806806
}
807807

@@ -815,7 +815,7 @@ function setupInitialBuild<T extends BuilderProgram>(state: SolutionBuilderState
815815
buildOrder.forEach(configFileName =>
816816
state.projectPendingBuild.set(
817817
toResolvedConfigFilePath(state, configFileName),
818-
ConfigFileProgramReloadLevel.None,
818+
ProgramUpdateLevel.Update,
819819
)
820820
);
821821

@@ -1402,8 +1402,8 @@ function getNextInvalidatedProjectCreateInfo<T extends BuilderProgram>(
14021402
for (let projectIndex = 0; projectIndex < buildOrder.length; projectIndex++) {
14031403
const project = buildOrder[projectIndex];
14041404
const projectPath = toResolvedConfigFilePath(state, project);
1405-
const reloadLevel = state.projectPendingBuild.get(projectPath);
1406-
if (reloadLevel === undefined) continue;
1405+
const updateLevel = state.projectPendingBuild.get(projectPath);
1406+
if (updateLevel === undefined) continue;
14071407

14081408
if (reportQueue) {
14091409
reportQueue = false;
@@ -1417,14 +1417,14 @@ function getNextInvalidatedProjectCreateInfo<T extends BuilderProgram>(
14171417
continue;
14181418
}
14191419

1420-
if (reloadLevel === ConfigFileProgramReloadLevel.Full) {
1420+
if (updateLevel === ProgramUpdateLevel.Full) {
14211421
watchConfigFile(state, project, projectPath, config);
14221422
watchExtendedConfigFiles(state, projectPath, config);
14231423
watchWildCardDirectories(state, project, projectPath, config);
14241424
watchInputFiles(state, project, projectPath, config);
14251425
watchPackageJsonFiles(state, project, projectPath, config);
14261426
}
1427-
else if (reloadLevel === ConfigFileProgramReloadLevel.Partial) {
1427+
else if (updateLevel === ProgramUpdateLevel.RootNamesAndUpdate) {
14281428
// Update file names
14291429
config.fileNames = getFileNamesFromConfigSpecs(config.options.configFile!.configFileSpecs!, getDirectoryPath(project), config.options, state.parseConfigFileHost);
14301430
updateErrorForNoInputFiles(config.fileNames, project, config.options.configFile!.configFileSpecs!, config.errors, canJsonReportNoInputFiles(config.raw));
@@ -2169,7 +2169,7 @@ function queueReferencingProjects<T extends BuilderProgram>(
21692169
break;
21702170
}
21712171
}
2172-
addProjToQueue(state, nextProjectPath, ConfigFileProgramReloadLevel.None);
2172+
addProjToQueue(state, nextProjectPath, ProgramUpdateLevel.Update);
21732173
break;
21742174
}
21752175
}
@@ -2251,7 +2251,7 @@ function cleanWorker<T extends BuilderProgram>(state: SolutionBuilderState<T>, p
22512251
}
22522252
else {
22532253
host.deleteFile(output);
2254-
invalidateProject(state, resolvedPath, ConfigFileProgramReloadLevel.None);
2254+
invalidateProject(state, resolvedPath, ProgramUpdateLevel.Update);
22552255
}
22562256
}
22572257
}
@@ -2264,24 +2264,24 @@ function cleanWorker<T extends BuilderProgram>(state: SolutionBuilderState<T>, p
22642264
return ExitStatus.Success;
22652265
}
22662266

2267-
function invalidateProject<T extends BuilderProgram>(state: SolutionBuilderState<T>, resolved: ResolvedConfigFilePath, reloadLevel: ConfigFileProgramReloadLevel) {
2267+
function invalidateProject<T extends BuilderProgram>(state: SolutionBuilderState<T>, resolved: ResolvedConfigFilePath, updateLevel: ProgramUpdateLevel) {
22682268
// If host implements getParsedCommandLine, we cant get list of files from parseConfigFileHost
2269-
if (state.host.getParsedCommandLine && reloadLevel === ConfigFileProgramReloadLevel.Partial) {
2270-
reloadLevel = ConfigFileProgramReloadLevel.Full;
2269+
if (state.host.getParsedCommandLine && updateLevel === ProgramUpdateLevel.RootNamesAndUpdate) {
2270+
updateLevel = ProgramUpdateLevel.Full;
22712271
}
2272-
if (reloadLevel === ConfigFileProgramReloadLevel.Full) {
2272+
if (updateLevel === ProgramUpdateLevel.Full) {
22732273
state.configFileCache.delete(resolved);
22742274
state.buildOrder = undefined;
22752275
}
22762276
state.needsSummary = true;
22772277
clearProjectStatus(state, resolved);
2278-
addProjToQueue(state, resolved, reloadLevel);
2278+
addProjToQueue(state, resolved, updateLevel);
22792279
enableCache(state);
22802280
}
22812281

2282-
function invalidateProjectAndScheduleBuilds<T extends BuilderProgram>(state: SolutionBuilderState<T>, resolvedPath: ResolvedConfigFilePath, reloadLevel: ConfigFileProgramReloadLevel) {
2282+
function invalidateProjectAndScheduleBuilds<T extends BuilderProgram>(state: SolutionBuilderState<T>, resolvedPath: ResolvedConfigFilePath, updateLevel: ProgramUpdateLevel) {
22832283
state.reportFileChangeDetected = true;
2284-
invalidateProject(state, resolvedPath, reloadLevel);
2284+
invalidateProject(state, resolvedPath, updateLevel);
22852285
scheduleBuildInvalidatedProject(state, 250, /*changeDetected*/ true);
22862286
}
22872287

@@ -2344,7 +2344,7 @@ function watchConfigFile<T extends BuilderProgram>(state: SolutionBuilderState<T
23442344
watchFile(
23452345
state,
23462346
resolved,
2347-
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, ConfigFileProgramReloadLevel.Full),
2347+
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, ProgramUpdateLevel.Full),
23482348
PollingInterval.High,
23492349
parsed?.watchOptions,
23502350
WatchType.ConfigFile,
@@ -2362,7 +2362,7 @@ function watchExtendedConfigFiles<T extends BuilderProgram>(state: SolutionBuild
23622362
watchFile(
23632363
state,
23642364
extendedConfigFileName,
2365-
() => state.allWatchedExtendedConfigFiles.get(extendedConfigFilePath)?.projects.forEach(projectConfigFilePath => invalidateProjectAndScheduleBuilds(state, projectConfigFilePath, ConfigFileProgramReloadLevel.Full)),
2365+
() => state.allWatchedExtendedConfigFiles.get(extendedConfigFilePath)?.projects.forEach(projectConfigFilePath => invalidateProjectAndScheduleBuilds(state, projectConfigFilePath, ProgramUpdateLevel.Full)),
23662366
PollingInterval.High,
23672367
parsed?.watchOptions,
23682368
WatchType.ExtendedConfigFile,
@@ -2395,7 +2395,7 @@ function watchWildCardDirectories<T extends BuilderProgram>(state: SolutionBuild
23952395
})
23962396
) return;
23972397

2398-
invalidateProjectAndScheduleBuilds(state, resolvedPath, ConfigFileProgramReloadLevel.Partial);
2398+
invalidateProjectAndScheduleBuilds(state, resolvedPath, ProgramUpdateLevel.RootNamesAndUpdate);
23992399
},
24002400
flags,
24012401
parsed?.watchOptions,
@@ -2415,7 +2415,7 @@ function watchInputFiles<T extends BuilderProgram>(state: SolutionBuilderState<T
24152415
watchFile(
24162416
state,
24172417
input,
2418-
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, ConfigFileProgramReloadLevel.None),
2418+
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, ProgramUpdateLevel.Update),
24192419
PollingInterval.Low,
24202420
parsed?.watchOptions,
24212421
WatchType.SourceFile,
@@ -2436,7 +2436,7 @@ function watchPackageJsonFiles<T extends BuilderProgram>(state: SolutionBuilderS
24362436
watchFile(
24372437
state,
24382438
path,
2439-
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, ConfigFileProgramReloadLevel.None),
2439+
() => invalidateProjectAndScheduleBuilds(state, resolvedPath, ProgramUpdateLevel.Update),
24402440
PollingInterval.High,
24412441
parsed?.watchOptions,
24422442
WatchType.PackageJson,
@@ -2503,7 +2503,7 @@ function createSolutionBuilderWorker<T extends BuilderProgram>(watch: boolean, h
25032503
const configFilePath = toResolvedConfigFilePath(state, configFileName);
25042504
return getUpToDateStatus(state, parseConfigFile(state, configFileName, configFilePath), configFilePath);
25052505
},
2506-
invalidateProject: (configFilePath, reloadLevel) => invalidateProject(state, configFilePath, reloadLevel || ConfigFileProgramReloadLevel.None),
2506+
invalidateProject: (configFilePath, updateLevel) => invalidateProject(state, configFilePath, updateLevel || ProgramUpdateLevel.Update),
25072507
close: () => stopWatching(state),
25082508
};
25092509
}

src/compiler/watchPublic.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
CompilerHost,
1313
CompilerOptions,
1414
ConfigFileDiagnosticsReporter,
15-
ConfigFileProgramReloadLevel,
1615
createBuilderProgramUsingProgramBuildInfo,
1716
createCachedDirectoryStructureHost,
1817
createCompilerDiagnostic,
@@ -64,6 +63,7 @@ import {
6463
Path,
6564
perfLogger,
6665
PollingInterval,
66+
ProgramUpdateLevel,
6767
ProjectReference,
6868
ResolutionCache,
6969
ResolutionCacheHost,
@@ -399,8 +399,8 @@ interface ParsedConfig {
399399
watcher?: FileWatcher;
400400
/** Wild card directories watched from this config file */
401401
watchedDirectories?: Map<string, WildcardDirectoryWatcher>;
402-
/** Reload to be done for this config file */
403-
reloadLevel?: ConfigFileProgramReloadLevel.Partial | ConfigFileProgramReloadLevel.Full;
402+
/** Level of program update to be done for this config file */
403+
updateLevel?: ProgramUpdateLevel.RootNamesAndUpdate | ProgramUpdateLevel.Full;
404404
}
405405

406406
// All of one and partial of the other, or vice versa.
@@ -431,7 +431,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
431431
type HostFileInfo = FilePresentOnHost | FileMissingOnHost | FilePresenceUnknownOnHost;
432432

433433
let builderProgram: T;
434-
let reloadLevel: ConfigFileProgramReloadLevel; // level to indicate if the program needs to be reloaded from config file/just filenames etc
434+
let updateLevel: ProgramUpdateLevel; // level to indicate if the program needs to be reloaded from config file/just filenames etc
435435
let missingFilesMap: Map<Path, FileWatcher>; // Map of file watchers for the missing files
436436
let watchedWildcardDirectories: Map<string, WildcardDirectoryWatcher>; // map of watchers for the wild card directories in the config file
437437
let timerToUpdateProgram: any; // timer callback to recompile the program
@@ -872,7 +872,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
872872

873873
function scheduleProgramReload() {
874874
Debug.assert(!!configFileName);
875-
reloadLevel = ConfigFileProgramReloadLevel.Full;
875+
updateLevel = ProgramUpdateLevel.Full;
876876
scheduleProgramUpdate();
877877
}
878878

@@ -883,12 +883,12 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
883883
}
884884

885885
function updateProgram() {
886-
switch (reloadLevel) {
887-
case ConfigFileProgramReloadLevel.Partial:
886+
switch (updateLevel) {
887+
case ProgramUpdateLevel.RootNamesAndUpdate:
888888
perfLogger?.logStartUpdateProgram("PartialConfigReload");
889889
reloadFileNamesFromConfigFile();
890890
break;
891-
case ConfigFileProgramReloadLevel.Full:
891+
case ProgramUpdateLevel.Full:
892892
perfLogger?.logStartUpdateProgram("FullConfigReload");
893893
reloadConfigFile();
894894
break;
@@ -907,7 +907,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
907907
Debug.assert(compilerOptions);
908908
Debug.assert(configFileName);
909909

910-
reloadLevel = ConfigFileProgramReloadLevel.None;
910+
updateLevel = ProgramUpdateLevel.Update;
911911
rootFileNames = getFileNamesFromConfigSpecs(compilerOptions.configFile!.configFileSpecs!, getNormalizedAbsolutePath(getDirectoryPath(configFileName), currentDirectory), compilerOptions, parseConfigFileHost, extraFileExtensions);
912912
if (updateErrorForNoInputFiles(rootFileNames, getNormalizedAbsolutePath(configFileName, currentDirectory), compilerOptions.configFile!.configFileSpecs!, configFileParsingDiagnostics!, canConfigFileJsonReportNoInputFiles)) {
913913
hasChangedConfigFileParsingErrors = true;
@@ -920,7 +920,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
920920
function reloadConfigFile() {
921921
Debug.assert(configFileName);
922922
writeLog(`Reloading config file: ${configFileName}`);
923-
reloadLevel = ConfigFileProgramReloadLevel.None;
923+
updateLevel = ProgramUpdateLevel.Update;
924924

925925
if (cachedDirectoryStructureHost) {
926926
cachedDirectoryStructureHost.clearCache();
@@ -965,9 +965,9 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
965965
const configPath = toPath(configFileName);
966966
let config = parsedConfigs?.get(configPath);
967967
if (config) {
968-
if (!config.reloadLevel) return config.parsedCommandLine;
968+
if (!config.updateLevel) return config.parsedCommandLine;
969969
// With host implementing getParsedCommandLine we cant just update file names
970-
if (config.parsedCommandLine && config.reloadLevel === ConfigFileProgramReloadLevel.Partial && !host.getParsedCommandLine) {
970+
if (config.parsedCommandLine && config.updateLevel === ProgramUpdateLevel.RootNamesAndUpdate && !host.getParsedCommandLine) {
971971
writeLog("Reloading new file names and options");
972972
Debug.assert(compilerOptions);
973973
const fileNames = getFileNamesFromConfigSpecs(
@@ -977,7 +977,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
977977
parseConfigFileHost,
978978
);
979979
config.parsedCommandLine = { ...config.parsedCommandLine, fileNames };
980-
config.reloadLevel = undefined;
980+
config.updateLevel = undefined;
981981
return config.parsedCommandLine;
982982
}
983983
}
@@ -988,7 +988,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
988988
getParsedCommandLineFromConfigFileHost(configFileName);
989989
if (config) {
990990
config.parsedCommandLine = parsedCommandLine;
991-
config.reloadLevel = undefined;
991+
config.updateLevel = undefined;
992992
}
993993
else {
994994
(parsedConfigs ||= new Map()).set(configPath, config = { parsedCommandLine });
@@ -1120,8 +1120,8 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
11201120
) return;
11211121

11221122
// Reload is pending, do the reload
1123-
if (reloadLevel !== ConfigFileProgramReloadLevel.Full) {
1124-
reloadLevel = ConfigFileProgramReloadLevel.Partial;
1123+
if (updateLevel !== ProgramUpdateLevel.Full) {
1124+
updateLevel = ProgramUpdateLevel.RootNamesAndUpdate;
11251125

11261126
// Schedule Update the program
11271127
scheduleProgramUpdate();
@@ -1152,12 +1152,12 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
11521152
projects.forEach(projectPath => {
11531153
if (configFileName && toPath(configFileName) === projectPath) {
11541154
// If this is the config file of the project, reload completely
1155-
reloadLevel = ConfigFileProgramReloadLevel.Full;
1155+
updateLevel = ProgramUpdateLevel.Full;
11561156
}
11571157
else {
11581158
// Reload config for the referenced projects and remove the resolutions from referenced projects since the config file changed
11591159
const config = parsedConfigs?.get(projectPath);
1160-
if (config) config.reloadLevel = ConfigFileProgramReloadLevel.Full;
1160+
if (config) config.updateLevel = ProgramUpdateLevel.Full;
11611161
resolutionCache.removeResolutionsFromProjectReferenceRedirects(projectPath);
11621162
}
11631163
scheduleProgramUpdate();
@@ -1178,7 +1178,7 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
11781178
(_fileName, eventKind) => {
11791179
updateCachedSystemWithFile(configFileName, configPath, eventKind);
11801180
const config = parsedConfigs?.get(configPath);
1181-
if (config) config.reloadLevel = ConfigFileProgramReloadLevel.Full;
1181+
if (config) config.updateLevel = ProgramUpdateLevel.Full;
11821182
resolutionCache.removeResolutionsFromProjectReferenceRedirects(configPath);
11831183
scheduleProgramUpdate();
11841184
},
@@ -1220,8 +1220,8 @@ export function createWatchProgram<T extends BuilderProgram>(host: WatchCompiler
12201220
) return;
12211221

12221222
// Reload is pending, do the reload
1223-
if (config.reloadLevel !== ConfigFileProgramReloadLevel.Full) {
1224-
config.reloadLevel = ConfigFileProgramReloadLevel.Partial;
1223+
if (config.updateLevel !== ProgramUpdateLevel.Full) {
1224+
config.updateLevel = ProgramUpdateLevel.RootNamesAndUpdate;
12251225

12261226
// Schedule Update the program
12271227
scheduleProgramUpdate();

0 commit comments

Comments
 (0)