mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
fix(transformer/logical-assignment-operators): fix semantic errors (#5047)
Fix semantic error caused by `clone_in` causing `reference_id` to not exist. In this PR, I try to use `move_expression` as much as possible instead of `expr.clone_in`. But in some cases, we need to reuse the same expression in multiple places. I have added a `clone_expression` to workaround it I felt a bit painful we missing a [clone_in_scope](https://github.com/oxc-project/oxc/issues/4804) API
This commit is contained in:
parent
deda6ac136
commit
3b353321ad
2 changed files with 99 additions and 378 deletions
|
|
@ -164,13 +164,32 @@ impl<'a> Traverse<'a> for LogicalAssignmentOperators<'a> {
|
||||||
ctx.ast.simple_assignment_target_member_expression(assign_expr),
|
ctx.ast.simple_assignment_target_member_expression(assign_expr),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
left_expr = Expression::from(MemberExpression::StaticMemberExpression(
|
// transform `obj.x ||= 1` to `obj.x || (obj.x = 1)`
|
||||||
static_expr.clone_in(ctx.ast.allocator),
|
let object = ctx.ast.move_expression(&mut static_expr.object);
|
||||||
));
|
|
||||||
|
// TODO: We should use static_expr.clone_in instead of cloning the properties,
|
||||||
|
// but currently clone_in will get rid of IdentifierReference's reference_id
|
||||||
|
let static_expr_cloned = ctx.ast.static_member_expression(
|
||||||
|
static_expr.span,
|
||||||
|
Self::clone_expression(&object, ctx),
|
||||||
|
static_expr.property.clone_in(ctx.ast.allocator),
|
||||||
|
static_expr.optional,
|
||||||
|
);
|
||||||
|
|
||||||
|
left_expr = ctx.ast.expression_member(
|
||||||
|
ctx.ast.member_expression_from_static(static_expr_cloned),
|
||||||
|
);
|
||||||
|
|
||||||
|
let member_expr_moved = ctx.ast.member_expression_static(
|
||||||
|
static_expr.span,
|
||||||
|
object,
|
||||||
|
static_expr.property.clone_in(ctx.ast.allocator),
|
||||||
|
static_expr.optional,
|
||||||
|
);
|
||||||
|
|
||||||
assign_target = AssignmentTarget::from(
|
assign_target = AssignmentTarget::from(
|
||||||
ctx.ast.simple_assignment_target_member_expression(
|
ctx.ast
|
||||||
member_expr.clone_in(ctx.ast.allocator),
|
.simple_assignment_target_member_expression(member_expr_moved),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -229,31 +248,65 @@ impl<'a> Traverse<'a> for LogicalAssignmentOperators<'a> {
|
||||||
ctx.ast.member_expression_computed(SPAN, object, expression, false),
|
ctx.ast.member_expression_computed(SPAN, object, expression, false),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
// transform `obj[++key] ||= 1` to `obj[_key = ++key] || (obj[_key] = 1)`
|
||||||
let property_ident =
|
let property_ident =
|
||||||
self.maybe_generate_memoised(&computed_expr.expression, ctx);
|
self.maybe_generate_memoised(&computed_expr.expression, ctx);
|
||||||
|
|
||||||
let mut expr = computed_expr.clone_in(ctx.ast.allocator);
|
let object = ctx.ast.move_expression(&mut computed_expr.object);
|
||||||
|
let mut expression =
|
||||||
|
ctx.ast.move_expression(&mut computed_expr.expression);
|
||||||
|
|
||||||
|
// TODO: ideally we should use computed_expr.clone_in instead of cloning the properties,
|
||||||
|
// but currently clone_in will get rid of IdentifierReference's reference_id
|
||||||
|
let new_compute_expr = ctx.ast.computed_member_expression(
|
||||||
|
computed_expr.span,
|
||||||
|
Self::clone_expression(&object, ctx),
|
||||||
|
{
|
||||||
|
// _key = ++key
|
||||||
if let Some(property_ident) = &property_ident {
|
if let Some(property_ident) = &property_ident {
|
||||||
let left = AssignmentTarget::from(
|
let left = AssignmentTarget::from(
|
||||||
ctx.ast.simple_assignment_target_from_identifier_reference(
|
ctx.ast
|
||||||
property_ident.clone(),
|
.simple_assignment_target_from_identifier_reference(
|
||||||
|
ctx.clone_identifier_reference(
|
||||||
|
property_ident,
|
||||||
|
ReferenceFlags::Write,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
let right = computed_expr.expression.clone_in(ctx.ast.allocator);
|
ctx.ast.expression_assignment(
|
||||||
expr.expression =
|
SPAN,
|
||||||
ctx.ast.expression_assignment(SPAN, op, left, right);
|
op,
|
||||||
|
left,
|
||||||
|
ctx.ast.move_expression(&mut expression),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Self::clone_expression(&expression, ctx)
|
||||||
}
|
}
|
||||||
left_expr =
|
},
|
||||||
Expression::from(MemberExpression::ComputedMemberExpression(expr));
|
computed_expr.optional,
|
||||||
|
);
|
||||||
|
|
||||||
let mut expr = computed_expr.clone_in(ctx.ast.allocator);
|
left_expr = ctx.ast.expression_member(
|
||||||
|
ctx.ast.member_expression_from_computed(new_compute_expr),
|
||||||
|
);
|
||||||
|
|
||||||
|
// obj[_key] = 1
|
||||||
|
let new_compute_expr = ctx.ast.computed_member_expression(
|
||||||
|
computed_expr.span,
|
||||||
|
object,
|
||||||
|
{
|
||||||
if let Some(property_ident) = property_ident {
|
if let Some(property_ident) = property_ident {
|
||||||
expr.expression =
|
ctx.ast.expression_from_identifier_reference(property_ident)
|
||||||
ctx.ast.expression_from_identifier_reference(property_ident);
|
} else {
|
||||||
|
expression
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
computed_expr.optional,
|
||||||
|
);
|
||||||
|
|
||||||
assign_target = AssignmentTarget::from(
|
assign_target = AssignmentTarget::from(
|
||||||
ctx.ast.simple_assignment_target_member_expression(
|
ctx.ast.simple_assignment_target_member_expression(
|
||||||
MemberExpression::ComputedMemberExpression(expr),
|
ctx.ast.member_expression_from_computed(new_compute_expr),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
@ -279,22 +332,31 @@ impl<'a> Traverse<'a> for LogicalAssignmentOperators<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> LogicalAssignmentOperators<'a> {
|
impl<'a> LogicalAssignmentOperators<'a> {
|
||||||
|
/// Clone an expression
|
||||||
|
///
|
||||||
|
/// If it is an identifier, clone the identifier by [TraverseCtx::clone_identifier_reference], otherwise, use [CloneIn].
|
||||||
|
///
|
||||||
|
/// TODO: remove this until <https://github.com/oxc-project/oxc/issues/4804> is resolved.
|
||||||
|
pub fn clone_expression(expr: &Expression<'a>, ctx: &mut TraverseCtx<'a>) -> Expression<'a> {
|
||||||
|
match expr {
|
||||||
|
Expression::Identifier(ident) => ctx.ast.expression_from_identifier_reference(
|
||||||
|
ctx.clone_identifier_reference(ident, ReferenceFlags::Read),
|
||||||
|
),
|
||||||
|
_ => expr.clone_in(ctx.ast.allocator),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn maybe_generate_memoised(
|
pub fn maybe_generate_memoised(
|
||||||
&mut self,
|
&mut self,
|
||||||
expr: &Expression<'a>,
|
expr: &Expression<'a>,
|
||||||
ctx: &mut TraverseCtx<'a>,
|
ctx: &mut TraverseCtx<'a>,
|
||||||
) -> Option<IdentifierReference<'a>> {
|
) -> Option<IdentifierReference<'a>> {
|
||||||
let name = match expr {
|
if ctx.symbols().is_static(expr) {
|
||||||
Expression::Super(_) | Expression::ThisExpression(_) => return None,
|
|
||||||
Expression::Identifier(ident) => ident.name.clone(),
|
|
||||||
Expression::StringLiteral(str) => str.value.clone(),
|
|
||||||
_ => {
|
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
let symbol_id =
|
let symbol_id = ctx
|
||||||
ctx.generate_uid_in_current_scope(name.as_str(), SymbolFlags::FunctionScopedVariable);
|
.generate_uid_in_current_scope_based_on_node(expr, SymbolFlags::FunctionScopedVariable);
|
||||||
let symbol_name = ctx.ast.atom(ctx.symbols().get_name(symbol_id));
|
let symbol_name = ctx.ast.atom(ctx.symbols().get_name(symbol_id));
|
||||||
|
|
||||||
// var _name;
|
// var _name;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
commit: 12619ffe
|
commit: 12619ffe
|
||||||
|
|
||||||
Passed: 396/953
|
Passed: 397/953
|
||||||
|
|
||||||
# All Passed:
|
# All Passed:
|
||||||
* babel-preset-react
|
* babel-preset-react
|
||||||
|
|
@ -1276,349 +1276,8 @@ preset-env: unknown field `shippedProposals`, expected `targets` or `bugfixes`
|
||||||
preset-env: unknown field `shippedProposals`, expected `targets` or `bugfixes`
|
preset-env: unknown field `shippedProposals`, expected `targets` or `bugfixes`
|
||||||
|
|
||||||
|
|
||||||
# babel-plugin-transform-logical-assignment-operators (4/6)
|
# babel-plugin-transform-logical-assignment-operators (5/6)
|
||||||
* logical-assignment/general-semantics/input.js
|
|
||||||
x Semantic Collector failed after transform
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:32:8]
|
|
||||||
31 |
|
|
||||||
32 | expect(deep.obj.x ||= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
33 | expect(gets).toBe(1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:32:8]
|
|
||||||
31 |
|
|
||||||
32 | expect(deep.obj.x ||= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
33 | expect(gets).toBe(1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:34:8]
|
|
||||||
33 | expect(gets).toBe(1);
|
|
||||||
34 | expect(deep.obj.x ||= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
35 | expect(gets).toBe(2);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:34:8]
|
|
||||||
33 | expect(gets).toBe(1);
|
|
||||||
34 | expect(deep.obj.x ||= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
35 | expect(gets).toBe(2);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:37:8]
|
|
||||||
36 |
|
|
||||||
37 | expect(deep.obj.x &&= 0).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
38 | expect(gets).toBe(3);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:37:8]
|
|
||||||
36 |
|
|
||||||
37 | expect(deep.obj.x &&= 0).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
38 | expect(gets).toBe(3);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:39:8]
|
|
||||||
38 | expect(gets).toBe(3);
|
|
||||||
39 | expect(deep.obj.x &&= 3).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
40 | expect(gets).toBe(4);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:39:8]
|
|
||||||
38 | expect(gets).toBe(3);
|
|
||||||
39 | expect(deep.obj.x &&= 3).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
40 | expect(gets).toBe(4);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:43:14]
|
|
||||||
42 | var key = 0;
|
|
||||||
43 | expect(obj[++key] ||= 1).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
44 | expect(key).toBe(1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:46:14]
|
|
||||||
45 | key = 0;
|
|
||||||
46 | expect(obj[++key] ||= 2).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
47 | expect(key).toBe(1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:50:14]
|
|
||||||
49 | key = 0;
|
|
||||||
50 | expect(obj[++key] &&= 0).toBe(0);
|
|
||||||
: ^^^
|
|
||||||
51 | expect(key).toBe(1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:53:14]
|
|
||||||
52 | key = 0;
|
|
||||||
53 | expect(obj[++key] &&= 3).toBe(0);
|
|
||||||
: ^^^
|
|
||||||
54 | expect(key).toBe(1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:57:8]
|
|
||||||
56 | key = 0;
|
|
||||||
57 | expect(deep.obj[++key] ||= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
58 | expect(gets).toBe(5);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:57:19]
|
|
||||||
56 | key = 0;
|
|
||||||
57 | expect(deep.obj[++key] ||= 1).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
58 | expect(gets).toBe(5);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:57:8]
|
|
||||||
56 | key = 0;
|
|
||||||
57 | expect(deep.obj[++key] ||= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
58 | expect(gets).toBe(5);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:57:19]
|
|
||||||
56 | key = 0;
|
|
||||||
57 | expect(deep.obj[++key] ||= 1).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
58 | expect(gets).toBe(5);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:61:8]
|
|
||||||
60 | key = 0;
|
|
||||||
61 | expect(deep.obj[++key] ||= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
62 | expect(gets).toBe(6);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:61:19]
|
|
||||||
60 | key = 0;
|
|
||||||
61 | expect(deep.obj[++key] ||= 2).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
62 | expect(gets).toBe(6);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:61:8]
|
|
||||||
60 | key = 0;
|
|
||||||
61 | expect(deep.obj[++key] ||= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
62 | expect(gets).toBe(6);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:61:19]
|
|
||||||
60 | key = 0;
|
|
||||||
61 | expect(deep.obj[++key] ||= 2).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
62 | expect(gets).toBe(6);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:66:8]
|
|
||||||
65 | key = 0;
|
|
||||||
66 | expect(deep.obj[++key] &&= 0).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
67 | expect(gets).toBe(7);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:66:19]
|
|
||||||
65 | key = 0;
|
|
||||||
66 | expect(deep.obj[++key] &&= 0).toBe(0);
|
|
||||||
: ^^^
|
|
||||||
67 | expect(gets).toBe(7);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:66:8]
|
|
||||||
65 | key = 0;
|
|
||||||
66 | expect(deep.obj[++key] &&= 0).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
67 | expect(gets).toBe(7);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:66:19]
|
|
||||||
65 | key = 0;
|
|
||||||
66 | expect(deep.obj[++key] &&= 0).toBe(0);
|
|
||||||
: ^^^
|
|
||||||
67 | expect(gets).toBe(7);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:70:8]
|
|
||||||
69 | key = 0;
|
|
||||||
70 | expect(deep.obj[++key] &&= 3).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
71 | expect(gets).toBe(8);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:70:19]
|
|
||||||
69 | key = 0;
|
|
||||||
70 | expect(deep.obj[++key] &&= 3).toBe(0);
|
|
||||||
: ^^^
|
|
||||||
71 | expect(gets).toBe(8);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:70:8]
|
|
||||||
69 | key = 0;
|
|
||||||
70 | expect(deep.obj[++key] &&= 3).toBe(0);
|
|
||||||
: ^^^^
|
|
||||||
71 | expect(gets).toBe(8);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/general-semantics/input.js:70:19]
|
|
||||||
69 | key = 0;
|
|
||||||
70 | expect(deep.obj[++key] &&= 3).toBe(0);
|
|
||||||
: ^^^
|
|
||||||
71 | expect(gets).toBe(8);
|
|
||||||
`----
|
|
||||||
|
|
||||||
|
|
||||||
* logical-assignment/null-coalescing/input.js
|
* logical-assignment/null-coalescing/input.js
|
||||||
x Semantic Collector failed after transform
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:28:8]
|
|
||||||
27 | obj.x = undefined;
|
|
||||||
28 | expect(deep.obj.x ??= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
29 | expect(gets, 1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:28:8]
|
|
||||||
27 | obj.x = undefined;
|
|
||||||
28 | expect(deep.obj.x ??= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
29 | expect(gets, 1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:30:8]
|
|
||||||
29 | expect(gets, 1);
|
|
||||||
30 | expect(deep.obj.x ??= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
31 | expect(gets, 2);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:30:8]
|
|
||||||
29 | expect(gets, 1);
|
|
||||||
30 | expect(deep.obj.x ??= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
31 | expect(gets, 2);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:35:14]
|
|
||||||
34 | obj.x = undefined;
|
|
||||||
35 | expect(obj[++key] ??= 1).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
36 | expect(key, 1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:38:14]
|
|
||||||
37 | key = 0;
|
|
||||||
38 | expect(obj[++key] ??= 2).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
39 | expect(key, 1);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:43:8]
|
|
||||||
42 | key = 0;
|
|
||||||
43 | expect(deep.obj[++key] ??= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
44 | expect(gets, 3);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:43:19]
|
|
||||||
42 | key = 0;
|
|
||||||
43 | expect(deep.obj[++key] ??= 1).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
44 | expect(gets, 3);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:43:8]
|
|
||||||
42 | key = 0;
|
|
||||||
43 | expect(deep.obj[++key] ??= 1).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
44 | expect(gets, 3);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:43:19]
|
|
||||||
42 | key = 0;
|
|
||||||
43 | expect(deep.obj[++key] ??= 1).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
44 | expect(gets, 3);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:47:8]
|
|
||||||
46 | key = 0;
|
|
||||||
47 | expect(deep.obj[++key] ??= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
48 | expect(gets, 4);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:47:19]
|
|
||||||
46 | key = 0;
|
|
||||||
47 | expect(deep.obj[++key] ??= 2).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
48 | expect(gets, 4);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: deep
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:47:8]
|
|
||||||
46 | key = 0;
|
|
||||||
47 | expect(deep.obj[++key] ??= 2).toBe(1);
|
|
||||||
: ^^^^
|
|
||||||
48 | expect(gets, 4);
|
|
||||||
`----
|
|
||||||
|
|
||||||
x Missing ReferenceId: key
|
|
||||||
,-[tasks/coverage/babel/packages/babel-plugin-transform-logical-assignment-operators/test/fixtures/logical-assignment/null-coalescing/input.js:47:19]
|
|
||||||
46 | key = 0;
|
|
||||||
47 | expect(deep.obj[++key] ??= 2).toBe(1);
|
|
||||||
: ^^^
|
|
||||||
48 | expect(gets, 4);
|
|
||||||
`----
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue