diff --git a/crates/oxc_transformer/src/typescript/enum.rs b/crates/oxc_transformer/src/typescript/enum.rs index f97996072e89d..b15f088075448 100644 --- a/crates/oxc_transformer/src/typescript/enum.rs +++ b/crates/oxc_transformer/src/typescript/enum.rs @@ -417,10 +417,18 @@ impl<'a> TypeScriptEnum<'a> { Expression::NumericLiteral(lit) => Some(ConstantValue::Number(lit.value)), Expression::StringLiteral(lit) => Some(ConstantValue::String(lit.value.to_string())), Expression::TemplateLiteral(lit) => { - let mut value = String::new(); - for part in &lit.quasis { - value.push_str(&part.value.raw); - } + let value = if let Some(quasi) = lit.single_quasi() { + quasi.to_string() + } else { + let mut value = String::new(); + for (quasi, expr) in lit.quasis.iter().zip(&lit.expressions) { + value.push_str(&quasi.value.cooked.unwrap_or(quasi.value.raw)); + if let ConstantValue::String(str) = self.evaluate(expr, prev_members)? { + value.push_str(&str); + } + } + value + }; Some(ConstantValue::String(value)) } Expression::ParenthesizedExpression(expr) => { diff --git a/tasks/coverage/snapshots/semantic_typescript.snap b/tasks/coverage/snapshots/semantic_typescript.snap index 64afa5241afbe..9027f4324cdcf 100644 --- a/tasks/coverage/snapshots/semantic_typescript.snap +++ b/tasks/coverage/snapshots/semantic_typescript.snap @@ -3776,41 +3776,39 @@ rebuilt : SymbolId(0): Span { start: 0, end: 0 } semantic Error: tasks/coverage/typescript/tests/cases/compiler/computedEnumMemberSyntacticallyString.ts Missing ReferenceId: "Foo" +Missing ReferenceId: "Foo" +Missing ReferenceId: "Foo" Bindings mismatch: after transform: ScopeId(1): ["A", "B", "C", "F", "Foo", "G", "H", "I", "J"] rebuilt : ScopeId(1): ["Foo"] Scope flags mismatch: after transform: ScopeId(1): ScopeFlags(0x0) rebuilt : ScopeId(1): ScopeFlags(Function) -Symbol reference IDs mismatch for "BAR": -after transform: SymbolId(0): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(3), ReferenceId(4), ReferenceId(7)] -rebuilt : SymbolId(0): [ReferenceId(3), ReferenceId(7), ReferenceId(10), ReferenceId(15)] Symbol flags mismatch for "Foo": after transform: SymbolId(1): SymbolFlags(RegularEnum) rebuilt : SymbolId(1): SymbolFlags(FunctionScopedVariable) Symbol reference IDs mismatch for "Foo": -after transform: SymbolId(10): [ReferenceId(9), ReferenceId(10), ReferenceId(11), ReferenceId(12), ReferenceId(13), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18), ReferenceId(19), ReferenceId(20), ReferenceId(21)] -rebuilt : SymbolId(2): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(4), ReferenceId(5), ReferenceId(6), ReferenceId(8), ReferenceId(9), ReferenceId(11), ReferenceId(12), ReferenceId(13), ReferenceId(14), ReferenceId(16), ReferenceId(17)] +after transform: SymbolId(10): [ReferenceId(9), ReferenceId(10), ReferenceId(11), ReferenceId(12), ReferenceId(13), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18), ReferenceId(19), ReferenceId(20), ReferenceId(21), ReferenceId(22), ReferenceId(23), ReferenceId(24)] +rebuilt : SymbolId(2): [ReferenceId(0), ReferenceId(2), ReferenceId(3), ReferenceId(5), ReferenceId(6), ReferenceId(8), ReferenceId(9), ReferenceId(11), ReferenceId(12), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18), ReferenceId(19), ReferenceId(21), ReferenceId(22), ReferenceId(23), ReferenceId(24)] semantic Error: tasks/coverage/typescript/tests/cases/compiler/computedEnumMemberSyntacticallyString2.ts Missing ReferenceId: "Foo" Missing ReferenceId: "Foo" Missing ReferenceId: "Foo" +Missing ReferenceId: "Foo" +Missing ReferenceId: "Foo" Bindings mismatch: after transform: ScopeId(1): ["A", "B", "C", "D", "E1", "E2", "F", "Foo", "G", "H", "I", "J"] rebuilt : ScopeId(1): ["Foo"] Scope flags mismatch: after transform: ScopeId(1): ScopeFlags(StrictMode) rebuilt : ScopeId(1): ScopeFlags(StrictMode | Function) -Symbol reference IDs mismatch for "BAR": -after transform: SymbolId(0): [ReferenceId(0), ReferenceId(4), ReferenceId(5), ReferenceId(6), ReferenceId(7), ReferenceId(10)] -rebuilt : SymbolId(0): [ReferenceId(12), ReferenceId(15), ReferenceId(18), ReferenceId(21), ReferenceId(26)] Symbol flags mismatch for "Foo": after transform: SymbolId(2): SymbolFlags(RegularEnum) rebuilt : SymbolId(2): SymbolFlags(FunctionScopedVariable) Symbol reference IDs mismatch for "Foo": -after transform: SymbolId(14): [ReferenceId(12), ReferenceId(13), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18), ReferenceId(19), ReferenceId(20), ReferenceId(21), ReferenceId(22), ReferenceId(23), ReferenceId(24), ReferenceId(25), ReferenceId(26), ReferenceId(27), ReferenceId(28), ReferenceId(29), ReferenceId(30), ReferenceId(31)] -rebuilt : SymbolId(3): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(4), ReferenceId(5), ReferenceId(6), ReferenceId(7), ReferenceId(8), ReferenceId(9), ReferenceId(10), ReferenceId(11), ReferenceId(13), ReferenceId(14), ReferenceId(16), ReferenceId(17), ReferenceId(19), ReferenceId(20), ReferenceId(22), ReferenceId(23), ReferenceId(24), ReferenceId(25), ReferenceId(27), ReferenceId(28)] +after transform: SymbolId(14): [ReferenceId(12), ReferenceId(13), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18), ReferenceId(19), ReferenceId(20), ReferenceId(21), ReferenceId(22), ReferenceId(23), ReferenceId(24), ReferenceId(25), ReferenceId(26), ReferenceId(27), ReferenceId(28), ReferenceId(29), ReferenceId(30), ReferenceId(31), ReferenceId(32), ReferenceId(33)] +rebuilt : SymbolId(3): [ReferenceId(0), ReferenceId(2), ReferenceId(3), ReferenceId(5), ReferenceId(6), ReferenceId(7), ReferenceId(8), ReferenceId(9), ReferenceId(10), ReferenceId(11), ReferenceId(12), ReferenceId(14), ReferenceId(15), ReferenceId(17), ReferenceId(18), ReferenceId(20), ReferenceId(21), ReferenceId(23), ReferenceId(24), ReferenceId(25), ReferenceId(26), ReferenceId(27), ReferenceId(28), ReferenceId(30), ReferenceId(31), ReferenceId(32), ReferenceId(33)] semantic Error: tasks/coverage/typescript/tests/cases/compiler/computedEnumTypeWidening.ts Bindings mismatch: diff --git a/tasks/transform_conformance/snapshots/oxc.snap.md b/tasks/transform_conformance/snapshots/oxc.snap.md index e69cc7d4313df..a0f64e9b2a202 100644 --- a/tasks/transform_conformance/snapshots/oxc.snap.md +++ b/tasks/transform_conformance/snapshots/oxc.snap.md @@ -1,6 +1,6 @@ commit: 1d4546bc -Passed: 180/298 +Passed: 180/299 # All Passed: * babel-plugin-transform-class-static-block @@ -44,7 +44,7 @@ after transform: SymbolId(0): [ReferenceId(0), ReferenceId(2), ReferenceId(6), R rebuilt : SymbolId(0): [ReferenceId(0), ReferenceId(2), ReferenceId(6), ReferenceId(10)] -# babel-plugin-transform-typescript (5/26) +# babel-plugin-transform-typescript (5/27) * allow-declare-fields-false/input.ts Unresolved references mismatch: after transform: ["dce"] @@ -169,6 +169,41 @@ Symbol reference IDs mismatch for "NestInner": after transform: SymbolId(18): [ReferenceId(31), ReferenceId(32), ReferenceId(33), ReferenceId(34), ReferenceId(35)] rebuilt : SymbolId(9): [ReferenceId(25), ReferenceId(26), ReferenceId(28), ReferenceId(29), ReferenceId(30), ReferenceId(31)] +* enum-template-literal/input.ts +Bindings mismatch: +after transform: ScopeId(1): ["LARGE", "SMALL", "Size"] +rebuilt : ScopeId(1): ["Size"] +Scope flags mismatch: +after transform: ScopeId(1): ScopeFlags(0x0) +rebuilt : ScopeId(1): ScopeFlags(Function) +Bindings mismatch: +after transform: ScopeId(2): ["Animal", "CAT", "DOG"] +rebuilt : ScopeId(2): ["Animal"] +Scope flags mismatch: +after transform: ScopeId(2): ScopeFlags(0x0) +rebuilt : ScopeId(2): ScopeFlags(Function) +Bindings mismatch: +after transform: ScopeId(3): ["AnimalSize", "LARGE_DOG", "SMALL_CAT"] +rebuilt : ScopeId(3): ["AnimalSize"] +Scope flags mismatch: +after transform: ScopeId(3): ScopeFlags(0x0) +rebuilt : ScopeId(3): ScopeFlags(Function) +Symbol flags mismatch for "Size": +after transform: SymbolId(0): SymbolFlags(RegularEnum) +rebuilt : SymbolId(0): SymbolFlags(FunctionScopedVariable) +Symbol reference IDs mismatch for "Size": +after transform: SymbolId(0): [ReferenceId(0), ReferenceId(2), ReferenceId(7)] +rebuilt : SymbolId(0): [ReferenceId(3)] +Symbol flags mismatch for "Animal": +after transform: SymbolId(3): SymbolFlags(RegularEnum) +rebuilt : SymbolId(2): SymbolFlags(FunctionScopedVariable) +Symbol reference IDs mismatch for "Animal": +after transform: SymbolId(3): [ReferenceId(1), ReferenceId(3), ReferenceId(11)] +rebuilt : SymbolId(2): [ReferenceId(7)] +Symbol flags mismatch for "AnimalSize": +after transform: SymbolId(6): SymbolFlags(RegularEnum) +rebuilt : SymbolId(4): SymbolFlags(FunctionScopedVariable) + * export-elimination/input.ts Bindings mismatch: after transform: ScopeId(0): ["Bar", "Foo", "Func", "Im", "Name", "Ok"] diff --git a/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-template-literal/input.ts b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-template-literal/input.ts new file mode 100644 index 0000000000000..e027e49fc38e8 --- /dev/null +++ b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-template-literal/input.ts @@ -0,0 +1,14 @@ +enum Size { + SMALL = "SMALL", + LARGE = "LARGE", +} + +enum Animal { + CAT = "CAT", + DOG = "DOG", +} + +enum AnimalSize { + SMALL_CAT = `${Size.SMALL}_${Animal.CAT}`, + LARGE_DOG = `${Size.LARGE}_${Animal.DOG}`, +} diff --git a/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-template-literal/output.js b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-template-literal/output.js new file mode 100644 index 0000000000000..a87e76f3dc37b --- /dev/null +++ b/tasks/transform_conformance/tests/babel-plugin-transform-typescript/test/fixtures/enum-template-literal/output.js @@ -0,0 +1,17 @@ +var Size = /* @__PURE__ */ function(Size) { + Size["SMALL"] = "SMALL"; + Size["LARGE"] = "LARGE"; + return Size; +}(Size || {}); + +var Animal = /* @__PURE__ */ function(Animal) { + Animal["CAT"] = "CAT"; + Animal["DOG"] = "DOG"; + return Animal; +}(Animal || {}); + +var AnimalSize = /* @__PURE__ */ function(AnimalSize) { + AnimalSize["SMALL_CAT"] = "SMALL_CAT"; + AnimalSize["LARGE_DOG"] = "LARGE_DOG"; + return AnimalSize; +}(AnimalSize || {}); \ No newline at end of file