Skip to content

Commit 5576227

Browse files
authored
Merge pull request microsoft#29695 from Microsoft/fixDtsTypeReferenceEmit
Fix type reference dts emit failure
2 parents b7c5c07 + 4756373 commit 5576227

5 files changed

Lines changed: 110 additions & 1 deletion

File tree

src/compiler/checker.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29591,9 +29591,12 @@ namespace ts {
2959129591
return;
2959229592
}
2959329593
const file = host.getSourceFile(resolvedDirective.resolvedFileName)!;
29594-
fileToDirective.set(file.path, key);
29594+
// Add the transitive closure of path references loaded by this file (as long as they are not)
29595+
// part of an existing type reference.
29596+
addReferencedFilesToTypeDirective(file, key);
2959529597
});
2959629598
}
29599+
2959729600
return {
2959829601
getReferencedExportContainer,
2959929602
getReferencedImportDeclaration,
@@ -29752,6 +29755,18 @@ namespace ts {
2975229755
}
2975329756
return false;
2975429757
}
29758+
29759+
function addReferencedFilesToTypeDirective(file: SourceFile, key: string) {
29760+
if (fileToDirective.has(file.path)) return;
29761+
fileToDirective.set(file.path, key);
29762+
for (const { fileName } of file.referencedFiles) {
29763+
const resolvedFile = resolveTripleslashReference(fileName, file.originalFileName);
29764+
const referencedFile = host.getSourceFile(resolvedFile);
29765+
if (referencedFile) {
29766+
addReferencedFilesToTypeDirective(referencedFile, key);
29767+
}
29768+
}
29769+
}
2975529770
}
2975629771

2975729772
function getExternalModuleFileFromDeclaration(declaration: AnyImportOrReExport | ModuleDeclaration | ImportTypeNode): SourceFile | undefined {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//// [tests/cases/conformance/declarationEmit/typeReferenceRelatedFiles.ts] ////
2+
3+
//// [index.d.ts]
4+
/// <reference path="fs.d.ts" />
5+
//// [fs.d.ts]
6+
declare module "fs" {
7+
interface FSWatcher {}
8+
}
9+
//// [package.json]
10+
{
11+
"name": "@types/node",
12+
"version": "1.0.0"
13+
}
14+
//// [main.ts]
15+
/// <reference types="node" />
16+
import { FSWatcher } from "fs";
17+
export function f() {
18+
return {} as FSWatcher;
19+
}
20+
21+
22+
//// [main.js]
23+
"use strict";
24+
exports.__esModule = true;
25+
function f() {
26+
return {};
27+
}
28+
exports.f = f;
29+
30+
31+
//// [main.d.ts]
32+
/// <reference types="node" />
33+
import { FSWatcher } from "fs";
34+
export declare function f(): FSWatcher;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/conformance/declarationEmit/node_modules/@types/node/index.d.ts ===
2+
/// <reference path="fs.d.ts" />
3+
No type information for this code.=== tests/cases/conformance/declarationEmit/node_modules/@types/node/fs.d.ts ===
4+
declare module "fs" {
5+
>"fs" : Symbol("fs", Decl(fs.d.ts, 0, 0))
6+
7+
interface FSWatcher {}
8+
>FSWatcher : Symbol(FSWatcher, Decl(fs.d.ts, 0, 21))
9+
}
10+
=== tests/cases/conformance/declarationEmit/main.ts ===
11+
/// <reference types="node" />
12+
import { FSWatcher } from "fs";
13+
>FSWatcher : Symbol(FSWatcher, Decl(main.ts, 1, 8))
14+
15+
export function f() {
16+
>f : Symbol(f, Decl(main.ts, 1, 31))
17+
18+
return {} as FSWatcher;
19+
>FSWatcher : Symbol(FSWatcher, Decl(main.ts, 1, 8))
20+
}
21+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/conformance/declarationEmit/node_modules/@types/node/index.d.ts ===
2+
/// <reference path="fs.d.ts" />
3+
No type information for this code.=== tests/cases/conformance/declarationEmit/node_modules/@types/node/fs.d.ts ===
4+
declare module "fs" {
5+
>"fs" : typeof import("fs")
6+
7+
interface FSWatcher {}
8+
}
9+
=== tests/cases/conformance/declarationEmit/main.ts ===
10+
/// <reference types="node" />
11+
import { FSWatcher } from "fs";
12+
>FSWatcher : any
13+
14+
export function f() {
15+
>f : () => FSWatcher
16+
17+
return {} as FSWatcher;
18+
>{} as FSWatcher : FSWatcher
19+
>{} : {}
20+
}
21+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @declaration: true
2+
// @filename: node_modules/@types/node/index.d.ts
3+
/// <reference path="fs.d.ts" />
4+
// @filename: node_modules/@types/node/fs.d.ts
5+
declare module "fs" {
6+
interface FSWatcher {}
7+
}
8+
// @filename: node_modules/@types/node/package.json
9+
{
10+
"name": "@types/node",
11+
"version": "1.0.0"
12+
}
13+
// @filename: main.ts
14+
/// <reference types="node" />
15+
import { FSWatcher } from "fs";
16+
export function f() {
17+
return {} as FSWatcher;
18+
}

0 commit comments

Comments
 (0)