From 19786dfa7d43537a7b18dff97b577a85d80ba072 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 29 Sep 2020 12:15:48 -0700 Subject: [PATCH] Fix crash resolving ImportTypeNode in JSDoc --- src/compiler/checker.ts | 2 +- .../jsdocImportTypeNodeNamespace.errors.txt | 18 ++++++++++++++++++ .../jsdocImportTypeNodeNamespace.symbols | 18 ++++++++++++++++++ .../jsdocImportTypeNodeNamespace.types | 19 +++++++++++++++++++ .../compiler/jsdocImportTypeNodeNamespace.ts | 16 ++++++++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/jsdocImportTypeNodeNamespace.errors.txt create mode 100644 tests/baselines/reference/jsdocImportTypeNodeNamespace.symbols create mode 100644 tests/baselines/reference/jsdocImportTypeNodeNamespace.types create mode 100644 tests/cases/compiler/jsdocImportTypeNodeNamespace.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 131dbc38cf74c..75089d2b35eb3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12274,7 +12274,7 @@ namespace ts { if (symbol.valueDeclaration) { const isImportTypeWithQualifier = node.kind === SyntaxKind.ImportType && (node as ImportTypeNode).qualifier; // valueType might not have a symbol, eg, {import('./b').STRING_LITERAL} - if (valueType.symbol && isImportTypeWithQualifier) { + if (valueType.symbol && valueType.symbol !== symbol && isImportTypeWithQualifier) { typeType = getTypeReferenceType(node, valueType.symbol); } } diff --git a/tests/baselines/reference/jsdocImportTypeNodeNamespace.errors.txt b/tests/baselines/reference/jsdocImportTypeNodeNamespace.errors.txt new file mode 100644 index 0000000000000..40f0e3c974eab --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeNodeNamespace.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/Main.js(2,14): error TS2352: Conversion of type 'string' to type 'typeof _default' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. + + +==== tests/cases/compiler/GeometryType.d.ts (0 errors) ==== + // #40767 + + declare namespace _default { + export const POINT: string; + } + export default _default; + +==== tests/cases/compiler/Main.js (1 errors) ==== + export default function () { + return /** @type {import('./GeometryType.js').default} */ ('Point'); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2352: Conversion of type 'string' to type 'typeof _default' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. + } + \ No newline at end of file diff --git a/tests/baselines/reference/jsdocImportTypeNodeNamespace.symbols b/tests/baselines/reference/jsdocImportTypeNodeNamespace.symbols new file mode 100644 index 0000000000000..203de80641346 --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeNodeNamespace.symbols @@ -0,0 +1,18 @@ +=== tests/cases/compiler/GeometryType.d.ts === +// #40767 + +declare namespace _default { +>_default : Symbol(_default, Decl(GeometryType.d.ts, 0, 0)) + + export const POINT: string; +>POINT : Symbol(POINT, Decl(GeometryType.d.ts, 3, 14)) +} +export default _default; +>_default : Symbol(_default, Decl(GeometryType.d.ts, 0, 0)) + +=== tests/cases/compiler/Main.js === +export default function () { +No type information for this code. return /** @type {import('./GeometryType.js').default} */ ('Point'); +No type information for this code.} +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/jsdocImportTypeNodeNamespace.types b/tests/baselines/reference/jsdocImportTypeNodeNamespace.types new file mode 100644 index 0000000000000..9e468a7e9318b --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeNodeNamespace.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/GeometryType.d.ts === +// #40767 + +declare namespace _default { +>_default : typeof _default + + export const POINT: string; +>POINT : string +} +export default _default; +>_default : typeof _default + +=== tests/cases/compiler/Main.js === +export default function () { + return /** @type {import('./GeometryType.js').default} */ ('Point'); +>('Point') : typeof import("tests/cases/compiler/GeometryType").default +>'Point' : "Point" +} + diff --git a/tests/cases/compiler/jsdocImportTypeNodeNamespace.ts b/tests/cases/compiler/jsdocImportTypeNodeNamespace.ts new file mode 100644 index 0000000000000..86024244324f2 --- /dev/null +++ b/tests/cases/compiler/jsdocImportTypeNodeNamespace.ts @@ -0,0 +1,16 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true + +// #40767 + +// @Filename: GeometryType.d.ts +declare namespace _default { + export const POINT: string; +} +export default _default; + +// @Filename: Main.js +export default function () { + return /** @type {import('./GeometryType.js').default} */ ('Point'); +}