Skip to content

Commit cb4cb7a

Browse files
authored
Check if module reference requires type reference before path reference (microsoft#25385)
1 parent 304d45d commit cb4cb7a

8 files changed

+82
-4
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3747,7 +3747,7 @@ namespace ts {
37473747
const ambientDecls = filter(symbol.declarations, isAmbientModule);
37483748
if (length(ambientDecls)) {
37493749
for (const decl of ambientDecls) {
3750-
context.tracker.trackReferencedAmbientModule(decl);
3750+
context.tracker.trackReferencedAmbientModule(decl, symbol);
37513751
}
37523752
}
37533753
}

src/compiler/transformers/declarations.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,13 @@ namespace ts {
6666
}
6767
}
6868

69-
function trackReferencedAmbientModule(node: ModuleDeclaration) {
69+
function trackReferencedAmbientModule(node: ModuleDeclaration, symbol: Symbol) {
70+
// If it is visible via `// <reference types="..."/>`, then we should just use that
71+
const directives = resolver.getTypeReferenceDirectivesForSymbol(symbol, SymbolFlags.All);
72+
if (length(directives)) {
73+
return recordTypeReferenceDirectivesIfNecessary(directives);
74+
}
75+
// Otherwise we should emit a path-based reference
7076
const container = getSourceFileOfNode(node);
7177
refs.set("" + getOriginalNodeId(container), container);
7278
}

src/compiler/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5316,7 +5316,7 @@ namespace ts {
53165316
reportPrivateInBaseOfClassExpression?(propertyName: string): void;
53175317
reportInaccessibleUniqueSymbolError?(): void;
53185318
moduleResolverHost?: ModuleSpecifierResolutionHost;
5319-
trackReferencedAmbientModule?(decl: ModuleDeclaration): void;
5319+
trackReferencedAmbientModule?(decl: ModuleDeclaration, symbol: Symbol): void;
53205320
}
53215321

53225322
export interface TextSpan {

tests/baselines/reference/api/tsserverlibrary.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4497,7 +4497,7 @@ declare namespace ts {
44974497
reportPrivateInBaseOfClassExpression?(propertyName: string): void;
44984498
reportInaccessibleUniqueSymbolError?(): void;
44994499
moduleResolverHost?: ModuleSpecifierResolutionHost;
4500-
trackReferencedAmbientModule?(decl: ModuleDeclaration): void;
4500+
trackReferencedAmbientModule?(decl: ModuleDeclaration, symbol: Symbol): void;
45014501
}
45024502
interface TextSpan {
45034503
start: number;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//// [tests/cases/compiler/referenceTypesPreferedToPathIfPossible.ts] ////
2+
3+
//// [index.d.ts]
4+
declare module "url" {
5+
export class Url {}
6+
export function parse(): Url;
7+
}
8+
//// [usage.ts]
9+
import { parse } from "url";
10+
export const thing = () => parse();
11+
12+
13+
//// [usage.js]
14+
"use strict";
15+
exports.__esModule = true;
16+
var url_1 = require("url");
17+
exports.thing = function () { return url_1.parse(); };
18+
19+
20+
//// [usage.d.ts]
21+
/// <reference types="node" />
22+
export declare const thing: () => import("url").Url;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
=== tests/cases/compiler/usage.ts ===
2+
import { parse } from "url";
3+
>parse : Symbol(parse, Decl(usage.ts, 0, 8))
4+
5+
export const thing = () => parse();
6+
>thing : Symbol(thing, Decl(usage.ts, 1, 12))
7+
>parse : Symbol(parse, Decl(usage.ts, 0, 8))
8+
9+
=== node_modules/@types/node/index.d.ts ===
10+
declare module "url" {
11+
>"url" : Symbol("url", Decl(index.d.ts, 0, 0))
12+
13+
export class Url {}
14+
>Url : Symbol(Url, Decl(index.d.ts, 0, 22))
15+
16+
export function parse(): Url;
17+
>parse : Symbol(parse, Decl(index.d.ts, 1, 23))
18+
>Url : Symbol(Url, Decl(index.d.ts, 0, 22))
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/compiler/usage.ts ===
2+
import { parse } from "url";
3+
>parse : () => import("url").Url
4+
5+
export const thing = () => parse();
6+
>thing : () => import("url").Url
7+
>() => parse() : () => import("url").Url
8+
>parse() : import("url").Url
9+
>parse : () => import("url").Url
10+
11+
=== node_modules/@types/node/index.d.ts ===
12+
declare module "url" {
13+
>"url" : typeof import("url")
14+
15+
export class Url {}
16+
>Url : Url
17+
18+
export function parse(): Url;
19+
>parse : () => Url
20+
>Url : Url
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @declaration: true
2+
// @noImplicitReferences: true
3+
// @filename: /.src/node_modules/@types/node/index.d.ts
4+
declare module "url" {
5+
export class Url {}
6+
export function parse(): Url;
7+
}
8+
// @filename: usage.ts
9+
import { parse } from "url";
10+
export const thing = () => parse();

0 commit comments

Comments
 (0)