Skip to content

Commit d660d8d

Browse files
committed
fix(transformer/optional-chaining): do not create unused reference when noDocumentAll assumption (#7847)
Similar to #7832. Only create an `IdentifierReference` if it's going to be used in AST.
1 parent beb982a commit d660d8d

File tree

2 files changed

+25
-39
lines changed

2 files changed

+25
-39
lines changed

crates/oxc_transformer/src/es2020/optional_chaining.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -552,22 +552,25 @@ impl<'a, 'ctx> OptionalChaining<'a, 'ctx> {
552552
// `foo` -> `foo === null || foo === void 0`
553553
if let Expression::Identifier(ident) = expr {
554554
if let Some(binding) = self.get_existing_binding_for_identifier(ident, ctx) {
555-
let left1 = binding.create_read_expression(ctx);
556-
let left2 = binding.create_read_expression(ctx);
557555
if ident.name == "eval" {
558556
// `eval?.()` is an indirect eval call transformed to `(0,eval)()`
559557
let zero = ctx.ast.number_0();
560558
let original_callee = ctx.ast.move_expression(expr);
561559
let expressions = ctx.ast.vec_from_array([zero, original_callee]);
562560
*expr = ctx.ast.expression_sequence(SPAN, expressions);
563561
}
564-
self.set_binding_context(binding);
565-
if self.ctx.assumptions.no_document_all {
562+
563+
let left1 = binding.create_read_expression(ctx);
564+
let replacement = if self.ctx.assumptions.no_document_all {
566565
// `foo === null`
567-
return self.wrap_null_check(left1, ctx);
568-
}
569-
// `foo === null || foo === void 0`
570-
return self.wrap_optional_check(left1, left2, ctx);
566+
self.wrap_null_check(left1, ctx)
567+
} else {
568+
// `foo === null || foo === void 0`
569+
let left2 = binding.create_read_expression(ctx);
570+
self.wrap_optional_check(left1, left2, ctx)
571+
};
572+
self.set_binding_context(binding);
573+
return replacement;
571574
}
572575
}
573576

tasks/transform_conformance/snapshots/babel.snap.md

+14-31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
commit: 54a8389f
22

3-
Passed: 580/927
3+
Passed: 581/927
44

55
# All Passed:
66
* babel-plugin-transform-class-static-block
@@ -526,20 +526,17 @@ x Output mismatch
526526
x Output mismatch
527527

528528

529-
# babel-plugin-transform-optional-chaining (32/45)
529+
# babel-plugin-transform-optional-chaining (33/45)
530530
* assumption-noDocumentAll/assignment/input.js
531531
Symbol reference IDs mismatch for "_obj$a":
532-
after transform: SymbolId(5): [ReferenceId(9), ReferenceId(10), ReferenceId(11)]
532+
after transform: SymbolId(5): [ReferenceId(7), ReferenceId(8), ReferenceId(9)]
533533
rebuilt : SymbolId(0): [ReferenceId(3), ReferenceId(5)]
534534
Symbol reference IDs mismatch for "_obj$b":
535-
after transform: SymbolId(6): [ReferenceId(14), ReferenceId(15), ReferenceId(16)]
535+
after transform: SymbolId(6): [ReferenceId(11), ReferenceId(12), ReferenceId(13)]
536536
rebuilt : SymbolId(1): [ReferenceId(7), ReferenceId(9)]
537537
Symbol reference IDs mismatch for "_obj$a2":
538-
after transform: SymbolId(7): [ReferenceId(19), ReferenceId(20), ReferenceId(21)]
538+
after transform: SymbolId(7): [ReferenceId(15), ReferenceId(16), ReferenceId(17)]
539539
rebuilt : SymbolId(2): [ReferenceId(12), ReferenceId(14)]
540-
Symbol reference IDs mismatch for "obj":
541-
after transform: SymbolId(0): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(4), ReferenceId(5), ReferenceId(6), ReferenceId(7), ReferenceId(8), ReferenceId(12), ReferenceId(13), ReferenceId(17), ReferenceId(18)]
542-
rebuilt : SymbolId(3): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(4), ReferenceId(6), ReferenceId(8), ReferenceId(11), ReferenceId(13)]
543540

544541
* assumption-noDocumentAll/cast-to-boolean/input.js
545542
Bindings mismatch:
@@ -607,9 +604,6 @@ rebuilt : SymbolId(1): ScopeId(1)
607604
Symbol scope ID mismatch for "a":
608605
after transform: SymbolId(3): ScopeId(2)
609606
rebuilt : SymbolId(4): ScopeId(3)
610-
Symbol reference IDs mismatch for "a":
611-
after transform: SymbolId(3): [ReferenceId(1), ReferenceId(7), ReferenceId(8)]
612-
rebuilt : SymbolId(4): [ReferenceId(3), ReferenceId(4)]
613607
Symbol scope ID mismatch for "b":
614608
after transform: SymbolId(4): ScopeId(2)
615609
rebuilt : SymbolId(5): ScopeId(3)
@@ -620,7 +614,7 @@ Symbol scope ID mismatch for "b":
620614
after transform: SymbolId(7): ScopeId(3)
621615
rebuilt : SymbolId(8): ScopeId(5)
622616
Symbol reference IDs mismatch for "_a$b":
623-
after transform: SymbolId(15): [ReferenceId(9), ReferenceId(10), ReferenceId(11), ReferenceId(12), ReferenceId(13)]
617+
after transform: SymbolId(15): [ReferenceId(8), ReferenceId(9), ReferenceId(10), ReferenceId(11), ReferenceId(12)]
624618
rebuilt : SymbolId(9): [ReferenceId(5), ReferenceId(7), ReferenceId(8), ReferenceId(9)]
625619
Symbol scope ID mismatch for "a":
626620
after transform: SymbolId(9): ScopeId(4)
@@ -629,49 +623,38 @@ Symbol scope ID mismatch for "b":
629623
after transform: SymbolId(10): ScopeId(4)
630624
rebuilt : SymbolId(12): ScopeId(7)
631625
Symbol reference IDs mismatch for "_a$b2":
632-
after transform: SymbolId(16): [ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18)]
626+
after transform: SymbolId(16): [ReferenceId(13), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17)]
633627
rebuilt : SymbolId(13): [ReferenceId(10), ReferenceId(12), ReferenceId(13), ReferenceId(14)]
634628
Symbol scope ID mismatch for "a":
635629
after transform: SymbolId(12): ScopeId(5)
636630
rebuilt : SymbolId(15): ScopeId(9)
637-
Symbol reference IDs mismatch for "a":
638-
after transform: SymbolId(12): [ReferenceId(4), ReferenceId(19), ReferenceId(20)]
639-
rebuilt : SymbolId(15): [ReferenceId(15), ReferenceId(17)]
640631
Symbol scope ID mismatch for "b":
641632
after transform: SymbolId(13): ScopeId(5)
642633
rebuilt : SymbolId(16): ScopeId(9)
643634
Symbol reference IDs mismatch for "_a$b3":
644-
after transform: SymbolId(17): [ReferenceId(21), ReferenceId(22), ReferenceId(23)]
635+
after transform: SymbolId(17): [ReferenceId(19), ReferenceId(20), ReferenceId(21)]
645636
rebuilt : SymbolId(17): [ReferenceId(16), ReferenceId(18)]
646637

647638
* assumption-noDocumentAll/memoize/input.js
648-
Symbol reference IDs mismatch for "foo":
649-
after transform: SymbolId(1): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(3), ReferenceId(4), ReferenceId(5), ReferenceId(7), ReferenceId(8), ReferenceId(10), ReferenceId(11), 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(32), ReferenceId(33), ReferenceId(34), ReferenceId(35), ReferenceId(48), ReferenceId(49), ReferenceId(50), ReferenceId(54), ReferenceId(57), ReferenceId(58), ReferenceId(68), ReferenceId(69)]
650-
rebuilt : SymbolId(1): [ReferenceId(0), ReferenceId(1), ReferenceId(2), ReferenceId(4), ReferenceId(6), ReferenceId(7), ReferenceId(8), ReferenceId(9), ReferenceId(10), ReferenceId(12), ReferenceId(16), ReferenceId(19), ReferenceId(23), ReferenceId(26), ReferenceId(30), ReferenceId(32), ReferenceId(33), ReferenceId(34), ReferenceId(36), ReferenceId(38), ReferenceId(39), ReferenceId(41), ReferenceId(43), ReferenceId(44), ReferenceId(46), ReferenceId(48), ReferenceId(50), ReferenceId(55), ReferenceId(56), ReferenceId(58), ReferenceId(63)]
651639
Symbol reference IDs mismatch for "_foo$bar":
652-
after transform: SymbolId(2): [ReferenceId(29), ReferenceId(30), ReferenceId(31)]
640+
after transform: SymbolId(2): [ReferenceId(27), ReferenceId(28), ReferenceId(29)]
653641
rebuilt : SymbolId(2): [ReferenceId(3), ReferenceId(5)]
654642
Symbol reference IDs mismatch for "_foo$bar5":
655-
after transform: SymbolId(9): [ReferenceId(51), ReferenceId(52), ReferenceId(53)]
643+
after transform: SymbolId(9): [ReferenceId(46), ReferenceId(47), ReferenceId(48)]
656644
rebuilt : SymbolId(9): [ReferenceId(35), ReferenceId(37)]
657645
Symbol reference IDs mismatch for "_foo$bar7":
658-
after transform: SymbolId(11): [ReferenceId(59), ReferenceId(60), ReferenceId(61)]
646+
after transform: SymbolId(11): [ReferenceId(53), ReferenceId(54), ReferenceId(55)]
659647
rebuilt : SymbolId(11): [ReferenceId(45), ReferenceId(47)]
660648
Symbol reference IDs mismatch for "_foo$bar8$baz":
661-
after transform: SymbolId(13): [ReferenceId(64), ReferenceId(65), ReferenceId(66)]
649+
after transform: SymbolId(13): [ReferenceId(58), ReferenceId(59), ReferenceId(60)]
662650
rebuilt : SymbolId(13): [ReferenceId(51), ReferenceId(53)]
663651
Symbol reference IDs mismatch for "_foo$bar9":
664-
after transform: SymbolId(14): [ReferenceId(70), ReferenceId(71), ReferenceId(72), ReferenceId(76)]
652+
after transform: SymbolId(14): [ReferenceId(63), ReferenceId(64), ReferenceId(65), ReferenceId(69)]
665653
rebuilt : SymbolId(14): [ReferenceId(57), ReferenceId(60), ReferenceId(62)]
666654
Symbol reference IDs mismatch for "_foo$bar9$baz":
667-
after transform: SymbolId(15): [ReferenceId(73), ReferenceId(74), ReferenceId(75)]
655+
after transform: SymbolId(15): [ReferenceId(66), ReferenceId(67), ReferenceId(68)]
668656
rebuilt : SymbolId(15): [ReferenceId(59), ReferenceId(61)]
669657

670-
* assumption-noDocumentAll/optional-eval-call/input.js
671-
Unresolved reference IDs mismatch for "eval":
672-
after transform: [ReferenceId(0), ReferenceId(2), ReferenceId(4), ReferenceId(5), ReferenceId(6), ReferenceId(7), ReferenceId(10), ReferenceId(12), ReferenceId(13), ReferenceId(14), ReferenceId(15), ReferenceId(16), ReferenceId(17), ReferenceId(18), ReferenceId(19), ReferenceId(29)]
673-
rebuilt : [ReferenceId(0), ReferenceId(1), ReferenceId(3), ReferenceId(4), ReferenceId(6), ReferenceId(7), ReferenceId(8), ReferenceId(9), ReferenceId(11), ReferenceId(14), ReferenceId(22), ReferenceId(24)]
674-
675658
* general/cast-to-boolean/input.js
676659
Bindings mismatch:
677660
after transform: ScopeId(25): ["_o$a$b$c$non_existent", "_o$a$b$c$non_existent3", "_o$a$b10", "_o$a$b6", "_o$a$b7", "_o$a$b8", "_o$a$b9", "o"]

0 commit comments

Comments
 (0)