mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
fix(transformer): exponentiation transform: fix duplicate symbols (#6300)
Identifier was being cloned unnecessarily, creating an extra symbol.
This commit is contained in:
parent
7f5a94b902
commit
bd81c5134c
2 changed files with 13 additions and 23 deletions
|
|
@ -146,17 +146,14 @@ impl<'a, 'ctx> ExponentiationOperator<'a, 'ctx> {
|
||||||
nodes: &mut Vec<'a, Expression<'a>>,
|
nodes: &mut Vec<'a, Expression<'a>>,
|
||||||
ctx: &mut TraverseCtx<'a>,
|
ctx: &mut TraverseCtx<'a>,
|
||||||
) -> Option<Exploded<'a>> {
|
) -> Option<Exploded<'a>> {
|
||||||
let node = node.as_simple_assignment_target_mut()?;
|
|
||||||
let obj = self.get_obj_ref(node, nodes, ctx)?;
|
|
||||||
let (reference, uid) = match node {
|
let (reference, uid) = match node {
|
||||||
SimpleAssignmentTarget::AssignmentTargetIdentifier(ident) => {
|
AssignmentTarget::AssignmentTargetIdentifier(_) => {
|
||||||
let reference =
|
let obj = self.get_obj_ref(node, nodes, ctx).unwrap();
|
||||||
AssignmentTarget::AssignmentTargetIdentifier(ctx.ast.alloc(
|
let ident = ctx.ast.move_assignment_target(node);
|
||||||
ctx.clone_identifier_reference(ident.as_ref(), ReferenceFlags::Write),
|
(ident, obj)
|
||||||
));
|
|
||||||
(reference, obj)
|
|
||||||
}
|
}
|
||||||
match_member_expression!(SimpleAssignmentTarget) => {
|
match_member_expression!(AssignmentTarget) => {
|
||||||
|
let obj = self.get_obj_ref(node, nodes, ctx).unwrap();
|
||||||
let member_expr = node.to_member_expression_mut();
|
let member_expr = node.to_member_expression_mut();
|
||||||
let computed = member_expr.is_computed();
|
let computed = member_expr.is_computed();
|
||||||
let prop = self.get_prop_ref(member_expr, nodes, ctx)?;
|
let prop = self.get_prop_ref(member_expr, nodes, ctx)?;
|
||||||
|
|
@ -202,12 +199,12 @@ impl<'a, 'ctx> ExponentiationOperator<'a, 'ctx> {
|
||||||
/// Make sure side-effects of evaluating `obj` of `obj.ref` and `obj[ref]` only happen once.
|
/// Make sure side-effects of evaluating `obj` of `obj.ref` and `obj[ref]` only happen once.
|
||||||
fn get_obj_ref(
|
fn get_obj_ref(
|
||||||
&mut self,
|
&mut self,
|
||||||
node: &mut SimpleAssignmentTarget<'a>,
|
node: &mut AssignmentTarget<'a>,
|
||||||
nodes: &mut Vec<'a, Expression<'a>>,
|
nodes: &mut Vec<'a, Expression<'a>>,
|
||||||
ctx: &mut TraverseCtx<'a>,
|
ctx: &mut TraverseCtx<'a>,
|
||||||
) -> Option<Expression<'a>> {
|
) -> Option<Expression<'a>> {
|
||||||
let reference = match node {
|
let reference = match node {
|
||||||
SimpleAssignmentTarget::AssignmentTargetIdentifier(ident) => {
|
AssignmentTarget::AssignmentTargetIdentifier(ident) => {
|
||||||
let reference = ctx.symbols().get_reference(ident.reference_id().unwrap());
|
let reference = ctx.symbols().get_reference(ident.reference_id().unwrap());
|
||||||
if let Some(symbol_id) = reference.symbol_id() {
|
if let Some(symbol_id) = reference.symbol_id() {
|
||||||
// this variable is declared in scope so we can be 100% sure
|
// this variable is declared in scope so we can be 100% sure
|
||||||
|
|
@ -229,12 +226,11 @@ impl<'a, 'ctx> ExponentiationOperator<'a, 'ctx> {
|
||||||
ReferenceFlags::Read,
|
ReferenceFlags::Read,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
match_member_expression!(SimpleAssignmentTarget) => {
|
match_member_expression!(AssignmentTarget) => {
|
||||||
let expr = match node {
|
let expr = match node.to_member_expression_mut() {
|
||||||
SimpleAssignmentTarget::ComputedMemberExpression(e) => &mut e.object,
|
MemberExpression::ComputedMemberExpression(e) => &mut e.object,
|
||||||
SimpleAssignmentTarget::StaticMemberExpression(e) => &mut e.object,
|
MemberExpression::StaticMemberExpression(e) => &mut e.object,
|
||||||
SimpleAssignmentTarget::PrivateFieldExpression(e) => &mut e.object,
|
MemberExpression::PrivateFieldExpression(e) => &mut e.object,
|
||||||
_ => unreachable!(),
|
|
||||||
};
|
};
|
||||||
let expr = ctx.ast.move_expression(expr);
|
let expr = ctx.ast.move_expression(expr);
|
||||||
// the object reference that we need to save is locally declared
|
// the object reference that we need to save is locally declared
|
||||||
|
|
|
||||||
|
|
@ -1630,12 +1630,6 @@ x Output mismatch
|
||||||
|
|
||||||
# babel-plugin-transform-exponentiation-operator (1/4)
|
# babel-plugin-transform-exponentiation-operator (1/4)
|
||||||
* exponentiation-operator/assignment/input.js
|
* exponentiation-operator/assignment/input.js
|
||||||
Symbol reference IDs mismatch for "num":
|
|
||||||
after transform: SymbolId(0): [ReferenceId(0), ReferenceId(1), ReferenceId(2)]
|
|
||||||
rebuilt : SymbolId(0): [ReferenceId(0), ReferenceId(2)]
|
|
||||||
Reference flags mismatch for "num":
|
|
||||||
after transform: ReferenceId(2): ReferenceFlags(Write)
|
|
||||||
rebuilt : ReferenceId(0): ReferenceFlags(Read | Write)
|
|
||||||
Reference flags mismatch for "num":
|
Reference flags mismatch for "num":
|
||||||
after transform: ReferenceId(1): ReferenceFlags(Write)
|
after transform: ReferenceId(1): ReferenceFlags(Write)
|
||||||
rebuilt : ReferenceId(2): ReferenceFlags(Read)
|
rebuilt : ReferenceId(2): ReferenceFlags(Read)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue