From a0b7c2e2701fa55dd085bad8dd7dbac80a71788c Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Tue, 8 Nov 2016 10:23:57 -0800 Subject: [PATCH] Cache react.d.ts library when running tests --- src/harness/harness.ts | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 1dd41f9d81c..ee7a1ccccce 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -922,10 +922,15 @@ namespace Harness { export const defaultLibFileName = "lib.d.ts"; export const es2015DefaultLibFileName = "lib.es2015.d.ts"; + // Cache of lib files from "built/local" const libFileNameSourceFileMap = ts.createMapFromTemplate({ [defaultLibFileName]: createSourceFileAndAssertInvariants(defaultLibFileName, IO.readFile(libFolder + "lib.es5.d.ts"), /*languageVersion*/ ts.ScriptTarget.Latest) }); + // Cache of lib files from "tests/lib/" + const testLibFileNameSourceFileMap = ts.createMap(); + const es6TestLibFileNameSourceFileMap = ts.createMap(); + export function getDefaultLibrarySourceFile(fileName = defaultLibFileName): ts.SourceFile { if (!isDefaultLibraryFile(fileName)) { return undefined; @@ -967,7 +972,8 @@ namespace Harness { useCaseSensitiveFileNames: boolean, // the currentDirectory is needed for rwcRunner to passed in specified current directory to compiler host currentDirectory: string, - newLineKind?: ts.NewLineKind): ts.CompilerHost { + newLineKind?: ts.NewLineKind, + libFiles?: string): ts.CompilerHost { // Local get canonical file name function, that depends on passed in parameter for useCaseSensitiveFileNames const getCanonicalFileName = ts.createGetCanonicalFileName(useCaseSensitiveFileNames); @@ -999,6 +1005,24 @@ namespace Harness { } } + if (libFiles) { + // Because @libFiles don't change between execution. We would cache the result of the files and reuse it to speed help compilation + for (const fileName of libFiles.split(",")) { + const libFileName = "tests/lib/" + fileName; + + if (scriptTarget <= ts.ScriptTarget.ES5) { + if (!testLibFileNameSourceFileMap[libFileName]) { + testLibFileNameSourceFileMap[libFileName] = createSourceFileAndAssertInvariants(libFileName, IO.readFile(libFileName), scriptTarget); + } + } + else { + if (!es6TestLibFileNameSourceFileMap[libFileName]) { + es6TestLibFileNameSourceFileMap[libFileName] = createSourceFileAndAssertInvariants(libFileName, IO.readFile(libFileName), scriptTarget); + } + } + } + } + function getSourceFile(fileName: string) { fileName = ts.normalizePath(fileName); const fromFileMap = fileMap.get(toPath(fileName)); @@ -1010,6 +1034,9 @@ namespace Harness { fourslashSourceFile = fourslashSourceFile || createSourceFileAndAssertInvariants(tsFn, Harness.IO.readFile(tsFn), scriptTarget); return fourslashSourceFile; } + else if (ts.startsWith(fileName, "tests/lib/")) { + return scriptTarget <= ts.ScriptTarget.ES5 ? testLibFileNameSourceFileMap[fileName] : es6TestLibFileNameSourceFileMap[fileName]; + } else { // Don't throw here -- the compiler might be looking for a test that actually doesn't exist as part of the TC // Return if it is other library file, otherwise return undefined @@ -1221,7 +1248,8 @@ namespace Harness { if (options.libFiles) { for (const fileName of options.libFiles.split(",")) { const libFileName = "tests/lib/" + fileName; - programFiles.push({ unitName: libFileName, content: normalizeLineEndings(IO.readFile(libFileName), Harness.IO.newLine()) }); + // Content is undefined here because in createCompilerHost we will create sourceFile for the lib file and cache the result + programFiles.push({ unitName: libFileName, content: undefined }); } } @@ -1234,7 +1262,8 @@ namespace Harness { options.target, useCaseSensitiveFileNames, currentDirectory, - options.newLine); + options.newLine, + options.libFiles); let traceResults: string[]; if (options.traceResolution) {