From cc8399dc41ca47a48ad99dc07a18f0a3009bbe4a Mon Sep 17 00:00:00 2001 From: Andy Date: Wed, 26 Jul 2017 16:00:34 -0700 Subject: [PATCH] Escape string literal before looking it up in enum's symbol table (#17441) --- src/compiler/checker.ts | 2 +- .../reference/underscoreEscapedNameInEnum.js | 13 +++++++++++++ .../underscoreEscapedNameInEnum.symbols | 10 ++++++++++ .../reference/underscoreEscapedNameInEnum.types | 16 ++++++++++++++++ .../compiler/underscoreEscapedNameInEnum.ts | 4 ++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/underscoreEscapedNameInEnum.js create mode 100644 tests/baselines/reference/underscoreEscapedNameInEnum.symbols create mode 100644 tests/baselines/reference/underscoreEscapedNameInEnum.types create mode 100644 tests/cases/compiler/underscoreEscapedNameInEnum.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f2b9d50db91..bf1cc33d159 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21517,7 +21517,7 @@ namespace ts { else { const argument = ex.argumentExpression; Debug.assert(isLiteralExpression(argument)); - name = (argument as LiteralExpression).text as __String; // TODO: GH#17348 + name = escapeLeadingUnderscores((argument as LiteralExpression).text); } return evaluateEnumMember(expr, type.symbol, name); } diff --git a/tests/baselines/reference/underscoreEscapedNameInEnum.js b/tests/baselines/reference/underscoreEscapedNameInEnum.js new file mode 100644 index 00000000000..db40f126739 --- /dev/null +++ b/tests/baselines/reference/underscoreEscapedNameInEnum.js @@ -0,0 +1,13 @@ +//// [underscoreEscapedNameInEnum.ts] +enum E { + "__foo" = 1, + bar = E["__foo"] + 1 +} + + +//// [underscoreEscapedNameInEnum.js] +var E; +(function (E) { + E[E["__foo"] = 1] = "__foo"; + E[E["bar"] = 2] = "bar"; +})(E || (E = {})); diff --git a/tests/baselines/reference/underscoreEscapedNameInEnum.symbols b/tests/baselines/reference/underscoreEscapedNameInEnum.symbols new file mode 100644 index 00000000000..4546d844cd2 --- /dev/null +++ b/tests/baselines/reference/underscoreEscapedNameInEnum.symbols @@ -0,0 +1,10 @@ +=== tests/cases/compiler/underscoreEscapedNameInEnum.ts === +enum E { +>E : Symbol(E, Decl(underscoreEscapedNameInEnum.ts, 0, 0)) + + "__foo" = 1, + bar = E["__foo"] + 1 +>bar : Symbol(E.bar, Decl(underscoreEscapedNameInEnum.ts, 1, 16)) +>E : Symbol(E, Decl(underscoreEscapedNameInEnum.ts, 0, 0)) +} + diff --git a/tests/baselines/reference/underscoreEscapedNameInEnum.types b/tests/baselines/reference/underscoreEscapedNameInEnum.types new file mode 100644 index 00000000000..02fc9a5493c --- /dev/null +++ b/tests/baselines/reference/underscoreEscapedNameInEnum.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/underscoreEscapedNameInEnum.ts === +enum E { +>E : E + + "__foo" = 1, +>1 : 1 + + bar = E["__foo"] + 1 +>bar : E +>E["__foo"] + 1 : number +>E["__foo"] : E +>E : typeof E +>"__foo" : "__foo" +>1 : 1 +} + diff --git a/tests/cases/compiler/underscoreEscapedNameInEnum.ts b/tests/cases/compiler/underscoreEscapedNameInEnum.ts new file mode 100644 index 00000000000..ef16f253dd7 --- /dev/null +++ b/tests/cases/compiler/underscoreEscapedNameInEnum.ts @@ -0,0 +1,4 @@ +enum E { + "__foo" = 1, + bar = E["__foo"] + 1 +}