Triple slash references must resolve against the resolved file name (.d.ts and not original source file) since they are rewritten in the .d.ts emit (#39645)

* Add tests corresponding to repro from #37928

* Triple slash references must resolve against the resolved file name (.d.ts and not original source file) since they are rewritten in the .d.ts emit

* Remove the scenario not fixed in this PR
This commit is contained in:
Sheetal Nandi
2020-07-17 16:25:32 -07:00
committed by GitHub
parent 92f41c81fb
commit 3b22339df8
6 changed files with 545 additions and 2 deletions

View File

@@ -37470,7 +37470,7 @@ namespace ts {
if (fileToDirective.has(file.path)) return;
fileToDirective.set(file.path, key);
for (const { fileName } of file.referencedFiles) {
const resolvedFile = resolveTripleslashReference(fileName, file.originalFileName);
const resolvedFile = resolveTripleslashReference(fileName, file.fileName);
const referencedFile = host.getSourceFile(resolvedFile);
if (referencedFile) {
addReferencedFilesToTypeDirective(referencedFile, key);

View File

@@ -2667,7 +2667,7 @@ namespace ts {
return;
}
forEach(file.referencedFiles, (ref, index) => {
const referencedFileName = resolveTripleslashReference(ref.fileName, file.originalFileName);
const referencedFileName = resolveTripleslashReference(ref.fileName, file.fileName);
processSourceFile(
referencedFileName,
isDefaultLib,

View File

@@ -110,6 +110,7 @@
"unittests/tsbuild/amdModulesWithOut.ts",
"unittests/tsbuild/configFileErrors.ts",
"unittests/tsbuild/containerOnlyReferenced.ts",
"unittests/tsbuild/declarationEmit.ts",
"unittests/tsbuild/demo.ts",
"unittests/tsbuild/emitDeclarationOnly.ts",
"unittests/tsbuild/emptyFiles.ts",

View File

@@ -0,0 +1,79 @@
namespace ts {
describe("unittests:: tsbuild:: declarationEmit", () => {
function getFiles(): vfs.FileSet {
return {
"/src/solution/tsconfig.base.json": JSON.stringify({
compilerOptions: {
rootDir: "./",
outDir: "lib"
}
}),
"/src/solution/tsconfig.json": JSON.stringify({
compilerOptions: { composite: true },
references: [{ path: "./src" }],
include: []
}),
"/src/solution/src/tsconfig.json": JSON.stringify({
compilerOptions: { composite: true },
references: [{ path: "./subProject" }, { path: "./subProject2" }],
include: []
}),
"/src/solution/src/subProject/tsconfig.json": JSON.stringify({
extends: "../../tsconfig.base.json",
compilerOptions: { composite: true },
references: [{ path: "../common" }],
include: ["./index.ts"]
}),
"/src/solution/src/subProject/index.ts": Utils.dedent`
import { Nominal } from '../common/nominal';
export type MyNominal = Nominal<string, 'MyNominal'>;`,
"/src/solution/src/subProject2/tsconfig.json": JSON.stringify({
extends: "../../tsconfig.base.json",
compilerOptions: { composite: true },
references: [{ path: "../subProject" }],
include: ["./index.ts"]
}),
"/src/solution/src/subProject2/index.ts": Utils.dedent`
import { MyNominal } from '../subProject/index';
const variable = {
key: 'value' as MyNominal,
};
export function getVar(): keyof typeof variable {
return 'key';
}`,
"/src/solution/src/common/tsconfig.json": JSON.stringify({
extends: "../../tsconfig.base.json",
compilerOptions: { composite: true },
include: ["./nominal.ts"]
}),
"/src/solution/src/common/nominal.ts": Utils.dedent`
/// <reference path="./types.d.ts" />
export declare type Nominal<T, Name extends string> = MyNominal<T, Name>;`,
"/src/solution/src/common/types.d.ts": Utils.dedent`
declare type MyNominal<T, Name extends string> = T & {
specialKey: Name;
};`,
};
}
verifyTsc({
scenario: "declarationEmit",
subScenario: "when declaration file is referenced through triple slash",
fs: () => loadProjectFromFiles(getFiles()),
commandLineArgs: ["--b", "/src/solution/tsconfig.json", "--verbose"]
});
verifyTsc({
scenario: "declarationEmit",
subScenario: "when declaration file is referenced through triple slash but uses no references",
fs: () => loadProjectFromFiles({
...getFiles(),
"/src/solution/tsconfig.json": JSON.stringify({
extends: "./tsconfig.base.json",
compilerOptions: { composite: true },
include: ["./src/**/*.ts"]
}),
}),
commandLineArgs: ["--b", "/src/solution/tsconfig.json", "--verbose"]
});
});
}