Skip to content

Commit 4796ece

Browse files
committed
refactor(transformer): TS annotations transform use move_expression (#4982)
Follow on after #4920. #4920 removed a usage of `AstBuilder::copy` and replaced with 2 new methods `AstBuilder::move_identifier_reference` and `AstBuilder:: move_member_expression`. We can instead use `AstBuilder::move_expression` earlier and then unpack the enum again. Hopefully the compiler can see that the 2 `unreachable!()` branches are indeed unreachable and elide them. `move_expression` is preferable to `move_member_expression` as it only creates 1 temporary `Box<Expression::NullLiteral>` instead of 2.
1 parent 1bd5853 commit 4796ece

File tree

2 files changed

+11
-29
lines changed

2 files changed

+11
-29
lines changed

crates/oxc_ast/src/ast_builder_impl.rs

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,35 +69,13 @@ impl<'a> AstBuilder<'a> {
6969
unsafe { std::mem::transmute_copy(src) }
7070
}
7171

72-
/// Moves the identifier reference out by replacing it with a dummy identifier reference.
73-
#[inline]
74-
pub fn move_identifier_reference(
75-
self,
76-
expr: &mut IdentifierReference<'a>,
77-
) -> IdentifierReference<'a> {
78-
let dummy = self.identifier_reference(expr.span(), Atom::empty());
79-
mem::replace(expr, dummy)
80-
}
81-
8272
/// Moves the expression out by replacing it with a null expression.
8373
#[inline]
8474
pub fn move_expression(self, expr: &mut Expression<'a>) -> Expression<'a> {
8575
let null_expr = self.expression_null_literal(expr.span());
8676
mem::replace(expr, null_expr)
8777
}
8878

89-
/// Moves the member expression out by replacing it with a dummy expression.
90-
#[inline]
91-
pub fn move_member_expression(self, expr: &mut MemberExpression<'a>) -> MemberExpression<'a> {
92-
let dummy = self.member_expression_computed(
93-
expr.span(),
94-
self.expression_null_literal(expr.span()),
95-
self.expression_null_literal(expr.span()),
96-
false,
97-
);
98-
mem::replace(expr, dummy)
99-
}
100-
10179
#[inline]
10280
pub fn move_statement(self, stmt: &mut Statement<'a>) -> Statement<'a> {
10381
let empty_stmt = self.empty_statement(stmt.span());

crates/oxc_transformer/src/typescript/annotations.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,16 +226,20 @@ impl<'a> TypeScriptAnnotations<'a> {
226226
if let Some(expr) = target.get_expression_mut() {
227227
match expr.get_inner_expression_mut() {
228228
// `foo!++` to `foo++`
229-
Expression::Identifier(ident) => {
230-
*target = self.ctx.ast.simple_assignment_target_from_identifier_reference(
231-
self.ctx.ast.move_identifier_reference(ident),
232-
);
229+
inner_expr @ Expression::Identifier(_) => {
230+
let inner_expr = self.ctx.ast.move_expression(inner_expr);
231+
let Expression::Identifier(ident) = inner_expr else {
232+
unreachable!();
233+
};
234+
*target = SimpleAssignmentTarget::AssignmentTargetIdentifier(ident);
233235
}
234236
// `foo.bar!++` to `foo.bar++`
235237
inner_expr @ match_member_expression!(Expression) => {
236-
*target = SimpleAssignmentTarget::from(
237-
self.ctx.ast.move_member_expression(inner_expr.to_member_expression_mut()),
238-
);
238+
let inner_expr = self.ctx.ast.move_expression(inner_expr);
239+
let Ok(member_expr) = MemberExpression::try_from(inner_expr) else {
240+
unreachable!();
241+
};
242+
*target = SimpleAssignmentTarget::from(member_expr);
239243
}
240244
_ => {
241245
// This should be never hit until more syntax is added to the JavaScript/TypeScrips

0 commit comments

Comments
 (0)