From 9f9825a4f062d9e6b61858acc8394a51653ef9ee Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Thu, 25 Feb 2021 15:21:41 -0800 Subject: [PATCH 1/2] Fix: checkAliasSymbol crash when checking for @deprecated It's possible that we shouldn't be creating symbol with no declarations from non-homomorphic mapped types, but for 4.2, the right fix is to make the @deprecated-check in checkAliasSymbol ensure that target.declarations is defined. --- src/compiler/checker.ts | 2 +- .../reference/importPropertyFromMappedType.js | 16 ++++++++++++++ .../importPropertyFromMappedType.symbols | 21 +++++++++++++++++++ .../importPropertyFromMappedType.types | 17 +++++++++++++++ .../compiler/importPropertyFromMappedType.ts | 11 ++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/importPropertyFromMappedType.js create mode 100644 tests/baselines/reference/importPropertyFromMappedType.symbols create mode 100644 tests/baselines/reference/importPropertyFromMappedType.types create mode 100644 tests/cases/compiler/importPropertyFromMappedType.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8f159f198fbb1..1ef57f9b843c9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37124,7 +37124,7 @@ namespace ts { error(node, Diagnostics.Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type); } - if (isImportSpecifier(node) && every(target.declarations, d => !!(getCombinedNodeFlags(d) & NodeFlags.Deprecated))) { + if (isImportSpecifier(node) && target.declarations?.every(d => !!(getCombinedNodeFlags(d) & NodeFlags.Deprecated))) { addDeprecatedSuggestion(node.name, target.declarations, symbol.escapedName as string); } } diff --git a/tests/baselines/reference/importPropertyFromMappedType.js b/tests/baselines/reference/importPropertyFromMappedType.js new file mode 100644 index 0000000000000..ec31897f0f20b --- /dev/null +++ b/tests/baselines/reference/importPropertyFromMappedType.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/importPropertyFromMappedType.ts] //// + +//// [errors.d.ts] +export = createHttpError; +declare const createHttpError: createHttpError.NamedConstructors; +declare namespace createHttpError { + type NamedConstructors = { [P in 'NotFound']: unknown;} +} + +//// [main.ts] +import { NotFound } from './errors' + + +//// [main.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/importPropertyFromMappedType.symbols b/tests/baselines/reference/importPropertyFromMappedType.symbols new file mode 100644 index 0000000000000..2b847049346d3 --- /dev/null +++ b/tests/baselines/reference/importPropertyFromMappedType.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/errors.d.ts === +export = createHttpError; +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) + +declare const createHttpError: createHttpError.NamedConstructors; +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) +>NamedConstructors : Symbol(createHttpError.NamedConstructors, Decl(errors.d.ts, 2, 35)) + +declare namespace createHttpError { +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) + + type NamedConstructors = { [P in 'NotFound']: unknown;} +>NamedConstructors : Symbol(NamedConstructors, Decl(errors.d.ts, 2, 35)) +>P : Symbol(P, Decl(errors.d.ts, 3, 33)) +} + +=== tests/cases/compiler/main.ts === +import { NotFound } from './errors' +>NotFound : Symbol(NotFound, Decl(main.ts, 0, 8)) + diff --git a/tests/baselines/reference/importPropertyFromMappedType.types b/tests/baselines/reference/importPropertyFromMappedType.types new file mode 100644 index 0000000000000..7cd7b0278aa92 --- /dev/null +++ b/tests/baselines/reference/importPropertyFromMappedType.types @@ -0,0 +1,17 @@ +=== tests/cases/compiler/errors.d.ts === +export = createHttpError; +>createHttpError : createHttpError.NamedConstructors + +declare const createHttpError: createHttpError.NamedConstructors; +>createHttpError : createHttpError.NamedConstructors +>createHttpError : any + +declare namespace createHttpError { + type NamedConstructors = { [P in 'NotFound']: unknown;} +>NamedConstructors : NamedConstructors +} + +=== tests/cases/compiler/main.ts === +import { NotFound } from './errors' +>NotFound : unknown + diff --git a/tests/cases/compiler/importPropertyFromMappedType.ts b/tests/cases/compiler/importPropertyFromMappedType.ts new file mode 100644 index 0000000000000..ad80aba2d0a50 --- /dev/null +++ b/tests/cases/compiler/importPropertyFromMappedType.ts @@ -0,0 +1,11 @@ +// # + +// @filename: errors.d.ts +export = createHttpError; +declare const createHttpError: createHttpError.NamedConstructors; +declare namespace createHttpError { + type NamedConstructors = { [P in 'NotFound']: unknown;} +} + +// @filename: main.ts +import { NotFound } from './errors' From 75449de4be06ef133cfbe427c43b138d1d6a9c5d Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Thu, 25 Feb 2021 15:23:55 -0800 Subject: [PATCH 2/2] Add bug number and accept baselines --- .../reference/importPropertyFromMappedType.js | 2 ++ .../importPropertyFromMappedType.symbols | 16 +++++++++------- .../reference/importPropertyFromMappedType.types | 2 ++ .../compiler/importPropertyFromMappedType.ts | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/baselines/reference/importPropertyFromMappedType.js b/tests/baselines/reference/importPropertyFromMappedType.js index ec31897f0f20b..37ff26b16304f 100644 --- a/tests/baselines/reference/importPropertyFromMappedType.js +++ b/tests/baselines/reference/importPropertyFromMappedType.js @@ -1,6 +1,8 @@ //// [tests/cases/compiler/importPropertyFromMappedType.ts] //// //// [errors.d.ts] +// #42957 + export = createHttpError; declare const createHttpError: createHttpError.NamedConstructors; declare namespace createHttpError { diff --git a/tests/baselines/reference/importPropertyFromMappedType.symbols b/tests/baselines/reference/importPropertyFromMappedType.symbols index 2b847049346d3..224ee8e4c6e77 100644 --- a/tests/baselines/reference/importPropertyFromMappedType.symbols +++ b/tests/baselines/reference/importPropertyFromMappedType.symbols @@ -1,18 +1,20 @@ === tests/cases/compiler/errors.d.ts === +// #42957 + export = createHttpError; ->createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 3, 13), Decl(errors.d.ts, 3, 65)) declare const createHttpError: createHttpError.NamedConstructors; ->createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) ->createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) ->NamedConstructors : Symbol(createHttpError.NamedConstructors, Decl(errors.d.ts, 2, 35)) +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 3, 13), Decl(errors.d.ts, 3, 65)) +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 3, 13), Decl(errors.d.ts, 3, 65)) +>NamedConstructors : Symbol(createHttpError.NamedConstructors, Decl(errors.d.ts, 4, 35)) declare namespace createHttpError { ->createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 1, 13), Decl(errors.d.ts, 1, 65)) +>createHttpError : Symbol(createHttpError, Decl(errors.d.ts, 3, 13), Decl(errors.d.ts, 3, 65)) type NamedConstructors = { [P in 'NotFound']: unknown;} ->NamedConstructors : Symbol(NamedConstructors, Decl(errors.d.ts, 2, 35)) ->P : Symbol(P, Decl(errors.d.ts, 3, 33)) +>NamedConstructors : Symbol(NamedConstructors, Decl(errors.d.ts, 4, 35)) +>P : Symbol(P, Decl(errors.d.ts, 5, 33)) } === tests/cases/compiler/main.ts === diff --git a/tests/baselines/reference/importPropertyFromMappedType.types b/tests/baselines/reference/importPropertyFromMappedType.types index 7cd7b0278aa92..efc06ad38e4a0 100644 --- a/tests/baselines/reference/importPropertyFromMappedType.types +++ b/tests/baselines/reference/importPropertyFromMappedType.types @@ -1,4 +1,6 @@ === tests/cases/compiler/errors.d.ts === +// #42957 + export = createHttpError; >createHttpError : createHttpError.NamedConstructors diff --git a/tests/cases/compiler/importPropertyFromMappedType.ts b/tests/cases/compiler/importPropertyFromMappedType.ts index ad80aba2d0a50..1c850b9a448bd 100644 --- a/tests/cases/compiler/importPropertyFromMappedType.ts +++ b/tests/cases/compiler/importPropertyFromMappedType.ts @@ -1,4 +1,4 @@ -// # +// #42957 // @filename: errors.d.ts export = createHttpError;