From e25927da57776d7d8f14baa12f4f069e20ca151a Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Tue, 17 May 2016 13:05:03 -0700 Subject: [PATCH] Unescape string literal types starting with double underscore. String literal types starting with double underscore are escaped in the parser and need to be unescaped before the type is given the string literal as its name. --- src/compiler/checker.ts | 9 +++++---- .../doubleUnderStringLiteralAssignability.errors.txt | 9 +++++++++ .../reference/doubleUnderStringLiteralAssignability.js | 8 ++++++++ .../compiler/doubleUnderStringLiteralAssignability.ts | 2 ++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/doubleUnderStringLiteralAssignability.errors.txt create mode 100644 tests/baselines/reference/doubleUnderStringLiteralAssignability.js create mode 100644 tests/cases/compiler/doubleUnderStringLiteralAssignability.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6a720d947df..587235d5b8e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5138,12 +5138,13 @@ namespace ts { } function getStringLiteralTypeForText(text: string): StringLiteralType { - if (hasProperty(stringLiteralTypes, text)) { - return stringLiteralTypes[text]; + const unescaped = unescapeIdentifier(text); + if (hasProperty(stringLiteralTypes, unescaped)) { + return stringLiteralTypes[unescaped]; } - const type = stringLiteralTypes[text] = createType(TypeFlags.StringLiteral); - type.text = text; + const type = stringLiteralTypes[unescaped] = createType(TypeFlags.StringLiteral); + type.text = unescaped; return type; } diff --git a/tests/baselines/reference/doubleUnderStringLiteralAssignability.errors.txt b/tests/baselines/reference/doubleUnderStringLiteralAssignability.errors.txt new file mode 100644 index 00000000000..782f022faeb --- /dev/null +++ b/tests/baselines/reference/doubleUnderStringLiteralAssignability.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/doubleUnderStringLiteralAssignability.ts(2,5): error TS2322: Type '"no_dunder"' is not assignable to type '"__dunder"'. + + +==== tests/cases/compiler/doubleUnderStringLiteralAssignability.ts (1 errors) ==== + var shouldBeOk: '__dunder' = '__dunder'; + var bad: '__dunder' = 'no_dunder'; + ~~~ +!!! error TS2322: Type '"no_dunder"' is not assignable to type '"__dunder"'. + \ No newline at end of file diff --git a/tests/baselines/reference/doubleUnderStringLiteralAssignability.js b/tests/baselines/reference/doubleUnderStringLiteralAssignability.js new file mode 100644 index 00000000000..7911c3766e1 --- /dev/null +++ b/tests/baselines/reference/doubleUnderStringLiteralAssignability.js @@ -0,0 +1,8 @@ +//// [doubleUnderStringLiteralAssignability.ts] +var shouldBeOk: '__dunder' = '__dunder'; +var bad: '__dunder' = 'no_dunder'; + + +//// [doubleUnderStringLiteralAssignability.js] +var shouldBeOk = '__dunder'; +var bad = 'no_dunder'; diff --git a/tests/cases/compiler/doubleUnderStringLiteralAssignability.ts b/tests/cases/compiler/doubleUnderStringLiteralAssignability.ts new file mode 100644 index 00000000000..81149acc992 --- /dev/null +++ b/tests/cases/compiler/doubleUnderStringLiteralAssignability.ts @@ -0,0 +1,2 @@ +var shouldBeOk: '__dunder' = '__dunder'; +var bad: '__dunder' = 'no_dunder';