From a316d17b1f13213db27f2a4dfc05965450107163 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 23 Mar 2020 14:15:32 -0700 Subject: [PATCH 1/2] Sort the arrays of fileNames in the build info Earlier we did this in testing to ensure we could baseline now moved to actual build info writing Fixes #37156 --- src/compiler/builder.ts | 38 ++++++++++--------- src/harness/fakesHosts.ts | 32 ---------------- ...ng-setup-correctly-and-reports-no-error.js | 16 ++++---- ...based-projects-and-emits-them-correctly.js | 12 +++--- ...ved-json-files-and-emits-them-correctly.js | 4 +- ...zed-module-specifiers-resolve-correctly.js | 18 ++++----- ...ting-json-module-from-project-reference.js | 4 +- .../demo/updates-with-circular-reference.js | 16 ++++---- 8 files changed, 55 insertions(+), 85 deletions(-) diff --git a/src/compiler/builder.ts b/src/compiler/builder.ts index a58b9bf7f3690..db3a5751b656b 100644 --- a/src/compiler/builder.ts +++ b/src/compiler/builder.ts @@ -710,37 +710,39 @@ namespace ts { }; if (state.referencedMap) { const referencedMap: MapLike = {}; - state.referencedMap.forEach((value, key) => { - referencedMap[relativeToBuildInfo(key)] = arrayFrom(value.keys(), relativeToBuildInfo); - }); + for (const key of arrayFrom(state.referencedMap.keys()).sort()) { + referencedMap[relativeToBuildInfo(key)] = arrayFrom(state.referencedMap.get(key)!.keys(), relativeToBuildInfo).sort(); + } result.referencedMap = referencedMap; } if (state.exportedModulesMap) { const exportedModulesMap: MapLike = {}; - state.exportedModulesMap.forEach((value, key) => { + for (const key of arrayFrom(state.exportedModulesMap.keys()).sort()) { const newValue = state.currentAffectedFilesExportedModulesMap && state.currentAffectedFilesExportedModulesMap.get(key); // Not in temporary cache, use existing value - if (newValue === undefined) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(value.keys(), relativeToBuildInfo); + if (newValue === undefined) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(state.exportedModulesMap.get(key)!.keys(), relativeToBuildInfo).sort(); // Value in cache and has updated value map, use that - else if (newValue) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(newValue.keys(), relativeToBuildInfo); - }); + else if (newValue) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(newValue.keys(), relativeToBuildInfo).sort(); + } result.exportedModulesMap = exportedModulesMap; } if (state.semanticDiagnosticsPerFile) { const semanticDiagnosticsPerFile: ProgramBuildInfoDiagnostic[] = []; - // Currently not recording actual errors since those mean no emit for tsc --build - state.semanticDiagnosticsPerFile.forEach((value, key) => semanticDiagnosticsPerFile.push( - value.length ? - [ - relativeToBuildInfo(key), - state.hasReusableDiagnostic ? - value as readonly ReusableDiagnostic[] : - convertToReusableDiagnostics(value as readonly Diagnostic[], relativeToBuildInfo) - ] : - relativeToBuildInfo(key) - )); + for (const key of arrayFrom(state.semanticDiagnosticsPerFile.keys()).sort()) { + const value = state.semanticDiagnosticsPerFile.get(key)!; + semanticDiagnosticsPerFile.push( + value.length ? + [ + relativeToBuildInfo(key), + state.hasReusableDiagnostic ? + value as readonly ReusableDiagnostic[] : + convertToReusableDiagnostics(value as readonly Diagnostic[], relativeToBuildInfo) + ] : + relativeToBuildInfo(key) + ); + } result.semanticDiagnosticsPerFile = semanticDiagnosticsPerFile; } diff --git a/src/harness/fakesHosts.ts b/src/harness/fakesHosts.ts index e34892e295047..8d7db1d333cb3 100644 --- a/src/harness/fakesHosts.ts +++ b/src/harness/fakesHosts.ts @@ -496,37 +496,6 @@ ${indentText}${text}`; return text; } - function compareProgramBuildInfoDiagnostic(a: ts.ProgramBuildInfoDiagnostic, b: ts.ProgramBuildInfoDiagnostic) { - return ts.compareStringsCaseSensitive(ts.isString(a) ? a : a[0], ts.isString(b) ? b : b[0]); - } - - export function sanitizeBuildInfoProgram(buildInfo: ts.BuildInfo) { - if (buildInfo.program) { - // reference Map - if (buildInfo.program.referencedMap) { - const referencedMap: ts.MapLike = {}; - for (const path of ts.getOwnKeys(buildInfo.program.referencedMap).sort()) { - referencedMap[path] = buildInfo.program.referencedMap[path].sort(); - } - buildInfo.program.referencedMap = referencedMap; - } - - // exportedModulesMap - if (buildInfo.program.exportedModulesMap) { - const exportedModulesMap: ts.MapLike = {}; - for (const path of ts.getOwnKeys(buildInfo.program.exportedModulesMap).sort()) { - exportedModulesMap[path] = buildInfo.program.exportedModulesMap[path].sort(); - } - buildInfo.program.exportedModulesMap = exportedModulesMap; - } - - // semanticDiagnosticsPerFile - if (buildInfo.program.semanticDiagnosticsPerFile) { - buildInfo.program.semanticDiagnosticsPerFile.sort(compareProgramBuildInfoDiagnostic); - } - } - } - export const version = "FakeTSVersion"; export function patchHostForBuildInfoReadWrite(sys: T) { @@ -547,7 +516,6 @@ ${indentText}${text}`; sys.writeFile = (fileName: string, content: string, writeByteOrderMark: boolean) => { if (!ts.isBuildInfoFile(fileName)) return originalWriteFile.call(sys, fileName, content, writeByteOrderMark); const buildInfo = ts.getBuildInfo(content); - sanitizeBuildInfoProgram(buildInfo); buildInfo.version = version; originalWriteFile.call(sys, fileName, ts.getBuildInfoText(buildInfo), writeByteOrderMark); }; diff --git a/tests/baselines/reference/tsbuild/demo/initial-build/in-master-branch-with-everything-setup-correctly-and-reports-no-error.js b/tests/baselines/reference/tsbuild/demo/initial-build/in-master-branch-with-everything-setup-correctly-and-reports-no-error.js index f9cf45a63ea45..41e23958e3e19 100644 --- a/tests/baselines/reference/tsbuild/demo/initial-build/in-master-branch-with-everything-setup-correctly-and-reports-no-error.js +++ b/tests/baselines/reference/tsbuild/demo/initial-build/in-master-branch-with-everything-setup-correctly-and-reports-no-error.js @@ -242,35 +242,35 @@ exports.lastElementOf = lastElementOf; "configFilePath": "../../zoo/tsconfig.json" }, "referencedMap": { - "../../zoo/zoo.ts": [ - "../animals/index.d.ts" - ], "../animals/dog.d.ts": [ "../animals/index.d.ts" ], "../animals/index.d.ts": [ "../animals/animal.d.ts", "../animals/dog.d.ts" + ], + "../../zoo/zoo.ts": [ + "../animals/index.d.ts" ] }, "exportedModulesMap": { - "../../zoo/zoo.ts": [ - "../animals/index.d.ts" - ], "../animals/dog.d.ts": [ "../animals/index.d.ts" ], "../animals/index.d.ts": [ "../animals/animal.d.ts", "../animals/dog.d.ts" + ], + "../../zoo/zoo.ts": [ + "../animals/index.d.ts" ] }, "semanticDiagnosticsPerFile": [ "../../../lib/lib.d.ts", - "../../zoo/zoo.ts", "../animals/animal.d.ts", "../animals/dog.d.ts", - "../animals/index.d.ts" + "../animals/index.d.ts", + "../../zoo/zoo.ts" ] }, "version": "FakeTSVersion" diff --git a/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-and-emits-them-correctly.js b/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-and-emits-them-correctly.js index 4957a2b418f30..6941998e0e5e2 100644 --- a/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-and-emits-them-correctly.js +++ b/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-and-emits-them-correctly.js @@ -38,8 +38,8 @@ module.exports = {}; "referencedMap": {}, "exportedModulesMap": {}, "semanticDiagnosticsPerFile": [ - "../../src/common/nominal.js", - "../lib.d.ts" + "../lib.d.ts", + "../../src/common/nominal.js" ] }, "version": "FakeTSVersion" @@ -98,9 +98,9 @@ exports.__esModule = true; }, "exportedModulesMap": {}, "semanticDiagnosticsPerFile": [ - "../../src/sub-project/index.js", "../common/nominal.d.ts", - "../lib.d.ts" + "../lib.d.ts", + "../../src/sub-project/index.js" ] }, "version": "FakeTSVersion" @@ -163,9 +163,9 @@ exports.getVar = getVar; }, "exportedModulesMap": {}, "semanticDiagnosticsPerFile": [ - "../../src/sub-project-2/index.js", "../lib.d.ts", - "../sub-project/index.d.ts" + "../sub-project/index.d.ts", + "../../src/sub-project-2/index.js" ] }, "version": "FakeTSVersion" diff --git a/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-with-non-moved-json-files-and-emits-them-correctly.js b/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-with-non-moved-json-files-and-emits-them-correctly.js index 21446ecab66bf..8bd559c211fe6 100644 --- a/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-with-non-moved-json-files-and-emits-them-correctly.js +++ b/tests/baselines/reference/tsbuild/javascriptProjectEmit/initial-build/loads-js-based-projects-with-non-moved-json-files-and-emits-them-correctly.js @@ -134,8 +134,8 @@ exports.getVar = getVar; "exportedModulesMap": {}, "semanticDiagnosticsPerFile": [ "../../lib/lib.d.ts", - "../../src/sub-project-2/index.js", - "../sub-project/index.d.ts" + "../sub-project/index.d.ts", + "../../src/sub-project-2/index.js" ] }, "version": "FakeTSVersion" diff --git a/tests/baselines/reference/tsbuild/moduleSpecifiers/initial-build/synthesized-module-specifiers-resolve-correctly.js b/tests/baselines/reference/tsbuild/moduleSpecifiers/initial-build/synthesized-module-specifiers-resolve-correctly.js index df1bab129b9bc..1fc2f79fa2aa5 100644 --- a/tests/baselines/reference/tsbuild/moduleSpecifiers/initial-build/synthesized-module-specifiers-resolve-correctly.js +++ b/tests/baselines/reference/tsbuild/moduleSpecifiers/initial-build/synthesized-module-specifiers-resolve-correctly.js @@ -109,8 +109,8 @@ exports.__esModule = true; }, "semanticDiagnosticsPerFile": [ "../../../../lib/lib.d.ts", - "../../../solution/sub-project/index.ts", - "../common/nominal.d.ts" + "../common/nominal.d.ts", + "../../../solution/sub-project/index.ts" ] }, "version": "FakeTSVersion" @@ -166,26 +166,26 @@ exports.getVar = getVar; "configFilePath": "../../../solution/sub-project-2/tsconfig.json" }, "referencedMap": { - "../../../solution/sub-project-2/index.ts": [ - "../sub-project/index.d.ts" - ], "../sub-project/index.d.ts": [ "../common/nominal.d.ts" + ], + "../../../solution/sub-project-2/index.ts": [ + "../sub-project/index.d.ts" ] }, "exportedModulesMap": { - "../../../solution/sub-project-2/index.ts": [ + "../sub-project/index.d.ts": [ "../common/nominal.d.ts" ], - "../sub-project/index.d.ts": [ + "../../../solution/sub-project-2/index.ts": [ "../common/nominal.d.ts" ] }, "semanticDiagnosticsPerFile": [ "../../../../lib/lib.d.ts", - "../../../solution/sub-project-2/index.ts", "../common/nominal.d.ts", - "../sub-project/index.d.ts" + "../sub-project/index.d.ts", + "../../../solution/sub-project-2/index.ts" ] }, "version": "FakeTSVersion" diff --git a/tests/baselines/reference/tsbuild/resolveJsonModule/initial-build/importing-json-module-from-project-reference.js b/tests/baselines/reference/tsbuild/resolveJsonModule/initial-build/importing-json-module-from-project-reference.js index 732641d809e15..8709ca68378cb 100644 --- a/tests/baselines/reference/tsbuild/resolveJsonModule/initial-build/importing-json-module-from-project-reference.js +++ b/tests/baselines/reference/tsbuild/resolveJsonModule/initial-build/importing-json-module-from-project-reference.js @@ -61,8 +61,8 @@ console.log(foo_json_1.foo); "exportedModulesMap": {}, "semanticDiagnosticsPerFile": [ "../../lib/lib.d.ts", - "../strings/foo.json", - "./index.ts" + "./index.ts", + "../strings/foo.json" ] }, "version": "FakeTSVersion" diff --git a/tests/baselines/reference/tsbuild/watchMode/demo/updates-with-circular-reference.js b/tests/baselines/reference/tsbuild/watchMode/demo/updates-with-circular-reference.js index c2a769b194704..c86cbdb686ea7 100644 --- a/tests/baselines/reference/tsbuild/watchMode/demo/updates-with-circular-reference.js +++ b/tests/baselines/reference/tsbuild/watchMode/demo/updates-with-circular-reference.js @@ -454,35 +454,35 @@ export declare function createZoo(): Array; "configFilePath": "../../zoo/tsconfig.json" }, "referencedMap": { - "../../zoo/zoo.ts": [ - "../animals/index.d.ts" - ], "../animals/dog.d.ts": [ "../animals/index.d.ts" ], "../animals/index.d.ts": [ "../animals/animal.d.ts", "../animals/dog.d.ts" + ], + "../../zoo/zoo.ts": [ + "../animals/index.d.ts" ] }, "exportedModulesMap": { - "../../zoo/zoo.ts": [ - "../animals/index.d.ts" - ], "../animals/dog.d.ts": [ "../animals/index.d.ts" ], "../animals/index.d.ts": [ "../animals/animal.d.ts", "../animals/dog.d.ts" + ], + "../../zoo/zoo.ts": [ + "../animals/index.d.ts" ] }, "semanticDiagnosticsPerFile": [ "../../../../../../a/lib/lib.d.ts", - "../../zoo/zoo.ts", "../animals/animal.d.ts", "../animals/dog.d.ts", - "../animals/index.d.ts" + "../animals/index.d.ts", + "../../zoo/zoo.ts" ] }, "version": "FakeTSVersion" From 1f2dd08f6dc6b4b75b00dd6545927f3deeac93a1 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 25 Mar 2020 13:31:10 -0700 Subject: [PATCH 2/2] Sort using compareStringsCaseSensitive --- src/compiler/builder.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/compiler/builder.ts b/src/compiler/builder.ts index db3a5751b656b..b003c676a6e79 100644 --- a/src/compiler/builder.ts +++ b/src/compiler/builder.ts @@ -710,27 +710,27 @@ namespace ts { }; if (state.referencedMap) { const referencedMap: MapLike = {}; - for (const key of arrayFrom(state.referencedMap.keys()).sort()) { - referencedMap[relativeToBuildInfo(key)] = arrayFrom(state.referencedMap.get(key)!.keys(), relativeToBuildInfo).sort(); + for (const key of arrayFrom(state.referencedMap.keys()).sort(compareStringsCaseSensitive)) { + referencedMap[relativeToBuildInfo(key)] = arrayFrom(state.referencedMap.get(key)!.keys(), relativeToBuildInfo).sort(compareStringsCaseSensitive); } result.referencedMap = referencedMap; } if (state.exportedModulesMap) { const exportedModulesMap: MapLike = {}; - for (const key of arrayFrom(state.exportedModulesMap.keys()).sort()) { + for (const key of arrayFrom(state.exportedModulesMap.keys()).sort(compareStringsCaseSensitive)) { const newValue = state.currentAffectedFilesExportedModulesMap && state.currentAffectedFilesExportedModulesMap.get(key); // Not in temporary cache, use existing value - if (newValue === undefined) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(state.exportedModulesMap.get(key)!.keys(), relativeToBuildInfo).sort(); + if (newValue === undefined) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(state.exportedModulesMap.get(key)!.keys(), relativeToBuildInfo).sort(compareStringsCaseSensitive); // Value in cache and has updated value map, use that - else if (newValue) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(newValue.keys(), relativeToBuildInfo).sort(); + else if (newValue) exportedModulesMap[relativeToBuildInfo(key)] = arrayFrom(newValue.keys(), relativeToBuildInfo).sort(compareStringsCaseSensitive); } result.exportedModulesMap = exportedModulesMap; } if (state.semanticDiagnosticsPerFile) { const semanticDiagnosticsPerFile: ProgramBuildInfoDiagnostic[] = []; - for (const key of arrayFrom(state.semanticDiagnosticsPerFile.keys()).sort()) { + for (const key of arrayFrom(state.semanticDiagnosticsPerFile.keys()).sort(compareStringsCaseSensitive)) { const value = state.semanticDiagnosticsPerFile.get(key)!; semanticDiagnosticsPerFile.push( value.length ?