From e962037df334de071b8d3a9c70b13e3a600d1bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 25 Sep 2024 01:18:01 +0200 Subject: [PATCH] Fixed crash when resolving a symbol on invalid private identifier in type reference (#60013) --- src/compiler/checker.ts | 7 +++---- ...kInfoPrivateIdentifierInTypeReferenceNoCrash1.ts | 13 +++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/quickInfoPrivateIdentifierInTypeReferenceNoCrash1.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ce0d28b6853..4016d82dafd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -49143,15 +49143,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return resolveJSDocMemberName(name); } } - else if (isTypeReferenceIdentifier(name as EntityName)) { + else if (isEntityName(name) && isTypeReferenceIdentifier(name)) { const meaning = name.parent.kind === SyntaxKind.TypeReference ? SymbolFlags.Type : SymbolFlags.Namespace; - const symbol = resolveEntityName(name as EntityName, meaning, /*ignoreErrors*/ false, /*dontResolveAlias*/ true); - return symbol && symbol !== unknownSymbol ? symbol : getUnresolvedSymbolForEntityName(name as EntityName); + const symbol = resolveEntityName(name, meaning, /*ignoreErrors*/ false, /*dontResolveAlias*/ true); + return symbol && symbol !== unknownSymbol ? symbol : getUnresolvedSymbolForEntityName(name); } if (name.parent.kind === SyntaxKind.TypePredicate) { return resolveEntityName(name as Identifier, /*meaning*/ SymbolFlags.FunctionScopedVariable); } - return undefined; } diff --git a/tests/cases/fourslash/quickInfoPrivateIdentifierInTypeReferenceNoCrash1.ts b/tests/cases/fourslash/quickInfoPrivateIdentifierInTypeReferenceNoCrash1.ts new file mode 100644 index 00000000000..89bb8d7a8ee --- /dev/null +++ b/tests/cases/fourslash/quickInfoPrivateIdentifierInTypeReferenceNoCrash1.ts @@ -0,0 +1,13 @@ +/// + +// @target: esnext + +//// class Foo { +//// #prop: string = ""; +//// +//// method() { +//// const test: Foo.#prop/*1*/ = ""; +//// } +//// } + +verify.quickInfoAt("1", "");