From 7612a3afc776d3896a7cdfe4e8d982d3e8ddaa11 Mon Sep 17 00:00:00 2001 From: Gabriela Araujo Britto Date: Thu, 9 Feb 2023 21:31:58 -0300 Subject: [PATCH] Fix crash on `addImportFromExportedSymbol` with default exported symbol (#52694) --- src/services/utilities.ts | 8 +++- ...pletionsOverridingMethodDefaultExported.ts | 38 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/completionsOverridingMethodDefaultExported.ts diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 98f6ed7406b..901f6ed6761 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -3959,8 +3959,12 @@ function needsNameFromDeclaration(symbol: Symbol) { return !(symbol.flags & SymbolFlags.Transient) && (symbol.escapedName === InternalSymbolName.ExportEquals || symbol.escapedName === InternalSymbolName.Default); } -function getDefaultLikeExportNameFromDeclaration(symbol: Symbol) { - return firstDefined(symbol.declarations, d => isExportAssignment(d) ? tryCast(skipOuterExpressions(d.expression), isIdentifier)?.text : undefined); +function getDefaultLikeExportNameFromDeclaration(symbol: Symbol): string | undefined { + return firstDefined(symbol.declarations, d => + isExportAssignment(d) + ? tryCast(skipOuterExpressions(d.expression), isIdentifier)?.text + : tryCast(getNameOfDeclaration(d), isIdentifier)?.text + ); } function getSymbolParentOrFail(symbol: Symbol) { diff --git a/tests/cases/fourslash/completionsOverridingMethodDefaultExported.ts b/tests/cases/fourslash/completionsOverridingMethodDefaultExported.ts new file mode 100644 index 00000000000..39c78893511 --- /dev/null +++ b/tests/cases/fourslash/completionsOverridingMethodDefaultExported.ts @@ -0,0 +1,38 @@ +/// + +// Issue #52662 + +// @filename: other.ts +//// export default class Other {} + +// @filename: base.ts +//// import Other from "./other"; +//// export class Base { +//// foo(): Other { +//// throw new Error(""); +//// } +//// } + +// @filename: derived.ts +//// import { Base } from "./base"; +//// export class Derived extends Base { +//// /**/ +//// } + +verify.completions({ + marker: "", + isNewIdentifierLocation: true, + preferences: { + includeCompletionsWithInsertText: true, + includeCompletionsWithClassMemberSnippets: true, + }, + includes: [ + { + name: "foo", + sortText: completion.SortText.ClassMemberSnippets, + insertText: "foo(): Other {\n}", + hasAction: true, + source: completion.CompletionSource.ClassMemberSnippet, + } + ], +}) \ No newline at end of file