Merge pull request #24206 from Microsoft/documentRegistery

Cache the latest source file from document registery in script info so that we do not have to reparse orphan script info
This commit is contained in:
Sheetal Nandi
2018-05-22 12:11:16 -07:00
committed by GitHub
5 changed files with 167 additions and 15 deletions
+44 -7
View File
@@ -87,9 +87,18 @@ namespace ts {
releaseDocumentWithKey(path: Path, key: DocumentRegistryBucketKey): void;
/*@internal*/
getLanguageServiceRefCounts(path: Path): [string, number | undefined][];
reportStats(): string;
}
/*@internal*/
export interface ExternalDocumentCache {
setDocument(key: DocumentRegistryBucketKey, path: Path, sourceFile: SourceFile): void;
getDocument(key: DocumentRegistryBucketKey, path: Path): SourceFile | undefined;
}
export type DocumentRegistryBucketKey = string & { __bucketKey: any };
interface DocumentRegistryEntry {
@@ -99,10 +108,14 @@ namespace ts {
// language services are referencing the file, then the file can be removed from the
// registry.
languageServiceRefCount: number;
owners: string[];
}
export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory = ""): DocumentRegistry {
export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string): DocumentRegistry {
return createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory);
}
/*@internal*/
export function createDocumentRegistryInternal(useCaseSensitiveFileNames?: boolean, currentDirectory = "", externalCache?: ExternalDocumentCache): DocumentRegistry {
// Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have
// for those settings.
const buckets = createMap<Map<DocumentRegistryEntry>>();
@@ -123,12 +136,11 @@ namespace ts {
function reportStats() {
const bucketInfoArray = arrayFrom(buckets.keys()).filter(name => name && name.charAt(0) === "_").map(name => {
const entries = buckets.get(name);
const sourceFiles: { name: string; refCount: number; references: string[]; }[] = [];
const sourceFiles: { name: string; refCount: number; }[] = [];
entries.forEach((entry, name) => {
sourceFiles.push({
name,
refCount: entry.languageServiceRefCount,
references: entry.owners.slice(0)
refCount: entry.languageServiceRefCount
});
});
sourceFiles.sort((x, y) => y.refCount - x.refCount);
@@ -173,14 +185,27 @@ namespace ts {
const bucket = getBucketForCompilationSettings(key, /*createIfMissing*/ true);
let entry = bucket.get(path);
const scriptTarget = scriptKind === ScriptKind.JSON ? ScriptTarget.JSON : compilationSettings.target;
if (!entry && externalCache) {
const sourceFile = externalCache.getDocument(key, path);
if (sourceFile) {
Debug.assert(acquiring);
entry = {
sourceFile,
languageServiceRefCount: 0
};
bucket.set(path, entry);
}
}
if (!entry) {
// Have never seen this file with these settings. Create a new source file for it.
const sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, scriptTarget, version, /*setNodeParents*/ false, scriptKind);
if (externalCache) {
externalCache.setDocument(key, path, sourceFile);
}
entry = {
sourceFile,
languageServiceRefCount: 1,
owners: []
};
bucket.set(path, entry);
}
@@ -191,6 +216,9 @@ namespace ts {
if (entry.sourceFile.version !== version) {
entry.sourceFile = updateLanguageServiceSourceFile(entry.sourceFile, scriptSnapshot, version,
scriptSnapshot.getChangeRange(entry.sourceFile.scriptSnapshot));
if (externalCache) {
externalCache.setDocument(key, path, entry.sourceFile);
}
}
// If we're acquiring, then this is the first time this LS is asking for this document.
@@ -202,6 +230,7 @@ namespace ts {
entry.languageServiceRefCount++;
}
}
Debug.assert(entry.languageServiceRefCount !== 0);
return entry.sourceFile;
}
@@ -225,6 +254,13 @@ namespace ts {
}
}
function getLanguageServiceRefCounts(path: Path) {
return arrayFrom(buckets.entries(), ([key, bucket]): [string, number | undefined] => {
const entry = bucket.get(path);
return [key, entry && entry.languageServiceRefCount];
});
}
return {
acquireDocument,
acquireDocumentWithKey,
@@ -232,6 +268,7 @@ namespace ts {
updateDocumentWithKey,
releaseDocument,
releaseDocumentWithKey,
getLanguageServiceRefCounts,
reportStats,
getKeyForCompilationSettings
};