From 927c10ae318e98f6aef24ef2f790e3a247456e8b Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 8 Mar 2019 10:19:02 -0800 Subject: [PATCH] Add output declaration files from referenced project into program if module: none --- src/compiler/program.ts | 15 ++++--- src/testRunner/unittests/tsbuild/outFile.ts | 43 ++++++++++++++++++++- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 6801a8fa3aa..2f817cfcf96 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -825,11 +825,16 @@ namespace ts { } if (rootNames.length) { for (const parsedRef of resolvedProjectReferences) { - if (parsedRef) { - const out = parsedRef.commandLine.options.outFile || parsedRef.commandLine.options.out; - if (out) { - const dtsOutfile = changeExtension(out, ".d.ts"); - processSourceFile(dtsOutfile, /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, /*packageId*/ undefined); + if (!parsedRef) continue; + const out = parsedRef.commandLine.options.outFile || parsedRef.commandLine.options.out; + if (out) { + processSourceFile(changeExtension(out, ".d.ts"), /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, /*packageId*/ undefined); + } + else if (getEmitModuleKind(parsedRef.commandLine.options) === ModuleKind.None) { + for (const fileName of parsedRef.commandLine.fileNames) { + if (!fileExtensionIs(fileName, Extension.Dts) && hasTSFileExtension(fileName)) { + processSourceFile(getOutputDeclarationFileName(fileName, parsedRef.commandLine), /*isDefaultLib*/ false, /*ignoreNoDefaultLib*/ false, /*packageId*/ undefined); + } } } } diff --git a/src/testRunner/unittests/tsbuild/outFile.ts b/src/testRunner/unittests/tsbuild/outFile.ts index e9b7cdae326..a5c8da66cd1 100644 --- a/src/testRunner/unittests/tsbuild/outFile.ts +++ b/src/testRunner/unittests/tsbuild/outFile.ts @@ -449,7 +449,6 @@ namespace ts { changeCompilerVersion(host); builder.buildAllProjects(); host.assertDiagnosticMessages( - // TODO:: This should build all instead getExpectedDiagnosticForProjectsInBuild(relSources[project.first][source.config], relSources[project.second][source.config], relSources[project.third][source.config]), [Diagnostics.Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2, relSources[project.first][source.config], fakes.version, version], [Diagnostics.Building_project_0, sources[project.first][source.config]], @@ -856,5 +855,47 @@ ${internal} enum internalEnum { a, b, c }`); }); }); }); + + it("non module projects without prepend", () => { + const fs = outFileFs.shadow(); + // No prepend + replaceText(fs, sources[project.third][source.config], `{ "path": "../first", "prepend": true }`, `{ "path": "../first" }`); + replaceText(fs, sources[project.third][source.config], `{ "path": "../second", "prepend": true }`, `{ "path": "../second" }`); + + // Non Modules + replaceText(fs, sources[project.first][source.config], `"composite": true,`, `"composite": true, "module": "none",`); + replaceText(fs, sources[project.second][source.config], `"composite": true,`, `"composite": true, "module": "none",`); + replaceText(fs, sources[project.third][source.config], `"composite": true,`, `"composite": true, "module": "none",`); + + // Own file emit + replaceText(fs, sources[project.first][source.config], `"outFile": "./bin/first-output.js",`, ""); + replaceText(fs, sources[project.second][source.config], `"outFile": "../2/second-output.js",`, ""); + replaceText(fs, sources[project.third][source.config], `"outFile": "./thirdjs/output/third-output.js",`, ""); + + const host = new fakes.SolutionBuilderHost(fs); + const builder = createSolutionBuilder(host); + builder.buildAllProjects(); + host.assertDiagnosticMessages( + getExpectedDiagnosticForProjectsInBuild(relSources[project.first][source.config], relSources[project.second][source.config], relSources[project.third][source.config]), + [Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, relSources[project.first][source.config], "src/first/first_PART1.js"], + [Diagnostics.Building_project_0, sources[project.first][source.config]], + [Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, relSources[project.second][source.config], "src/second/second_part1.js"], + [Diagnostics.Building_project_0, sources[project.second][source.config]], + [Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, relSources[project.third][source.config], "src/third/third_part1.js"], + [Diagnostics.Building_project_0, sources[project.third][source.config]] + ); + const expectedOutputFiles = flatMap(sources, ([config, ts]) => [ + removeFileExtension(config) + Extension.TsBuildInfo, + ...flatMap(ts, f => [ + removeFileExtension(f) + Extension.Js, + removeFileExtension(f) + Extension.Js + ".map", + removeFileExtension(f) + Extension.Dts, + removeFileExtension(f) + Extension.Dts + ".map", + ]) + ]); + for (const output of expectedOutputFiles) { + assert(fs.existsSync(output), `Expect file ${output} to exist`); + } + }); }); }