Fixed a crash in getPropertyNameForPropertyNameNode on NoSubstitutionTemplateLiteral (#55930)

This commit is contained in:
Mateusz Burzyński 2023-10-02 22:31:38 +02:00 committed by GitHub
parent 13a2150e8e
commit d9cd2d0bd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 58 additions and 3 deletions

View File

@ -17727,7 +17727,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
return false;
}
function getPropertyNameFromIndex(indexType: Type, accessNode: StringLiteral | Identifier | PrivateIdentifier | ObjectBindingPattern | ArrayBindingPattern | ComputedPropertyName | NumericLiteral | IndexedAccessTypeNode | ElementAccessExpression | SyntheticExpression | undefined) {
function getPropertyNameFromIndex(indexType: Type, accessNode: PropertyName | ObjectBindingPattern | ArrayBindingPattern | IndexedAccessTypeNode | ElementAccessExpression | SyntheticExpression | undefined) {
return isTypeUsableAsPropertyName(indexType) ?
getPropertyNameFromType(indexType) :
accessNode && isPropertyName(accessNode) ?

View File

@ -1692,7 +1692,7 @@ export interface QualifiedName extends Node, FlowContainer {
export type EntityName = Identifier | QualifiedName;
export type PropertyName = Identifier | StringLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier;
export type PropertyName = Identifier | StringLiteral | NoSubstitutionTemplateLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier;
export type MemberName = Identifier | PrivateIdentifier;

View File

@ -5062,6 +5062,7 @@ export function getPropertyNameForPropertyNameNode(name: PropertyName | JsxAttri
case SyntaxKind.PrivateIdentifier:
return name.escapedText;
case SyntaxKind.StringLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.NumericLiteral:
return escapeLeadingUnderscores(name.text);
case SyntaxKind.ComputedPropertyName:

View File

@ -4976,7 +4976,7 @@ declare namespace ts {
readonly right: Identifier;
}
type EntityName = Identifier | QualifiedName;
type PropertyName = Identifier | StringLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier;
type PropertyName = Identifier | StringLiteral | NoSubstitutionTemplateLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier;
type MemberName = Identifier | PrivateIdentifier;
type DeclarationName = PropertyName | JsxAttributeName | StringLiteralLike | ElementAccessExpression | BindingPattern | EntityNameExpression;
interface Declaration extends Node {

View File

@ -0,0 +1,14 @@
//// [tests/cases/compiler/indexTypeNoSubstitutionTemplateLiteral.ts] ////
//// [indexTypeNoSubstitutionTemplateLiteral.ts]
function Foo() {}
Foo[`b`] = function () {};
type Test = keyof typeof Foo;
//// [indexTypeNoSubstitutionTemplateLiteral.js]
"use strict";
function Foo() { }
Foo["b"] = function () { };

View File

@ -0,0 +1,15 @@
//// [tests/cases/compiler/indexTypeNoSubstitutionTemplateLiteral.ts] ////
=== indexTypeNoSubstitutionTemplateLiteral.ts ===
function Foo() {}
>Foo : Symbol(Foo, Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 0), Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 17))
Foo[`b`] = function () {};
>Foo : Symbol(Foo, Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 0), Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 17))
>`b` : Symbol(Foo[`b`], Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 17))
type Test = keyof typeof Foo;
>Test : Symbol(Test, Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 1, 26))
>Foo : Symbol(Foo, Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 0), Decl(indexTypeNoSubstitutionTemplateLiteral.ts, 0, 17))

View File

@ -0,0 +1,18 @@
//// [tests/cases/compiler/indexTypeNoSubstitutionTemplateLiteral.ts] ////
=== indexTypeNoSubstitutionTemplateLiteral.ts ===
function Foo() {}
>Foo : typeof Foo
Foo[`b`] = function () {};
>Foo[`b`] = function () {} : () => void
>Foo[`b`] : () => void
>Foo : typeof Foo
>`b` : "b"
>function () {} : () => void
type Test = keyof typeof Foo;
>Test : "b"
>Foo : typeof Foo

View File

@ -0,0 +1,7 @@
// @strict: true
function Foo() {}
Foo[`b`] = function () {};
type Test = keyof typeof Foo;