From 8d99ecfa6caddb9f5a37e1829b11d4811bdb7ce1 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 29 Apr 2015 12:13:35 -0700 Subject: [PATCH 01/40] Add a light=true mode for running tests faster. --- Jakefile.js | 14 ++++--- src/compiler/checker.ts | 5 ++- src/compiler/types.ts | 4 ++ src/harness/compilerRunner.ts | 3 +- src/harness/harness.ts | 5 ++- src/harness/runner.ts | 79 ++++++++++++++++++++--------------- 6 files changed, 66 insertions(+), 44 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index cb53b47950..78622f6728 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -503,9 +503,9 @@ function cleanTestDirs() { } // used to pass data from jake command line directly to run.js -function writeTestConfigFile(tests, testConfigFile) { +function writeTestConfigFile(tests, light, testConfigFile) { console.log('Running test(s): ' + tests); - var testConfigContents = '{\n' + '\ttest: [\'' + tests + '\']\n}'; + var testConfigContents = JSON.stringify({ test: [tests], light: light }); fs.writeFileSync('test.config', testConfigContents); } @@ -521,13 +521,14 @@ task("runtests", ["tests", builtLocalDirectory], function() { cleanTestDirs(); host = "mocha" tests = process.env.test || process.env.tests || process.env.t; + var light = process.env.light || false; var testConfigFile = 'test.config'; if(fs.existsSync(testConfigFile)) { fs.unlinkSync(testConfigFile); } - if(tests) { - writeTestConfigFile(tests, testConfigFile); + if(tests || light) { + writeTestConfigFile(tests, light, testConfigFile); } if (tests && tests.toLocaleLowerCase() === "rwc") { @@ -570,12 +571,13 @@ task("runtests-browser", ["tests", "browserify", builtLocalDirectory], function( port = process.env.port || process.env.p || '8888'; browser = process.env.browser || process.env.b || "IE"; tests = process.env.test || process.env.tests || process.env.t; + var light = process.env.light || false; var testConfigFile = 'test.config'; if(fs.existsSync(testConfigFile)) { fs.unlinkSync(testConfigFile); } - if(tests) { - writeTestConfigFile(tests, testConfigFile); + if(tests || light) { + writeTestConfigFile(tests, light, testConfigFile); } tests = tests ? tests : ''; diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bbfa681d72..03c2fbd963 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10934,7 +10934,10 @@ module ts { function checkSourceFile(node: SourceFile) { let start = new Date().getTime(); - checkSourceFileWorker(node); + let skipCheck = node.fileName.indexOf("lib.d.ts") >= 0 && compilerOptions.noLibCheck; + if (!skipCheck) { + checkSourceFileWorker(node); + } checkTime += new Date().getTime() - start; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 94053a6484..2f4e33a6e8 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1677,6 +1677,10 @@ module ts { separateCompilation?: boolean; emitDecoratorMetadata?: boolean; /* @internal */ stripInternal?: boolean; + + // Skip checking lib.d.ts to help speed up tests. + /* @internal */ noLibCheck?: boolean; + [option: string]: string | number | boolean; } diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index b6997e705b..11822e2fec 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -171,7 +171,6 @@ class CompilerBaselineRunner extends RunnerBase { } }); - it('Correct JS output for ' + fileName, () => { if (!ts.fileExtensionIs(lastUnit.name, '.d.ts') && this.emit) { if (result.files.length === 0 && result.errors.length === 0) { @@ -259,7 +258,7 @@ class CompilerBaselineRunner extends RunnerBase { }); it('Correct type/symbol baselines for ' + fileName, () => { - if (fileName.indexOf("APISample") >= 0) { + if (fileName.indexOf("APISample") >= 0 || lightMode) { return; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 6af77e3d74..70c5cae8c4 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -800,7 +800,7 @@ module Harness { // Only set the parent nodes if we're asserting invariants. We don't need them otherwise. var result = ts.createSourceFile(fileName, sourceText, languageVersion, /*setParentNodes:*/ assertInvariants); if (assertInvariants) { - Utils.assertInvariants(result, /*parent:*/ undefined); + // Utils.assertInvariants(result, /*parent:*/ undefined); } return result; } @@ -937,6 +937,9 @@ module Harness { options.target = options.target || ts.ScriptTarget.ES3; options.module = options.module || ts.ModuleKind.None; options.noErrorTruncation = true; + if (lightMode) { + options.noLibCheck = true; + } if (settingsCallback) { settingsCallback(null); diff --git a/src/harness/runner.ts b/src/harness/runner.ts index 37451639d7..4bcd5643ef 100644 --- a/src/harness/runner.ts +++ b/src/harness/runner.ts @@ -36,43 +36,54 @@ var testconfig = 'test.config'; var testConfigFile = Harness.IO.fileExists(mytestconfig) ? Harness.IO.readFile(mytestconfig) : (Harness.IO.fileExists(testconfig) ? Harness.IO.readFile(testconfig) : ''); +var lightMode: boolean; if (testConfigFile !== '') { // TODO: not sure why this is crashing mocha - //var testConfig = JSON.parse(testConfigRaw); - var testConfig = testConfigFile.match(/test:\s\['(.*)'\]/); - var options = testConfig ? [testConfig[1]] : []; - for (var i = 0; i < options.length; i++) { - switch (options[i]) { - case 'compiler': - runners.push(new CompilerBaselineRunner(CompilerTestType.Conformance)); - runners.push(new CompilerBaselineRunner(CompilerTestType.Regressions)); - runners.push(new ProjectRunner()); - break; - case 'conformance': - runners.push(new CompilerBaselineRunner(CompilerTestType.Conformance)); - break; - case 'project': - runners.push(new ProjectRunner()); - break; - case 'fourslash': - runners.push(new FourSlashRunner(FourSlashTestType.Native)); - break; - case 'fourslash-shims': - runners.push(new FourSlashRunner(FourSlashTestType.Shims)); - break; - case 'fourslash-server': - runners.push(new FourSlashRunner(FourSlashTestType.Server)); - break; - case 'fourslash-generated': - runners.push(new GeneratedFourslashRunner(FourSlashTestType.Native)); - break; - case 'rwc': - runners.push(new RWCRunner()); - break; - case 'test262': - runners.push(new Test262BaselineRunner()); - break; + var testConfig = JSON.parse(testConfigFile); + //var testConfig = testConfigFile.match(/test:\s\['(.*)'\]/); + //var options = testConfig ? [testConfig[1]] : []; + if (testConfig.light) { + lightMode = true; + } + + if (testConfig.test && testConfig.test.length > 0) { + for (let option of testConfig.test) { + if (!option) { + continue; + } + ts.sys.write("Option: " + option + "\r\n"); + switch (option) { + case 'compiler': + runners.push(new CompilerBaselineRunner(CompilerTestType.Conformance)); + runners.push(new CompilerBaselineRunner(CompilerTestType.Regressions)); + runners.push(new ProjectRunner()); + break; + case 'conformance': + runners.push(new CompilerBaselineRunner(CompilerTestType.Conformance)); + break; + case 'project': + runners.push(new ProjectRunner()); + break; + case 'fourslash': + runners.push(new FourSlashRunner(FourSlashTestType.Native)); + break; + case 'fourslash-shims': + runners.push(new FourSlashRunner(FourSlashTestType.Shims)); + break; + case 'fourslash-server': + runners.push(new FourSlashRunner(FourSlashTestType.Server)); + break; + case 'fourslash-generated': + runners.push(new GeneratedFourslashRunner(FourSlashTestType.Native)); + break; + case 'rwc': + runners.push(new RWCRunner()); + break; + case 'test262': + runners.push(new Test262BaselineRunner()); + break; + } } } } From eb15bb36588a6112fbbbab6522fb8abfbdd0d292 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 29 Apr 2015 17:42:28 -0700 Subject: [PATCH 02/40] Use no-default-lib for the '--noLibCheck' flag. --- src/compiler/checker.ts | 4 +++- src/compiler/types.ts | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 03c2fbd963..9b3515d374 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10934,10 +10934,12 @@ module ts { function checkSourceFile(node: SourceFile) { let start = new Date().getTime(); - let skipCheck = node.fileName.indexOf("lib.d.ts") >= 0 && compilerOptions.noLibCheck; + + let skipCheck = node.hasNoDefaultLib && compilerOptions.noLibCheck; if (!skipCheck) { checkSourceFileWorker(node); } + checkTime += new Date().getTime() - start; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 2f4e33a6e8..496153b151 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1004,6 +1004,14 @@ module ts { amdModuleName: string; referencedFiles: FileReference[]; + /** + * lib.d.ts should have a reference comment like + * + * /// + * + * which serves the purpose of ignoring the file in certain ways in the + * presence of compiler options like '--noLib' and '--noLibCheck'. + */ hasNoDefaultLib: boolean; languageVersion: ScriptTarget; @@ -1042,7 +1050,7 @@ module ts { (fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void): void; } - export interface Program extends ScriptReferenceHost { + export interface Program extends ScriptReferenceHost, TypeCheckerHost { /** * Get a list of files in the program */ From e90849d64366eeb8fee45f5d180b877e042d21fb Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 29 Apr 2015 17:54:15 -0700 Subject: [PATCH 03/40] Made parameter mandatory, check type baselines again even in light mode. --- src/harness/compilerRunner.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index 11822e2fec..293b88c65e 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -18,7 +18,7 @@ class CompilerBaselineRunner extends RunnerBase { public options: string; - constructor(public testType?: CompilerTestType) { + constructor(public testType: CompilerTestType) { super(); this.errors = true; this.emit = true; @@ -258,7 +258,7 @@ class CompilerBaselineRunner extends RunnerBase { }); it('Correct type/symbol baselines for ' + fileName, () => { - if (fileName.indexOf("APISample") >= 0 || lightMode) { + if (fileName.indexOf("APISample") >= 0) { return; } From d5d7f9f50408f3de4e28e65285ac76862eae49ba Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 30 Apr 2015 18:14:53 -0700 Subject: [PATCH 04/40] Document/rename flag used in compiler. --- src/compiler/program.ts | 17 ++++++++++++----- src/harness/rwcRunner.ts | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index cc2fe7ff19..f3d7446446 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -143,18 +143,25 @@ module ts { let files: SourceFile[] = []; let filesByName: Map = {}; let diagnostics = createDiagnosticCollection(); - let seenNoDefaultLib = options.noLib; let commonSourceDirectory: string; let diagnosticsProducingTypeChecker: TypeChecker; let noDiagnosticsTypeChecker: TypeChecker; + // shouldExcludeDefaultLib is true if: + // - The '--noLib' flag is used. + // - A 'no-default-lib' reference comment is encountered in + // processing the root files. + let shouldExcludeDefaultLib = options.noLib; + let start = new Date().getTime(); host = host || createCompilerHost(options); - forEach(rootNames, name => processRootFile(name, false)); - if (!seenNoDefaultLib) { - processRootFile(host.getDefaultLibFileName(options), true); + + forEach(rootNames, name => processRootFile(name, /*isDefaultLib */ false)); + if (!shouldExcludeDefaultLib) { + processRootFile(host.getDefaultLibFileName(options), /*isDefaultLib*/ true); } + verifyCompilerOptions(); programTime += new Date().getTime() - start; @@ -360,7 +367,7 @@ module ts { } }); if (file) { - seenNoDefaultLib = seenNoDefaultLib || file.hasNoDefaultLib; + shouldExcludeDefaultLib = shouldExcludeDefaultLib || file.hasNoDefaultLib; // Set the source file for normalized absolute path filesByName[canonicalAbsolutePath] = file; diff --git a/src/harness/rwcRunner.ts b/src/harness/rwcRunner.ts index 49a15112e9..0d56fa7250 100644 --- a/src/harness/rwcRunner.ts +++ b/src/harness/rwcRunner.ts @@ -75,7 +75,7 @@ module RWC { }); // Add files to compilation - for(let fileRead of ioLog.filesRead) { + for (let fileRead of ioLog.filesRead) { // Check if the file is already added into the set of input files. var resolvedPath = ts.normalizeSlashes(ts.sys.resolvePath(fileRead.path)); var inInputList = ts.forEach(inputFiles, inputFile => inputFile.unitName === resolvedPath); From a27de3f7d8986ba87c28bb1d045405e9525dc27b Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 1 May 2015 17:08:48 -0700 Subject: [PATCH 05/40] Moved 'lightMode' flag to Harness. --- src/harness/fourslash.ts | 3 ++- src/harness/harness.ts | 11 ++++++----- src/harness/runner.ts | 4 ++-- src/harness/runnerServer.ts | 17 +++++++++++++++++ src/harness/runnerbase.ts | 2 +- 5 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 src/harness/runnerServer.ts diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index c8f20746a0..ea6fe174ee 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -343,7 +343,8 @@ module FourSlash { if (!resolvedResult.isLibFile) { this.languageServiceAdapterHost.addScript(Harness.Compiler.defaultLibFileName, Harness.Compiler.defaultLibSourceFile.text); } - } else { + } + else { // resolveReference file-option is not specified then do not resolve any files and include all inputFiles ts.forEachKey(this.inputFiles, fileName => { if (!Harness.isLibraryFile(fileName)) { diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 70c5cae8c4..8934ab7094 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -97,7 +97,7 @@ module Utils { } try { - var content = ts.sys.readFile(Harness.userSpecifiedroot + path); + var content = ts.sys.readFile(Harness.userSpecifiedRoot + path); } catch (err) { return undefined; @@ -720,7 +720,8 @@ module Harness { } // Settings - export var userSpecifiedroot = ""; + export let userSpecifiedRoot = ""; + export let lightMode = false; /** Functionality for compiling TypeScript code */ export module Compiler { @@ -1610,9 +1611,9 @@ module Harness { function baselinePath(fileName: string, type: string, baselineFolder: string, subfolder?: string) { if (subfolder !== undefined) { - return Harness.userSpecifiedroot + baselineFolder + '/' + subfolder + '/' + type + '/' + fileName; + return Harness.userSpecifiedRoot + baselineFolder + '/' + subfolder + '/' + type + '/' + fileName; } else { - return Harness.userSpecifiedroot + baselineFolder + '/' + type + '/' + fileName; + return Harness.userSpecifiedRoot + baselineFolder + '/' + type + '/' + fileName; } } @@ -1728,7 +1729,7 @@ module Harness { } export function getDefaultLibraryFile(): { unitName: string, content: string } { - var libFile = Harness.userSpecifiedroot + Harness.libFolder + "/" + "lib.d.ts"; + var libFile = Harness.userSpecifiedRoot + Harness.libFolder + "/" + "lib.d.ts"; return { unitName: libFile, content: IO.readFile(libFile) diff --git a/src/harness/runner.ts b/src/harness/runner.ts index 4bcd5643ef..1099266105 100644 --- a/src/harness/runner.ts +++ b/src/harness/runner.ts @@ -18,6 +18,7 @@ /// /// /// +/// function runTests(runners: RunnerBase[]) { for (var i = iterations; i > 0; i--) { @@ -36,7 +37,6 @@ var testconfig = 'test.config'; var testConfigFile = Harness.IO.fileExists(mytestconfig) ? Harness.IO.readFile(mytestconfig) : (Harness.IO.fileExists(testconfig) ? Harness.IO.readFile(testconfig) : ''); -var lightMode: boolean; if (testConfigFile !== '') { // TODO: not sure why this is crashing mocha @@ -44,7 +44,7 @@ if (testConfigFile !== '') { //var testConfig = testConfigFile.match(/test:\s\['(.*)'\]/); //var options = testConfig ? [testConfig[1]] : []; if (testConfig.light) { - lightMode = true; + Harness.lightMode = true; } if (testConfig.test && testConfig.test.length > 0) { diff --git a/src/harness/runnerServer.ts b/src/harness/runnerServer.ts new file mode 100644 index 0000000000..bc60e34910 --- /dev/null +++ b/src/harness/runnerServer.ts @@ -0,0 +1,17 @@ + +/// + +import child_process = require("child_process"); + +type RunnerTestSet = string[] + +let testSets: RunnerTestSet[]; + +for (let testSet of testSets) { + let child = child_process.fork("blah!"); + child.on("message", (data: ) => { + + } +} + +function populateRunnerTestSet \ No newline at end of file diff --git a/src/harness/runnerbase.ts b/src/harness/runnerbase.ts index 49ca796448..269e889704 100644 --- a/src/harness/runnerbase.ts +++ b/src/harness/runnerbase.ts @@ -12,7 +12,7 @@ class RunnerBase { } public enumerateFiles(folder: string, regex?: RegExp, options?: { recursive: boolean }): string[] { - return Harness.IO.listFiles(Harness.userSpecifiedroot + folder, regex, { recursive: (options ? options.recursive : false) }); + return Harness.IO.listFiles(Harness.userSpecifiedRoot + folder, regex, { recursive: (options ? options.recursive : false) }); } /** Setup the runner's tests so that they are ready to be executed by the harness From 9fec328778b40f6dc9e64cff6dbaab6ce7a387fc Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 1 May 2015 17:13:28 -0700 Subject: [PATCH 06/40] Moved gargantuan arrow function that obstructed the actual logic of the method. --- src/harness/harness.ts | 54 ++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 8934ab7094..5e905d999d 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -953,7 +953,32 @@ module Harness { var includeBuiltFiles: { unitName: string; content: string }[] = []; var useCaseSensitiveFileNames = ts.sys.useCaseSensitiveFileNames; - this.settings.forEach(setting => { + this.settings.forEach(setOptionForSetting); + + var fileOutputs: GeneratedFile[] = []; + + var programFiles = inputFiles.concat(includeBuiltFiles).map(file => file.unitName); + var program = ts.createProgram(programFiles, options, createCompilerHost(inputFiles.concat(includeBuiltFiles).concat(otherFiles), + (fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark }), + options.target, useCaseSensitiveFileNames, currentDirectory)); + + var emitResult = program.emit(); + + var errors: HarnessDiagnostic[] = []; + ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics).forEach(err => { + // TODO: new compiler formats errors after this point to add . and newlines so we'll just do it manually for now + errors.push(getMinimalDiagnostic(err)); + }); + this.lastErrors = errors; + + var result = new CompilerResult(fileOutputs, errors, program, ts.sys.getCurrentDirectory(), emitResult.sourceMaps); + onComplete(result, program); + + // reset what newline means in case the last test changed it + ts.sys.newLine = newLine; + return options; + + function setOptionForSetting(setting: Harness.TestCaseParser.CompilerSetting) { switch (setting.flag.toLowerCase()) { // "fileName", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outdir", "noimplicitany", "noresolve" case "module": @@ -1084,7 +1109,7 @@ module Harness { case 'inlinesourcemap': options.inlineSourceMap = setting.value === 'true'; break; - + case 'inlinesources': options.inlineSources = setting.value === 'true'; break; @@ -1092,30 +1117,7 @@ module Harness { default: throw new Error('Unsupported compiler setting ' + setting.flag); } - }); - - var fileOutputs: GeneratedFile[] = []; - - var programFiles = inputFiles.concat(includeBuiltFiles).map(file => file.unitName); - var program = ts.createProgram(programFiles, options, createCompilerHost(inputFiles.concat(includeBuiltFiles).concat(otherFiles), - (fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark }), - options.target, useCaseSensitiveFileNames, currentDirectory)); - - var emitResult = program.emit(); - - var errors: HarnessDiagnostic[] = []; - ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics).forEach(err => { - // TODO: new compiler formats errors after this point to add . and newlines so we'll just do it manually for now - errors.push(getMinimalDiagnostic(err)); - }); - this.lastErrors = errors; - - var result = new CompilerResult(fileOutputs, errors, program, ts.sys.getCurrentDirectory(), emitResult.sourceMaps); - onComplete(result, program); - - // reset what newline means in case the last test changed it - ts.sys.newLine = newLine; - return options; + } } public compileDeclarationFiles(inputFiles: { unitName: string; content: string; }[], From 58e21caa4a2c3636a23f7ae5be571d0794d97f47 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 4 May 2015 16:53:34 -0700 Subject: [PATCH 07/40] Removed 'fileMetadataNames'. --- src/harness/harness.ts | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index ad91c4e28d..bc0ddbce14 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1509,15 +1509,6 @@ module Harness { // Regex for parsing options in the format "@Alpha: Value of any sort" var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines - // List of allowed metadata names - var fileMetadataNames = ["filename", "comments", "declaration", "module", - "nolib", "sourcemap", "target", "out", "outdir", "noemithelpers", "noemitonerror", - "noimplicitany", "noresolve", "newline", "normalizenewline", "emitbom", - "errortruncation", "usecasesensitivefilenames", "preserveconstenums", - "includebuiltfile", "suppressimplicitanyindexerrors", "stripinternal", - "separatecompilation", "inlinesourcemap", "maproot", "sourceroot", - "inlinesources", "emitdecoratormetadata"]; - function extractCompilerSettings(content: string): CompilerSetting[] { var opts: CompilerSetting[] = []; @@ -1551,10 +1542,8 @@ module Harness { if (testMetaData) { // Comment line, check for global/file @options and record them optionRegex.lastIndex = 0; - var fileNameIndex = fileMetadataNames.indexOf(testMetaData[1].toLowerCase()); - if (fileNameIndex === -1) { - throw new Error('Unrecognized metadata name "' + testMetaData[1] + '". Available file metadata names are: ' + fileMetadataNames.join(', ')); - } else if (fileNameIndex === 0) { + var metaDataName = testMetaData[1].toLowerCase(); + if (metaDataName === "filename") { currentFileOptions[testMetaData[1]] = testMetaData[2]; } else { continue; From d2857751b250ecc3041c4fba230ac8bc379478f4 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 5 May 2015 17:27:31 -0700 Subject: [PATCH 08/40] Always include 'lib.d.ts' last in tests unless '@noLib' is specified. --- src/compiler/checker.ts | 2 ++ src/harness/harness.ts | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6b889e58e5..47e1828711 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10958,6 +10958,8 @@ module ts { function checkSourceFile(node: SourceFile) { let start = new Date().getTime(); + // Check whether the file has declared it is the default lib, + // and whether the user has specifically chosen to avoid checking it. let skipCheck = node.hasNoDefaultLib && compilerOptions.noLibCheck; if (!skipCheck) { checkSourceFileWorker(node); diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 024a9748aa..4aa2775b24 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -962,12 +962,19 @@ module Harness { var includeBuiltFiles: { unitName: string; content: string }[] = []; var useCaseSensitiveFileNames = ts.sys.useCaseSensitiveFileNames; - this.settings.forEach(setOptionForSetting); + this.settings.forEach(setCompilerOptionForSetting); var fileOutputs: GeneratedFile[] = []; var programFiles = inputFiles.concat(includeBuiltFiles).map(file => file.unitName); - var program = ts.createProgram(programFiles, options, createCompilerHost(inputFiles.concat(includeBuiltFiles).concat(otherFiles), + if (!options.noLib) { + // Unless the user doesn't want a default lib at all, + // always push the default lib in *last* to normalize the type/symbol baselines. + programFiles.push(defaultLibFileName); + } + + var program = ts.createProgram(programFiles, options, + createCompilerHost(inputFiles.concat(includeBuiltFiles).concat(otherFiles), (fn, contents, writeByteOrderMark) => fileOutputs.push({ fileName: fn, code: contents, writeByteOrderMark: writeByteOrderMark }), options.target, useCaseSensitiveFileNames, currentDirectory, options.newLine)); @@ -986,8 +993,8 @@ module Harness { // reset what newline means in case the last test changed it ts.sys.newLine = newLine; return options; - - function setOptionForSetting(setting: Harness.TestCaseParser.CompilerSetting) { + + function setCompilerOptionForSetting(setting: Harness.TestCaseParser.CompilerSetting) { switch (setting.flag.toLowerCase()) { // "fileName", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outdir", "noimplicitany", "noresolve" case "module": From 8add21446b1cf7f13d52e0a2d3aa2c3cb6d56691 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 5 May 2015 17:29:49 -0700 Subject: [PATCH 09/40] Update tests to use '@noLib: true'. --- tests/cases/compiler/noDefaultLib.ts | 1 + tests/cases/conformance/decorators/1.0lib-noErrors.ts | 1 + .../parser/ecmascript5/RegressionTests/parser509698.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/tests/cases/compiler/noDefaultLib.ts b/tests/cases/compiler/noDefaultLib.ts index 92c8a63fc6..718f5e216b 100644 --- a/tests/cases/compiler/noDefaultLib.ts +++ b/tests/cases/compiler/noDefaultLib.ts @@ -1,3 +1,4 @@ +// @noLib: true /// var x; diff --git a/tests/cases/conformance/decorators/1.0lib-noErrors.ts b/tests/cases/conformance/decorators/1.0lib-noErrors.ts index 6966e3e70d..c070dd6966 100644 --- a/tests/cases/conformance/decorators/1.0lib-noErrors.ts +++ b/tests/cases/conformance/decorators/1.0lib-noErrors.ts @@ -1,4 +1,5 @@ // @target: ES5 +// @noLib: true /* ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use diff --git a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509698.ts b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509698.ts index f33abc85b5..bf79508456 100644 --- a/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509698.ts +++ b/tests/cases/conformance/parser/ecmascript5/RegressionTests/parser509698.ts @@ -1,3 +1,4 @@ +// @noLib: true ///