From af7a6386257ef8ad468af94d5e4aae10aadcda36 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Mon, 3 Jun 2024 16:09:13 +0100 Subject: [PATCH 1/2] Preserve elided imports. --- src/compiler/checker.ts | 18 +++---- ...eclarationEmitPreserveReferencedImports.js | 45 ++++++++++++++++ ...ationEmitPreserveReferencedImports.symbols | 32 +++++++++++ ...arationEmitPreserveReferencedImports.types | 53 +++++++++++++++++++ ...eclarationEmitPreserveReferencedImports.ts | 16 ++++++ 5 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitPreserveReferencedImports.js create mode 100644 tests/baselines/reference/declarationEmitPreserveReferencedImports.symbols create mode 100644 tests/baselines/reference/declarationEmitPreserveReferencedImports.types create mode 100644 tests/cases/compiler/declarationEmitPreserveReferencedImports.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7314f3c7961a7..36bf6491f93e5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8522,10 +8522,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function createRecoveryBoundary() { + let trackedSymbols: TrackedSymbol[]; let unreportedErrors: (() => void)[]; const oldTracker = context.tracker; const oldTrackedSymbols = context.trackedSymbols; - context.trackedSymbols = []; + context.trackedSymbols = undefined; const oldEncounteredError = context.encounteredError; context.tracker = new SymbolTrackerImpl(context, { ...oldTracker.inner, @@ -8545,11 +8546,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { markError(() => oldTracker.reportNonSerializableProperty(name)); }, trackSymbol(sym, decl, meaning) { - const accessibility = isSymbolAccessible(sym, decl, meaning, /*shouldComputeAliasesToMakeVisible*/ false); - if (accessibility.accessibility !== SymbolAccessibility.Accessible) { - (context.trackedSymbols ??= []).push([sym, decl, meaning]); - return true; - } + (trackedSymbols ??= []).push([sym, decl, meaning]); return false; }, moduleResolverHost: context.tracker.moduleResolverHost, @@ -8566,13 +8563,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function startRecoveryScope() { - const initialTrackedSymbolsTop = context.trackedSymbols?.length ?? 0; + const trackedSymbolsTop = trackedSymbols?.length ?? 0; const unreportedErrorsTop = unreportedErrors?.length ?? 0; return () => { hadError = false; // Reset the tracked symbols to before the error - if (context.trackedSymbols) { - context.trackedSymbols.length = initialTrackedSymbolsTop; + if (trackedSymbols) { + trackedSymbols.length = trackedSymbolsTop; } if (unreportedErrors) { unreportedErrors.length = unreportedErrorsTop; @@ -8582,7 +8579,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function finalizeBoundary() { context.tracker = oldTracker; - const newTrackedSymbols = context.trackedSymbols; context.trackedSymbols = oldTrackedSymbols; context.encounteredError = oldEncounteredError; @@ -8590,7 +8586,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (hadError) { return false; } - newTrackedSymbols?.forEach( + trackedSymbols?.forEach( ([symbol, enclosingDeclaration, meaning]) => context.tracker.trackSymbol( symbol, diff --git a/tests/baselines/reference/declarationEmitPreserveReferencedImports.js b/tests/baselines/reference/declarationEmitPreserveReferencedImports.js new file mode 100644 index 0000000000000..fba08234a3c3e --- /dev/null +++ b/tests/baselines/reference/declarationEmitPreserveReferencedImports.js @@ -0,0 +1,45 @@ +//// [tests/cases/compiler/declarationEmitPreserveReferencedImports.ts] //// + +//// [utils.ts] +export interface Evt { } + + +//// [decl.ts] +import {Evt} from './utils' +export const o = (o: T) => () : T => null! + +//// [main.ts] +import { o } from './decl' +import { Evt } from './utils' + +export const f = { o: o({ v: null! as Evt}) }; + +//// [utils.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//// [decl.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.o = void 0; +var o = function (o) { return function () { return null; }; }; +exports.o = o; +//// [main.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.f = void 0; +var decl_1 = require("./decl"); +exports.f = { o: (0, decl_1.o)({ v: null }) }; + + +//// [utils.d.ts] +export interface Evt { +} +//// [decl.d.ts] +export declare const o: (o: T) => () => T; +//// [main.d.ts] +import { Evt } from './utils'; +export declare const f: { + o: () => { + v: Evt; + }; +}; diff --git a/tests/baselines/reference/declarationEmitPreserveReferencedImports.symbols b/tests/baselines/reference/declarationEmitPreserveReferencedImports.symbols new file mode 100644 index 0000000000000..83d594df6c89b --- /dev/null +++ b/tests/baselines/reference/declarationEmitPreserveReferencedImports.symbols @@ -0,0 +1,32 @@ +//// [tests/cases/compiler/declarationEmitPreserveReferencedImports.ts] //// + +=== utils.ts === +export interface Evt { } +>Evt : Symbol(Evt, Decl(utils.ts, 0, 0)) + + +=== decl.ts === +import {Evt} from './utils' +>Evt : Symbol(Evt, Decl(decl.ts, 0, 8)) + +export const o = (o: T) => () : T => null! +>o : Symbol(o, Decl(decl.ts, 1, 12)) +>T : Symbol(T, Decl(decl.ts, 1, 18)) +>o : Symbol(o, Decl(decl.ts, 1, 21)) +>T : Symbol(T, Decl(decl.ts, 1, 18)) +>T : Symbol(T, Decl(decl.ts, 1, 18)) + +=== main.ts === +import { o } from './decl' +>o : Symbol(o, Decl(main.ts, 0, 8)) + +import { Evt } from './utils' +>Evt : Symbol(Evt, Decl(main.ts, 1, 8)) + +export const f = { o: o({ v: null! as Evt}) }; +>f : Symbol(f, Decl(main.ts, 3, 12)) +>o : Symbol(o, Decl(main.ts, 3, 18)) +>o : Symbol(o, Decl(main.ts, 0, 8)) +>v : Symbol(v, Decl(main.ts, 3, 25)) +>Evt : Symbol(Evt, Decl(main.ts, 1, 8)) + diff --git a/tests/baselines/reference/declarationEmitPreserveReferencedImports.types b/tests/baselines/reference/declarationEmitPreserveReferencedImports.types new file mode 100644 index 0000000000000..e3bbf57ae24f4 --- /dev/null +++ b/tests/baselines/reference/declarationEmitPreserveReferencedImports.types @@ -0,0 +1,53 @@ +//// [tests/cases/compiler/declarationEmitPreserveReferencedImports.ts] //// + +=== utils.ts === + +export interface Evt { } + + +=== decl.ts === +import {Evt} from './utils' +>Evt : any +> : ^^^ + +export const o = (o: T) => () : T => null! +>o : (o: T) => () => T +> : ^ ^^ ^^ ^^^^^^^^^^^ +>(o: T) => () : T => null! : (o: T) => () => T +> : ^ ^^ ^^ ^^^^^^^^^^^ +>o : T +> : ^ +>() : T => null! : () => T +> : ^^^^^^ +>null! : never +> : ^^^^^ + +=== main.ts === +import { o } from './decl' +>o : (o: T) => () => T +> : ^ ^^ ^^ ^^^^^^^^^^^ + +import { Evt } from './utils' +>Evt : any +> : ^^^ + +export const f = { o: o({ v: null! as Evt}) }; +>f : { o: () => { v: Evt; }; } +> : ^^^^^^^^^^^^^^^^ ^^^^^^ +>{ o: o({ v: null! as Evt}) } : { o: () => { v: Evt; }; } +> : ^^^^^^^^^^^^^^^^ ^^^^^^ +>o : () => { v: Evt; } +> : ^^^^^^^^^^^ ^^^ +>o({ v: null! as Evt}) : () => { v: Evt; } +> : ^^^^^^^^^^^ ^^^ +>o : (o: T) => () => T +> : ^ ^^ ^^ ^^^^^^^^^^^ +>{ v: null! as Evt} : { v: Evt; } +> : ^^^^^ ^^^ +>v : Evt +> : ^^^ +>null! as Evt : Evt +> : ^^^ +>null! : never +> : ^^^^^ + diff --git a/tests/cases/compiler/declarationEmitPreserveReferencedImports.ts b/tests/cases/compiler/declarationEmitPreserveReferencedImports.ts new file mode 100644 index 0000000000000..61e5a0e282651 --- /dev/null +++ b/tests/cases/compiler/declarationEmitPreserveReferencedImports.ts @@ -0,0 +1,16 @@ +// @declaration: true +// @strict: true + +// @filename: utils.ts +export interface Evt { } + + +// @filename: decl.ts +import {Evt} from './utils' +export const o = (o: T) => () : T => null! + +// @filename: main.ts +import { o } from './decl' +import { Evt } from './utils' + +export const f = { o: o({ v: null! as Evt}) }; \ No newline at end of file From 884d4e148b2d3605711011501fddba56d37e92b2 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Mon, 3 Jun 2024 17:46:22 +0100 Subject: [PATCH 2/2] Fix new lines. --- .../declarationEmitPreserveReferencedImports.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/baselines/reference/declarationEmitPreserveReferencedImports.js b/tests/baselines/reference/declarationEmitPreserveReferencedImports.js index fba08234a3c3e..c3d946c3af4aa 100644 --- a/tests/baselines/reference/declarationEmitPreserveReferencedImports.js +++ b/tests/baselines/reference/declarationEmitPreserveReferencedImports.js @@ -1,17 +1,17 @@ //// [tests/cases/compiler/declarationEmitPreserveReferencedImports.ts] //// //// [utils.ts] -export interface Evt { } - +export interface Evt { } + //// [decl.ts] -import {Evt} from './utils' -export const o = (o: T) => () : T => null! +import {Evt} from './utils' +export const o = (o: T) => () : T => null! //// [main.ts] -import { o } from './decl' -import { Evt } from './utils' - +import { o } from './decl' +import { Evt } from './utils' + export const f = { o: o({ v: null! as Evt}) }; //// [utils.js]