Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use caches similar to buildAll when building incrementally with in watch mode of tsbuild #31128

Merged
merged 2 commits into from Apr 30, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 58 additions & 20 deletions src/compiler/tsbuild.ts
Expand Up @@ -403,10 +403,20 @@ namespace ts {

compilerHost.resolveModuleNames = maybeBind(host, host.resolveModuleNames);
compilerHost.resolveTypeReferenceDirectives = maybeBind(host, host.resolveTypeReferenceDirectives);
let moduleResolutionCache = !compilerHost.resolveModuleNames ? createModuleResolutionCache(currentDirectory, getCanonicalFileName) : undefined;
const moduleResolutionCache = !compilerHost.resolveModuleNames ? createModuleResolutionCache(currentDirectory, getCanonicalFileName) : undefined;
let cacheState: {
originalReadFile: CompilerHost["readFile"];
originalFileExists: CompilerHost["fileExists"];
originalDirectoryExists: CompilerHost["directoryExists"];
originalCreateDirectory: CompilerHost["createDirectory"];
originalWriteFile: CompilerHost["writeFile"] | undefined;
originalReadFileWithCache: CompilerHost["readFile"];
originalGetSourceFile: CompilerHost["getSourceFile"];
originalResolveModuleNames: CompilerHost["resolveModuleNames"];
} | undefined;

const buildInfoChecked = createFileMap<true>(toPath);
let extendedConfigCache: Map<ExtendedConfigCacheEntry> | undefined;
const extendedConfigCache = createMap<ExtendedConfigCacheEntry>();

// Watch state
const builderPrograms = createFileMap<T>(toPath);
Expand Down Expand Up @@ -869,6 +879,7 @@ namespace ts {
diagnostics.removeKey(resolved);

addProjToQueue(resolved, reloadLevel);
enableCache();
}

/**
Expand Down Expand Up @@ -929,6 +940,7 @@ namespace ts {
}
}
else {
disableCache();
reportErrorSummary();
}
}
Expand Down Expand Up @@ -1384,20 +1396,20 @@ namespace ts {
return configFileNames.map(resolveProjectName);
}

function buildAllProjects(): ExitStatus {
if (options.watch) { reportWatchStatus(Diagnostics.Starting_compilation_in_watch_mode); }
// TODO:: In watch mode as well to use caches for incremental build once we can invalidate caches correctly and have right api
// Override readFile for json files and output .d.ts to cache the text
const savedReadFileWithCache = readFileWithCache;
const savedGetSourceFile = compilerHost.getSourceFile;
function enableCache() {
if (cacheState) {
disableCache();
}

const originalReadFileWithCache = readFileWithCache;
const originalGetSourceFile = compilerHost.getSourceFile;

const { originalReadFile, originalFileExists, originalDirectoryExists,
originalCreateDirectory, originalWriteFile, getSourceFileWithCache,
readFileWithCache: newReadFileWithCache
} = changeCompilerHostLikeToUseCache(host, toPath, (...args) => savedGetSourceFile.call(compilerHost, ...args));
} = changeCompilerHostLikeToUseCache(host, toPath, (...args) => originalGetSourceFile.call(compilerHost, ...args));
readFileWithCache = newReadFileWithCache;
compilerHost.getSourceFile = getSourceFileWithCache!;
extendedConfigCache = createMap();

const originalResolveModuleNames = compilerHost.resolveModuleNames;
if (!compilerHost.resolveModuleNames) {
Expand All @@ -1406,6 +1418,41 @@ namespace ts {
loadWithLocalCache<ResolvedModuleFull>(Debug.assertEachDefined(moduleNames), containingFile, redirectedReference, loader);
}

cacheState = {
originalReadFile,
originalFileExists,
originalDirectoryExists,
originalCreateDirectory,
originalWriteFile,
originalReadFileWithCache,
originalGetSourceFile,
originalResolveModuleNames
};
}

function disableCache() {
if (!cacheState) return;

host.readFile = cacheState.originalReadFile;
host.fileExists = cacheState.originalFileExists;
host.directoryExists = cacheState.originalDirectoryExists;
host.createDirectory = cacheState.originalCreateDirectory;
host.writeFile = cacheState.originalWriteFile;
compilerHost.getSourceFile = cacheState.originalGetSourceFile;
readFileWithCache = cacheState.originalReadFileWithCache;
compilerHost.resolveModuleNames = cacheState.originalResolveModuleNames;
extendedConfigCache.clear();
if (moduleResolutionCache) {
moduleResolutionCache.directoryToModuleNameMap.clear();
moduleResolutionCache.moduleNameToDirectoryMap.clear();
}
cacheState = undefined;
}

function buildAllProjects(): ExitStatus {
if (options.watch) { reportWatchStatus(Diagnostics.Starting_compilation_in_watch_mode); }
enableCache();

const graph = getGlobalDependencyGraph();
reportBuildQueue(graph);
let anyFailed = false;
Expand Down Expand Up @@ -1459,16 +1506,7 @@ namespace ts {
anyFailed = anyFailed || !!(buildResult & BuildResultFlags.AnyErrors);
}
reportErrorSummary();
host.readFile = originalReadFile;
host.fileExists = originalFileExists;
host.directoryExists = originalDirectoryExists;
host.createDirectory = originalCreateDirectory;
host.writeFile = originalWriteFile;
compilerHost.getSourceFile = savedGetSourceFile;
readFileWithCache = savedReadFileWithCache;
extendedConfigCache = undefined;
compilerHost.resolveModuleNames = originalResolveModuleNames;
moduleResolutionCache = undefined;
disableCache();
return anyFailed ? ExitStatus.DiagnosticsPresent_OutputsSkipped : ExitStatus.Success;
}

Expand Down