From a5ebd5382b268fa56fe168e74b35d43107d26136 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Wed, 12 Jan 2022 11:20:19 -0800 Subject: [PATCH] Cherry-pick PR #47348 into release-4.5 (#47349) Component commits: 755e1cbc88 Add minimal failing test d52b9d3cee Fix checker initialization crash with esModuleInterop global merges resolving to ImportEquals aliases Co-authored-by: Andrew Branch --- src/compiler/checker.ts | 2 +- .../reference/checkerInitializationCrash.js | 42 ++++++++++ .../checkerInitializationCrash.symbols | 78 +++++++++++++++++++ .../checkerInitializationCrash.types | 70 +++++++++++++++++ .../compiler/checkerInitializationCrash.ts | 40 ++++++++++ 5 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/checkerInitializationCrash.js create mode 100644 tests/baselines/reference/checkerInitializationCrash.symbols create mode 100644 tests/baselines/reference/checkerInitializationCrash.types create mode 100644 tests/cases/compiler/checkerInitializationCrash.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c896e99c41eb0..5c965a813a5b1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3672,7 +3672,7 @@ namespace ts { if (!sigs || !sigs.length) { sigs = getSignaturesOfStructuredType(type, SignatureKind.Construct); } - if ((sigs && sigs.length) || getPropertyOfType(type, InternalSymbolName.Default)) { + if ((sigs && sigs.length) || getPropertyOfType(type, InternalSymbolName.Default, /*skipObjectFunctionPropertyAugment*/ true)) { const moduleType = getTypeWithSyntheticDefaultImportType(type, symbol, moduleSymbol!, reference); return cloneTypeAsModuleType(symbol, moduleType, referenceParent); } diff --git a/tests/baselines/reference/checkerInitializationCrash.js b/tests/baselines/reference/checkerInitializationCrash.js new file mode 100644 index 0000000000000..8cb6babc45a47 --- /dev/null +++ b/tests/baselines/reference/checkerInitializationCrash.js @@ -0,0 +1,42 @@ +//// [tests/cases/compiler/checkerInitializationCrash.ts] //// + +//// [index.d.ts] +import * as react from 'react'; +declare global { + namespace FullCalendarVDom { + export import VNode = react.ReactNode; + } +} + +export default class FullCalendar { +} + +//// [index.d.ts] +import * as preact from 'preact'; +declare global { + namespace FullCalendarVDom { + type VNode = preact.VNode; + } +} + +export type EventInput = any; + +//// [index.d.ts] +export = React; +export as namespace React; +declare namespace React { + type ReactNode = any; + function useMemo(factory: () => T, deps: undefined): T; +} + +//// [index.d.ts] +export as namespace preact; +export interface VNode

{} + +//// [index.tsx] +import FullCalendar from "@fullcalendar/react"; +import { EventInput } from "@fullcalendar/core"; + + +//// [index.js] +export {}; diff --git a/tests/baselines/reference/checkerInitializationCrash.symbols b/tests/baselines/reference/checkerInitializationCrash.symbols new file mode 100644 index 0000000000000..2cd749dd4c3a3 --- /dev/null +++ b/tests/baselines/reference/checkerInitializationCrash.symbols @@ -0,0 +1,78 @@ +=== /node_modules/@fullcalendar/react/index.d.ts === +import * as react from 'react'; +>react : Symbol(react, Decl(index.d.ts, 0, 6)) + +declare global { +>global : Symbol(global, Decl(index.d.ts, 0, 31)) + + namespace FullCalendarVDom { +>FullCalendarVDom : Symbol(FullCalendarVDom, Decl(index.d.ts, 1, 16), Decl(index.d.ts, 1, 16)) + + export import VNode = react.ReactNode; +>VNode : Symbol(FullCalendarVDom.VNode, Decl(index.d.ts, 2, 30)) +>react : Symbol(react, Decl(index.d.ts, 0, 6)) +>ReactNode : Symbol(react.ReactNode, Decl(index.d.ts, 2, 25), Decl(index.d.ts, 2, 30)) + } +} + +export default class FullCalendar { +>FullCalendar : Symbol(FullCalendar, Decl(index.d.ts, 5, 1)) +} + +=== /node_modules/@fullcalendar/core/index.d.ts === +import * as preact from 'preact'; +>preact : Symbol(preact, Decl(index.d.ts, 0, 6)) + +declare global { +>global : Symbol(global, Decl(index.d.ts, 0, 33)) + + namespace FullCalendarVDom { +>FullCalendarVDom : Symbol(FullCalendarVDom, Decl(index.d.ts, 1, 16), Decl(index.d.ts, 1, 16)) + + type VNode = preact.VNode; +>VNode : Symbol(React.ReactNode, Decl(index.d.ts, 2, 25), Decl(index.d.ts, 2, 30)) +>preact : Symbol(preact, Decl(index.d.ts, 0, 6)) +>VNode : Symbol(preact.VNode, Decl(index.d.ts, 0, 27)) + } +} + +export type EventInput = any; +>EventInput : Symbol(EventInput, Decl(index.d.ts, 5, 1)) + +=== /node_modules/@types/react/index.d.ts === +export = React; +>React : Symbol(React, Decl(index.d.ts, 1, 26)) + +export as namespace React; +>React : Symbol(React, Decl(index.d.ts, 0, 15)) + +declare namespace React { +>React : Symbol(React, Decl(index.d.ts, 1, 26)) + + type ReactNode = any; +>ReactNode : Symbol(ReactNode, Decl(index.d.ts, 2, 25), Decl(index.d.ts, 2, 30)) + + function useMemo(factory: () => T, deps: undefined): T; +>useMemo : Symbol(useMemo, Decl(index.d.ts, 3, 25)) +>T : Symbol(T, Decl(index.d.ts, 4, 21)) +>factory : Symbol(factory, Decl(index.d.ts, 4, 24)) +>T : Symbol(T, Decl(index.d.ts, 4, 21)) +>deps : Symbol(deps, Decl(index.d.ts, 4, 41)) +>T : Symbol(T, Decl(index.d.ts, 4, 21)) +} + +=== /node_modules/preact/index.d.ts === +export as namespace preact; +>preact : Symbol(preact, Decl(index.d.ts, 0, 0)) + +export interface VNode

{} +>VNode : Symbol(VNode, Decl(index.d.ts, 0, 27)) +>P : Symbol(P, Decl(index.d.ts, 1, 23)) + +=== /index.tsx === +import FullCalendar from "@fullcalendar/react"; +>FullCalendar : Symbol(FullCalendar, Decl(index.tsx, 0, 6)) + +import { EventInput } from "@fullcalendar/core"; +>EventInput : Symbol(EventInput, Decl(index.tsx, 1, 8)) + diff --git a/tests/baselines/reference/checkerInitializationCrash.types b/tests/baselines/reference/checkerInitializationCrash.types new file mode 100644 index 0000000000000..f93c830bd04f5 --- /dev/null +++ b/tests/baselines/reference/checkerInitializationCrash.types @@ -0,0 +1,70 @@ +=== /node_modules/@fullcalendar/react/index.d.ts === +import * as react from 'react'; +>react : typeof react + +declare global { +>global : typeof global + + namespace FullCalendarVDom { +>FullCalendarVDom : typeof FullCalendarVDom + + export import VNode = react.ReactNode; +>VNode : any +>react : typeof react +>ReactNode : any + } +} + +export default class FullCalendar { +>FullCalendar : FullCalendar +} + +=== /node_modules/@fullcalendar/core/index.d.ts === +import * as preact from 'preact'; +>preact : typeof preact + +declare global { +>global : any + + namespace FullCalendarVDom { + type VNode = preact.VNode; +>VNode : any +>preact : any + } +} + +export type EventInput = any; +>EventInput : any + +=== /node_modules/@types/react/index.d.ts === +export = React; +>React : typeof React + +export as namespace React; +>React : typeof React + +declare namespace React { +>React : typeof React + + type ReactNode = any; +>ReactNode : any + + function useMemo(factory: () => T, deps: undefined): T; +>useMemo : (factory: () => T, deps: undefined) => T +>factory : () => T +>deps : undefined +} + +=== /node_modules/preact/index.d.ts === +export as namespace preact; +>preact : typeof import("/node_modules/preact/index") + +export interface VNode

{} + +=== /index.tsx === +import FullCalendar from "@fullcalendar/react"; +>FullCalendar : typeof FullCalendar + +import { EventInput } from "@fullcalendar/core"; +>EventInput : any + diff --git a/tests/cases/compiler/checkerInitializationCrash.ts b/tests/cases/compiler/checkerInitializationCrash.ts new file mode 100644 index 0000000000000..969f81e6d354a --- /dev/null +++ b/tests/cases/compiler/checkerInitializationCrash.ts @@ -0,0 +1,40 @@ +// @module: esnext +// @moduleResolution: node +// @esModuleInterop: true + +// @Filename: /node_modules/@fullcalendar/react/index.d.ts +import * as react from 'react'; +declare global { + namespace FullCalendarVDom { + export import VNode = react.ReactNode; + } +} + +export default class FullCalendar { +} + +// @Filename: /node_modules/@fullcalendar/core/index.d.ts +import * as preact from 'preact'; +declare global { + namespace FullCalendarVDom { + type VNode = preact.VNode; + } +} + +export type EventInput = any; + +// @Filename: /node_modules/@types/react/index.d.ts +export = React; +export as namespace React; +declare namespace React { + type ReactNode = any; + function useMemo(factory: () => T, deps: undefined): T; +} + +// @Filename: /node_modules/preact/index.d.ts +export as namespace preact; +export interface VNode

{} + +// @Filename: /index.tsx +import FullCalendar from "@fullcalendar/react"; +import { EventInput } from "@fullcalendar/core";