From 49f8c32e619518e8f65cb56228599f712fa7268e Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 12 Sep 2023 17:57:58 -0700 Subject: [PATCH] Avoid unnecessary resolution-mode assertion in declaration emit --- src/compiler/checker.ts | 7 +++-- ...ipleSlashAvoidUnnecessaryResolutionMode.js | 28 ++++++++++++++++++ ...lashAvoidUnnecessaryResolutionMode.symbols | 24 +++++++++++++++ ...eSlashAvoidUnnecessaryResolutionMode.types | 20 +++++++++++++ ...ipleSlashAvoidUnnecessaryResolutionMode.ts | 29 +++++++++++++++++++ 5 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.js create mode 100644 tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.symbols create mode 100644 tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.types create mode 100644 tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index af0df131e9c2d..8339d56c38ff4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -47735,11 +47735,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function addReferencedFilesToTypeDirective(file: SourceFile, key: string, mode: ResolutionMode) { if (fileToDirective.has(file.path)) return; fileToDirective.set(file.path, [key, mode]); - for (const { fileName, resolutionMode } of file.referencedFiles) { + for (const { fileName } of file.referencedFiles) { const resolvedFile = resolveTripleslashReference(fileName, file.fileName); const referencedFile = host.getSourceFile(resolvedFile); if (referencedFile) { - addReferencedFilesToTypeDirective(referencedFile, key, resolutionMode || file.impliedNodeFormat); + // The resolution mode of the file reference doesn't actually matter here - + // all we're recording is the fact that the file entered the compilation + // transitively via a type reference directive of {key} with mode {mode}. + addReferencedFilesToTypeDirective(referencedFile, key, mode || file.impliedNodeFormat); } } } diff --git a/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.js b/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.js new file mode 100644 index 0000000000000..5ff9411dc18e7 --- /dev/null +++ b/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts] //// + +//// [package.json] +{ + "name": "@types/node", + "version": "1.0.0", + "types": "index.d.ts" +} + +//// [globals.d.ts] +declare namespace NodeJS { + interface ReadableStream {} +} + +//// [index.d.ts] +/// + +//// [app.mts] +/// +export async function drainStream(stream: NodeJS.ReadableStream): Promise { +} + + + + +//// [app.d.mts] +/// +export declare function drainStream(stream: NodeJS.ReadableStream): Promise; diff --git a/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.symbols b/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.symbols new file mode 100644 index 0000000000000..2075b1f6fbfed --- /dev/null +++ b/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.symbols @@ -0,0 +1,24 @@ +//// [tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts] //// + +=== /app.mts === +/// +export async function drainStream(stream: NodeJS.ReadableStream): Promise { +>drainStream : Symbol(drainStream, Decl(app.mts, 0, 0)) +>stream : Symbol(stream, Decl(app.mts, 1, 34)) +>NodeJS : Symbol(NodeJS, Decl(globals.d.ts, 0, 0)) +>ReadableStream : Symbol(NodeJS.ReadableStream, Decl(globals.d.ts, 0, 26)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +} + +=== /node_modules/@types/node/globals.d.ts === +declare namespace NodeJS { +>NodeJS : Symbol(NodeJS, Decl(globals.d.ts, 0, 0)) + + interface ReadableStream {} +>ReadableStream : Symbol(ReadableStream, Decl(globals.d.ts, 0, 26)) +} + +=== /node_modules/@types/node/index.d.ts === + +/// + diff --git a/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.types b/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.types new file mode 100644 index 0000000000000..5c309eebd0ca4 --- /dev/null +++ b/tests/baselines/reference/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.types @@ -0,0 +1,20 @@ +//// [tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts] //// + +=== /app.mts === +/// +export async function drainStream(stream: NodeJS.ReadableStream): Promise { +>drainStream : (stream: NodeJS.ReadableStream) => Promise +>stream : NodeJS.ReadableStream +>NodeJS : any +} + +=== /node_modules/@types/node/globals.d.ts === + +declare namespace NodeJS { + interface ReadableStream {} +} + +=== /node_modules/@types/node/index.d.ts === + +/// + diff --git a/tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts b/tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts new file mode 100644 index 0000000000000..b090d95e9daa4 --- /dev/null +++ b/tests/cases/compiler/dtsEmitTripleSlashAvoidUnnecessaryResolutionMode.ts @@ -0,0 +1,29 @@ +// @Filename: /tsconfig.json +{ + "compilerOptions": { + "module": "nodenext", + "types": [], + "declaration": true, + "emitDeclarationOnly": true, + } +} + +// @Filename: /node_modules/@types/node/package.json +{ + "name": "@types/node", + "version": "1.0.0", + "types": "index.d.ts" +} + +// @Filename: /node_modules/@types/node/globals.d.ts +declare namespace NodeJS { + interface ReadableStream {} +} + +// @Filename: /node_modules/@types/node/index.d.ts +/// + +// @Filename: /app.mts +/// +export async function drainStream(stream: NodeJS.ReadableStream): Promise { +}