diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d5e4b29d44f..ce06e84b2fd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -29591,9 +29591,12 @@ namespace ts { return; } const file = host.getSourceFile(resolvedDirective.resolvedFileName)!; - fileToDirective.set(file.path, key); + // Add the transitive closure of path references loaded by this file (as long as they are not) + // part of an existing type reference. + addReferencedFilesToTypeDirective(file, key); }); } + return { getReferencedExportContainer, getReferencedImportDeclaration, @@ -29752,6 +29755,18 @@ namespace ts { } return false; } + + function addReferencedFilesToTypeDirective(file: SourceFile, key: string) { + if (fileToDirective.has(file.path)) return; + fileToDirective.set(file.path, key); + for (const { fileName } of file.referencedFiles) { + const resolvedFile = resolveTripleslashReference(fileName, file.originalFileName); + const referencedFile = host.getSourceFile(resolvedFile); + if (referencedFile) { + addReferencedFilesToTypeDirective(referencedFile, key); + } + } + } } function getExternalModuleFileFromDeclaration(declaration: AnyImportOrReExport | ModuleDeclaration | ImportTypeNode): SourceFile | undefined { diff --git a/tests/baselines/reference/typeReferenceRelatedFiles.js b/tests/baselines/reference/typeReferenceRelatedFiles.js new file mode 100644 index 00000000000..77cf0a8e16d --- /dev/null +++ b/tests/baselines/reference/typeReferenceRelatedFiles.js @@ -0,0 +1,34 @@ +//// [tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles.ts] //// + +//// [index.d.ts] +/// +//// [fs.d.ts] +declare module "fs" { + interface FSWatcher {} +} +//// [package.json] +{ + "name": "@types/node", + "version": "1.0.0" +} +//// [main.ts] +/// +import { FSWatcher } from "fs"; +export function f() { + return {} as FSWatcher; +} + + +//// [main.js] +"use strict"; +exports.__esModule = true; +function f() { + return {}; +} +exports.f = f; + + +//// [main.d.ts] +/// +import { FSWatcher } from "fs"; +export declare function f(): FSWatcher; diff --git a/tests/baselines/reference/typeReferenceRelatedFiles.symbols b/tests/baselines/reference/typeReferenceRelatedFiles.symbols new file mode 100644 index 00000000000..689125fe0fa --- /dev/null +++ b/tests/baselines/reference/typeReferenceRelatedFiles.symbols @@ -0,0 +1,21 @@ +=== tests/cases/conformance/declarationEmit/node_modules/@types/node/index.d.ts === +/// +No type information for this code.=== tests/cases/conformance/declarationEmit/node_modules/@types/node/fs.d.ts === +declare module "fs" { +>"fs" : Symbol("fs", Decl(fs.d.ts, 0, 0)) + + interface FSWatcher {} +>FSWatcher : Symbol(FSWatcher, Decl(fs.d.ts, 0, 21)) +} +=== tests/cases/conformance/declarationEmit/main.ts === +/// +import { FSWatcher } from "fs"; +>FSWatcher : Symbol(FSWatcher, Decl(main.ts, 1, 8)) + +export function f() { +>f : Symbol(f, Decl(main.ts, 1, 31)) + + return {} as FSWatcher; +>FSWatcher : Symbol(FSWatcher, Decl(main.ts, 1, 8)) +} + diff --git a/tests/baselines/reference/typeReferenceRelatedFiles.types b/tests/baselines/reference/typeReferenceRelatedFiles.types new file mode 100644 index 00000000000..824bde2ab98 --- /dev/null +++ b/tests/baselines/reference/typeReferenceRelatedFiles.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/declarationEmit/node_modules/@types/node/index.d.ts === +/// +No type information for this code.=== tests/cases/conformance/declarationEmit/node_modules/@types/node/fs.d.ts === +declare module "fs" { +>"fs" : typeof import("fs") + + interface FSWatcher {} +} +=== tests/cases/conformance/declarationEmit/main.ts === +/// +import { FSWatcher } from "fs"; +>FSWatcher : any + +export function f() { +>f : () => FSWatcher + + return {} as FSWatcher; +>{} as FSWatcher : FSWatcher +>{} : {} +} + diff --git a/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles.ts b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles.ts new file mode 100644 index 00000000000..f144f15cddb --- /dev/null +++ b/tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles.ts @@ -0,0 +1,18 @@ +// @declaration: true +// @filename: node_modules/@types/node/index.d.ts +/// +// @filename: node_modules/@types/node/fs.d.ts +declare module "fs" { + interface FSWatcher {} +} +// @filename: node_modules/@types/node/package.json +{ + "name": "@types/node", + "version": "1.0.0" +} +// @filename: main.ts +/// +import { FSWatcher } from "fs"; +export function f() { + return {} as FSWatcher; +}