From 2e3cef7f8ffd3b0d7dec9166b08439baacee5fd8 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Tue, 12 Nov 2019 09:05:32 -0800 Subject: [PATCH] Fix import type resolution in jsdoc, mark 2 Fake alias resolution only applies when the import type is followed by a qualified name. Otherwise the alias is sufficiently resolved already. --- src/compiler/checker.ts | 3 ++- ...mportTypeReferenceToCommonjsModule.symbols | 22 +++++++++++++++++++ ...cImportTypeReferenceToCommonjsModule.types | 22 +++++++++++++++++++ ...jsdocImportTypeReferenceToESModule.symbols | 16 ++++++++++++++ .../jsdocImportTypeReferenceToESModule.types | 16 ++++++++++++++ ...sdocImportTypeReferenceToCommonjsModule.ts | 14 ++++++++++++ .../jsdocImportTypeReferenceToESModule.ts | 11 ++++++++++ 7 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.symbols create mode 100644 tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.types create mode 100644 tests/baselines/reference/jsdocImportTypeReferenceToESModule.symbols create mode 100644 tests/baselines/reference/jsdocImportTypeReferenceToESModule.types create mode 100644 tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToCommonjsModule.ts create mode 100644 tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToESModule.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 824836e4db7c6..b880eff2ba0a9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10852,7 +10852,8 @@ namespace ts { } isRequireAlias = isCallExpression(expr) && isRequireCall(expr, /*requireStringLiteralLikeArgument*/ true) && !!valueType.symbol; } - if (isRequireAlias || node.kind === SyntaxKind.ImportType) { + const isImportTypeWithQualifier = node.kind === SyntaxKind.ImportType && (node as ImportTypeNode).qualifier; + if (isRequireAlias || isImportTypeWithQualifier) { typeType = getTypeReferenceType(node, valueType.symbol); } } diff --git a/tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.symbols b/tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.symbols new file mode 100644 index 0000000000000..6c80d04bed79a --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.symbols @@ -0,0 +1,22 @@ +=== tests/cases/conformance/jsdoc/ex.d.ts === +declare var config: { +>config : Symbol(config, Decl(ex.d.ts, 0, 11)) + + fix: boolean +>fix : Symbol(fix, Decl(ex.d.ts, 0, 21)) +} +export = config; +>config : Symbol(config, Decl(ex.d.ts, 0, 11)) + +=== tests/cases/conformance/jsdoc/test.js === +/** @param {import('./ex')} a */ +function demo(a) { +>demo : Symbol(demo, Decl(test.js, 0, 0)) +>a : Symbol(a, Decl(test.js, 1, 14)) + + a.fix +>a.fix : Symbol(fix, Decl(ex.d.ts, 0, 21)) +>a : Symbol(a, Decl(test.js, 1, 14)) +>fix : Symbol(fix, Decl(ex.d.ts, 0, 21)) +} + diff --git a/tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.types b/tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.types new file mode 100644 index 0000000000000..5d376c2852fda --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeReferenceToCommonjsModule.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/jsdoc/ex.d.ts === +declare var config: { +>config : { fix: boolean; } + + fix: boolean +>fix : boolean +} +export = config; +>config : { fix: boolean; } + +=== tests/cases/conformance/jsdoc/test.js === +/** @param {import('./ex')} a */ +function demo(a) { +>demo : (a: { fix: boolean; }) => void +>a : { fix: boolean; } + + a.fix +>a.fix : boolean +>a : { fix: boolean; } +>fix : boolean +} + diff --git a/tests/baselines/reference/jsdocImportTypeReferenceToESModule.symbols b/tests/baselines/reference/jsdocImportTypeReferenceToESModule.symbols new file mode 100644 index 0000000000000..6bd4377a512a9 --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeReferenceToESModule.symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/jsdoc/ex.d.ts === +export var config: {} +>config : Symbol(config, Decl(ex.d.ts, 0, 10)) + +=== tests/cases/conformance/jsdoc/test.js === +/** @param {import('./ex')} a */ +function demo(a) { +>demo : Symbol(demo, Decl(test.js, 0, 0)) +>a : Symbol(a, Decl(test.js, 1, 14)) + + a.config +>a.config : Symbol(config, Decl(ex.d.ts, 0, 10)) +>a : Symbol(a, Decl(test.js, 1, 14)) +>config : Symbol(config, Decl(ex.d.ts, 0, 10)) +} + diff --git a/tests/baselines/reference/jsdocImportTypeReferenceToESModule.types b/tests/baselines/reference/jsdocImportTypeReferenceToESModule.types new file mode 100644 index 0000000000000..d2cf23fbdd026 --- /dev/null +++ b/tests/baselines/reference/jsdocImportTypeReferenceToESModule.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/jsdoc/ex.d.ts === +export var config: {} +>config : {} + +=== tests/cases/conformance/jsdoc/test.js === +/** @param {import('./ex')} a */ +function demo(a) { +>demo : (a: typeof import("tests/cases/conformance/jsdoc/ex")) => void +>a : typeof import("tests/cases/conformance/jsdoc/ex") + + a.config +>a.config : {} +>a : typeof import("tests/cases/conformance/jsdoc/ex") +>config : {} +} + diff --git a/tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToCommonjsModule.ts b/tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToCommonjsModule.ts new file mode 100644 index 0000000000000..63951b895bf31 --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToCommonjsModule.ts @@ -0,0 +1,14 @@ +// @noEmit: true +// @allowJs: true +// @checkJs: true +// @Filename: ex.d.ts +declare var config: { + fix: boolean +} +export = config; + +// @Filename: test.js +/** @param {import('./ex')} a */ +function demo(a) { + a.fix +} diff --git a/tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToESModule.ts b/tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToESModule.ts new file mode 100644 index 0000000000000..5ff0fea6d260b --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocImportTypeReferenceToESModule.ts @@ -0,0 +1,11 @@ +// @noEmit: true +// @allowJs: true +// @checkJs: true +// @Filename: ex.d.ts +export var config: {} + +// @Filename: test.js +/** @param {import('./ex')} a */ +function demo(a) { + a.config +}