Skip to content

Commit 58bd72d

Browse files
committed
fix(transformer/typescript): incorrect enum-related symbol_id/reference_id
1 parent d36bf3c commit 58bd72d

File tree

2 files changed

+26
-32
lines changed

2 files changed

+26
-32
lines changed

crates/oxc_transformer/src/typescript/enum.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,13 @@ impl<'a> TypeScriptEnum<'a> {
8282
func_scope_id,
8383
AstNodeId::DUMMY,
8484
);
85+
ctx.scopes_mut().add_binding(func_scope_id, enum_name.to_compact_str(), param_symbol_id);
8586
let ident = BindingIdentifier {
8687
span: decl.id.span,
8788
name: decl.id.name.clone(),
8889
symbol_id: Cell::new(Some(param_symbol_id)),
8990
};
90-
let kind = ast.binding_pattern_kind_from_binding_identifier(ident);
91+
let kind = ast.binding_pattern_kind_from_binding_identifier(ident.clone());
9192
let id = ast.binding_pattern(kind, Option::<TSTypeAnnotation>::None, false);
9293

9394
// ((Foo) => {
@@ -102,7 +103,8 @@ impl<'a> TypeScriptEnum<'a> {
102103

103104
// Foo[Foo["X"] = 0] = "X";
104105
let is_already_declared = self.enums.contains_key(&enum_name);
105-
let statements = self.transform_ts_enum_members(&decl.members, enum_name.clone(), ctx);
106+
107+
let statements = self.transform_ts_enum_members(&decl.members, &ident, ctx);
106108
let body = ast.alloc_function_body(decl.span, ast.vec(), statements);
107109
let callee = Expression::FunctionExpression(ctx.alloc(Function {
108110
r#type: FunctionType::FunctionExpression,
@@ -187,19 +189,29 @@ impl<'a> TypeScriptEnum<'a> {
187189
Some(stmt)
188190
}
189191

192+
#[allow(clippy::needless_pass_by_value)]
190193
fn transform_ts_enum_members(
191194
&mut self,
192195
members: &Vec<'a, TSEnumMember<'a>>,
193-
enum_name: Atom<'a>,
194-
ctx: &TraverseCtx<'a>,
196+
param: &BindingIdentifier<'a>,
197+
ctx: &mut TraverseCtx<'a>,
195198
) -> Vec<'a, Statement<'a>> {
196-
// TODO: Set `span` and `references_id` on all `IdentifierReference`s created here
199+
let create_identifier_reference = |ctx: &mut TraverseCtx<'a>| {
200+
let ident = ctx.create_reference_id(
201+
param.span,
202+
param.name.clone(),
203+
param.symbol_id.get(),
204+
ReferenceFlag::Read,
205+
);
206+
ctx.ast.expression_from_identifier_reference(ident)
207+
};
197208

198209
let ast = ctx.ast;
199210

200211
let mut statements = ast.vec();
201212
let mut prev_constant_value = Some(ConstantValue::Number(-1.0));
202-
let mut previous_enum_members = self.enums.entry(enum_name.clone()).or_default().clone();
213+
let mut previous_enum_members = self.enums.entry(param.name.clone()).or_default().clone();
214+
203215
let mut prev_member_name: Option<Atom<'a>> = None;
204216

205217
for member in members {
@@ -238,7 +250,7 @@ impl<'a> TypeScriptEnum<'a> {
238250
);
239251
if !has_binding {
240252
IdentifierReferenceRename::new(
241-
enum_name.clone(),
253+
param.name.clone(),
242254
previous_enum_members.clone(),
243255
ctx,
244256
)
@@ -276,7 +288,7 @@ impl<'a> TypeScriptEnum<'a> {
276288
}
277289
} else if let Some(prev_member_name) = prev_member_name {
278290
let self_ref = {
279-
let obj = ast.expression_identifier_reference(SPAN, &enum_name);
291+
let obj = create_identifier_reference(ctx);
280292
let expr = ctx.ast.expression_string_literal(SPAN, prev_member_name);
281293
ast.member_expression_computed(SPAN, obj, expr, false).into()
282294
};
@@ -292,7 +304,7 @@ impl<'a> TypeScriptEnum<'a> {
292304

293305
// Foo["x"] = init
294306
let member_expr = {
295-
let obj = ast.expression_identifier_reference(SPAN, &enum_name);
307+
let obj = create_identifier_reference(ctx);
296308
let expr = ast.expression_string_literal(SPAN, member_name);
297309

298310
ast.member_expression_computed(SPAN, obj, expr, false)
@@ -304,7 +316,7 @@ impl<'a> TypeScriptEnum<'a> {
304316
// Foo[Foo["x"] = init] = "x"
305317
if !is_str {
306318
let member_expr = {
307-
let obj = ast.expression_identifier_reference(SPAN, &enum_name);
319+
let obj = create_identifier_reference(ctx);
308320
ast.member_expression_computed(SPAN, obj, expr, false)
309321
};
310322
let left = ast.simple_assignment_target_member_expression(member_expr);
@@ -317,9 +329,9 @@ impl<'a> TypeScriptEnum<'a> {
317329
statements.push(ast.statement_expression(member.span, expr));
318330
}
319331

320-
self.enums.insert(enum_name.clone(), previous_enum_members.clone());
332+
self.enums.insert(param.name.clone(), previous_enum_members.clone());
321333

322-
let enum_ref = ast.expression_identifier_reference(SPAN, enum_name);
334+
let enum_ref = create_identifier_reference(ctx);
323335
// return Foo;
324336
let return_stmt = ast.statement_return(SPAN, Some(enum_ref));
325337
statements.push(return_stmt);

tasks/transform_conformance/babel.snap.md

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
commit: 12619ffe
22

3-
Passed: 435/927
3+
Passed: 453/927
44

55
# All Passed:
66
* babel-preset-react
@@ -445,33 +445,15 @@ Passed: 435/927
445445
* opts/optimizeConstEnums/input.ts
446446
* opts/rewriteImportExtensions/input.ts
447447

448-
# babel-plugin-transform-typescript (91/151)
448+
# babel-plugin-transform-typescript (109/151)
449449
* class/accessor-allowDeclareFields-false/input.ts
450450
* class/accessor-allowDeclareFields-true/input.ts
451-
* enum/boolean-value/input.ts
452-
* enum/const/input.ts
453-
* enum/constant-folding/input.ts
454-
* enum/enum-merging-inner-references/input.ts
455-
* enum/enum-merging-inner-references-shadow/input.ts
456-
* enum/export/input.ts
457-
* enum/inferred/input.ts
458-
* enum/inner-references/input.ts
459451
* enum/mix-references/input.ts
460-
* enum/non-foldable-constant/input.ts
461-
* enum/non-scoped/input.ts
462-
* enum/outer-references/input.ts
463-
* enum/scoped/input.ts
464-
* enum/string-value/input.ts
465-
* enum/string-value-template/input.ts
466-
* enum/string-values-computed/input.ts
467452
* enum/ts5.0-const-foldable/input.ts
468453
* exports/declared-types/input.ts
469-
* exports/export-const-enums/input.ts
470454
* exports/export-import=/input.ts
471455
* exports/interface/input.ts
472456
* imports/elide-type-referenced-in-imports-equal-no/input.ts
473-
* imports/enum-id/input.ts
474-
* imports/enum-value/input.ts
475457
* imports/import=-module/input.ts
476458
* imports/only-remove-type-imports/input.ts
477459
* imports/type-only-export-specifier-2/input.ts

0 commit comments

Comments
 (0)