@@ -58,6 +58,7 @@ public final class ExpressionDecomposerTest {
58
58
public void setUp () {
59
59
allowMethodCallDecomposing = false ;
60
60
knownConstants .clear ();
61
+ times = 1 ;
61
62
shouldTestTypes = true ;
62
63
}
63
64
@@ -649,8 +650,7 @@ public void exposeExpressionOptionalGetElem() {
649
650
lines (
650
651
"var temp$jscomp$1 = x;" ,
651
652
"if (temp$jscomp$1 != null) {" ,
652
- " var temp_const$jscomp$2 = temp$jscomp$1;" ,
653
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()];" ,
653
+ " var temp$jscomp$0 = temp$jscomp$1[foo()];" ,
654
654
"}" ,
655
655
"a = temp$jscomp$0" ));
656
656
}
@@ -663,8 +663,7 @@ public void exposeExpressionOptionalCallChain() {
663
663
lines (
664
664
"var temp$jscomp$1 = x;" ,
665
665
"if (temp$jscomp$1 != null) {" ,
666
- " var temp_const$jscomp$2 = temp$jscomp$1(a).y.z;" ,
667
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()];" ,
666
+ " var temp$jscomp$0 = temp$jscomp$1(a).y.z[foo()];" ,
668
667
"}" ,
669
668
"a = temp$jscomp$0" ));
670
669
}
@@ -677,8 +676,7 @@ public void exposeExpressionOptionalCallChainNoResult() {
677
676
lines (
678
677
"var temp$jscomp$0 = x;" ,
679
678
"if (temp$jscomp$0 != null) {" ,
680
- " var temp_const$jscomp$1 = temp$jscomp$0(a)[y].z;" ,
681
- " temp_const$jscomp$1[foo()];" ,
679
+ " temp$jscomp$0(a)[y].z[foo()];" ,
682
680
"}" ));
683
681
}
684
682
@@ -690,8 +688,7 @@ public void exposeExpressionOptionalGetPropChain() {
690
688
lines (
691
689
"var temp$jscomp$1 = x;" ,
692
690
"if (temp$jscomp$1 != null) {" ,
693
- " var temp_const$jscomp$2 = temp$jscomp$1.y.z;" ,
694
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()];" ,
691
+ " var temp$jscomp$0 = temp$jscomp$1.y.z[foo()];" ,
695
692
"}" ,
696
693
"a = temp$jscomp$0" ));
697
694
}
@@ -704,21 +701,19 @@ public void exposeExpressionOptionalGetPropChainNoResult() {
704
701
lines (
705
702
"var temp$jscomp$0 = x;" ,
706
703
"if (temp$jscomp$0 != null) {" ,
707
- " var temp_const$jscomp$1 = temp$jscomp$0.y.z;" ,
708
- " temp_const$jscomp$1[foo()];" ,
704
+ " temp$jscomp$0.y.z[foo()];" ,
709
705
"}" ));
710
706
}
711
707
712
708
@ Test
713
709
public void exposeExpressionOptionalGetElemChain () {
714
710
helperExposeExpression (
715
- "a = x?.[y].z[foo()]; " ,
711
+ "a = x?.[y].z[foo()]" ,
716
712
"foo" ,
717
713
lines (
718
714
"var temp$jscomp$1 = x;" ,
719
715
"if (temp$jscomp$1 != null) {" ,
720
- " var temp_const$jscomp$2 = temp$jscomp$1[y].z;" ,
721
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()];" ,
716
+ " var temp$jscomp$0 = temp$jscomp$1[y].z[foo()];" ,
722
717
"}" ,
723
718
"a = temp$jscomp$0" ));
724
719
}
@@ -731,8 +726,7 @@ public void exposeExpressionOptionalGetElemChainNoResult() {
731
726
lines (
732
727
"var temp$jscomp$0 = x;" ,
733
728
"if (temp$jscomp$0 != null) {" ,
734
- " var temp_const$jscomp$1 = temp$jscomp$0[y].z;" ,
735
- " temp_const$jscomp$1[foo()];" ,
729
+ " temp$jscomp$0[y].z[foo()];" ,
736
730
"}" ));
737
731
}
738
732
@@ -745,9 +739,7 @@ public void exposeExpressionOptionalGetElemWithCall() {
745
739
lines (
746
740
"var temp$jscomp$1 = x.y;" ,
747
741
"if (temp$jscomp$1 != null) {" ,
748
- " var temp_const$jscomp$3 = temp$jscomp$1;" ,
749
- " var temp_const$jscomp$2 = temp_const$jscomp$3[z];" ,
750
- " var temp$jscomp$0 = temp_const$jscomp$2.call(temp_const$jscomp$3, foo());" ,
742
+ " var temp$jscomp$0 = temp$jscomp$1[z](foo())" ,
751
743
"}" ,
752
744
"a = temp$jscomp$0" ));
753
745
}
@@ -762,9 +754,7 @@ public void exposeExpressionOptionalGetElemWithCallTwiceRewriteCall() {
762
754
lines (
763
755
"var temp$jscomp$1 = x.y;" ,
764
756
"if (temp$jscomp$1 != null) {" ,
765
- " var temp_const$jscomp$3 = temp$jscomp$1;" ,
766
- " var temp_const$jscomp$2 = temp_const$jscomp$3[z];" ,
767
- " var temp$jscomp$0 = temp_const$jscomp$2.call(temp_const$jscomp$3, foo());" ,
757
+ " var temp$jscomp$0 = temp$jscomp$1[z](foo())" ,
768
758
"}" ,
769
759
"a = temp$jscomp$0" );
770
760
String secondTimeExpose =
@@ -779,6 +769,7 @@ public void exposeExpressionOptionalGetElemWithCallTwiceRewriteCall() {
779
769
780
770
helperExposeExpression (originalSource , "foo" , firstTimeExpose );
781
771
772
+ times = 2 ;
782
773
helperExposeExpression (originalSource , "foo" , secondTimeExpose );
783
774
}
784
775
@@ -792,11 +783,7 @@ public void exposeExpressionGetElemWithOptionalCall() {
792
783
"var temp$jscomp$2 = x.y;" ,
793
784
"var temp$jscomp$1 = temp$jscomp$2[z];" ,
794
785
"if(temp$jscomp$1 != null) {" ,
795
- " var temp_const$jscomp$5 = temp$jscomp$1;" ,
796
- " var temp_const$jscomp$4 = temp_const$jscomp$5.call;" ,
797
- " var temp_const$jscomp$3 = temp$jscomp$2;" ,
798
- " var temp$jscomp$0 = " ,
799
- " temp_const$jscomp$4.call(temp_const$jscomp$5, temp_const$jscomp$3, foo(), d);" ,
786
+ " var temp$jscomp$0 = temp$jscomp$1.call(temp$jscomp$2, foo(), d);" ,
800
787
"}" ,
801
788
"a = temp$jscomp$0" ));
802
789
}
@@ -810,9 +797,7 @@ public void exposeExpressionOptionalGetPropWithCall() {
810
797
lines (
811
798
"var temp$jscomp$1 = x.y;" ,
812
799
"if (temp$jscomp$1 != null) {" ,
813
- " var temp_const$jscomp$3 = temp$jscomp$1;" ,
814
- " var temp_const$jscomp$2 = temp_const$jscomp$3.z;" ,
815
- " var temp$jscomp$0 = temp_const$jscomp$2.call(temp_const$jscomp$3, foo(1));" ,
800
+ " var temp$jscomp$0 = temp$jscomp$1.z(foo(1));" ,
816
801
"}" ,
817
802
"a = temp$jscomp$0" ));
818
803
}
@@ -821,17 +806,29 @@ public void exposeExpressionOptionalGetPropWithCall() {
821
806
public void exposeExpressionOptionalGetPropWithCallTwiceRewriteCall () {
822
807
allowMethodCallDecomposing = true ;
823
808
824
- helperExposeExpression (
825
- "a = x.y?.z(foo(1))" ,
826
- "foo" ,
809
+ // 2 calls to exposeExpression() are needed to get full exposure
810
+ String originalSource = "a = x.y?.z(foo(1))" ;
811
+ String firstTimeExpose =
812
+ lines (
813
+ "var temp$jscomp$1 = x.y;" ,
814
+ "if (temp$jscomp$1 != null) {" ,
815
+ " var temp$jscomp$0 = temp$jscomp$1.z(foo(1));" ,
816
+ "}" ,
817
+ "a = temp$jscomp$0" );
818
+ String secondTimeExpose =
827
819
lines (
828
820
"var temp$jscomp$1 = x.y;" ,
829
821
"if (temp$jscomp$1 != null) {" ,
830
822
" var temp_const$jscomp$3 = temp$jscomp$1;" ,
831
823
" var temp_const$jscomp$2 = temp_const$jscomp$3.z;" ,
832
824
" var temp$jscomp$0 = temp_const$jscomp$2.call(temp_const$jscomp$3, foo(1));" ,
833
825
"}" ,
834
- "a = temp$jscomp$0" ));
826
+ "a = temp$jscomp$0" );
827
+
828
+ helperExposeExpression (originalSource , "foo" , firstTimeExpose );
829
+
830
+ times = 2 ;
831
+ helperExposeExpression (originalSource , "foo" , secondTimeExpose );
835
832
}
836
833
837
834
@ Test
@@ -844,11 +841,7 @@ public void exposeExpressionGetPropWithOptionalCall() {
844
841
"var temp$jscomp$2 = x.y;" ,
845
842
"var temp$jscomp$1 = temp$jscomp$2.z;" ,
846
843
"if (temp$jscomp$1 != null) {" ,
847
- " var temp_const$jscomp$5 = temp$jscomp$1;" ,
848
- " var temp_const$jscomp$4 = temp_const$jscomp$5.call;" ,
849
- " var temp_const$jscomp$3 = temp$jscomp$2;" ,
850
- " var temp$jscomp$0 =" ,
851
- " temp_const$jscomp$4.call(temp_const$jscomp$5, temp_const$jscomp$3, foo());" ,
844
+ " var temp$jscomp$0 = temp$jscomp$1.call(temp$jscomp$2, foo())" ,
852
845
"}" ,
853
846
"a = temp$jscomp$0" ));
854
847
}
@@ -862,9 +855,7 @@ public void exposeExpressionNewOptChainAfterRewriteCall() {
862
855
lines (
863
856
"var temp$jscomp$1 = x;" ,
864
857
"if (temp$jscomp$1 != null) {" ,
865
- " var temp_const$jscomp$3 = temp$jscomp$1;" ,
866
- " var temp_const$jscomp$2 = temp_const$jscomp$3.y;" ,
867
- " var temp$jscomp$0 = temp_const$jscomp$2.call(temp_const$jscomp$3, foo());" ,
858
+ " var temp$jscomp$0 = temp$jscomp$1.y(foo())" ,
868
859
"}" ,
869
860
"a = temp$jscomp$0?.z.q" ));
870
861
}
@@ -878,8 +869,7 @@ public void exposeExpressionNewOptChainAfter() {
878
869
lines (
879
870
"var temp$jscomp$1 = x;" ,
880
871
"if (temp$jscomp$1 != null) {" ,
881
- " var temp_const$jscomp$2 = temp$jscomp$1.y;" ,
882
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()];" ,
872
+ " var temp$jscomp$0 = temp$jscomp$1.y[foo()]" ,
883
873
"}" ,
884
874
"a = temp$jscomp$0?.z.q" ));
885
875
}
@@ -893,8 +883,7 @@ public void exposeExpressionNotImmediatelyFollowedByNewChain() {
893
883
lines (
894
884
"var temp$jscomp$1 = x;" ,
895
885
"if (temp$jscomp$1 != null) {" ,
896
- " var temp_const$jscomp$2 = temp$jscomp$1.y;" ,
897
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()].z.q;" ,
886
+ " var temp$jscomp$0 = temp$jscomp$1.y[foo()].z.q" ,
898
887
"}" ,
899
888
"a = temp$jscomp$0?.b.c" ));
900
889
}
@@ -908,8 +897,7 @@ public void exposeExpressionBreakingOutOfOptionalChain() {
908
897
lines (
909
898
"var temp$jscomp$1 = x;" ,
910
899
"if (temp$jscomp$1 != null) {" ,
911
- " var temp_const$jscomp$2 = temp$jscomp$1.y;" ,
912
- " var temp$jscomp$0 = temp_const$jscomp$2[foo()];" ,
900
+ " var temp$jscomp$0 = temp$jscomp$1.y[foo()]" ,
913
901
"}" ,
914
902
"a = temp$jscomp$0.z.q" ));
915
903
}
@@ -923,9 +911,7 @@ public void exposeExpressionAfterTwoOptionalChains() {
923
911
lines (
924
912
"var temp$jscomp$1 = x?.y.z;" ,
925
913
"if (temp$jscomp$1 != null) {" ,
926
- " var temp_const$jscomp$3 = temp$jscomp$1;" ,
927
- " var temp_const$jscomp$2 = temp_const$jscomp$3.q;" ,
928
- " var temp$jscomp$0 = temp_const$jscomp$2.call(temp_const$jscomp$3, foo());" ,
914
+ " var temp$jscomp$0 = temp$jscomp$1.q(foo());" ,
929
915
"}" ,
930
916
"a = temp$jscomp$0" ));
931
917
}
@@ -1241,6 +1227,11 @@ public void testExposeYieldExpression3() {
1241
1227
" return temp_const$jscomp$0.call(temp_const$jscomp$1, yield 1);" ,
1242
1228
"}" );
1243
1229
helperExposeExpression (before , "yield" , after );
1230
+
1231
+ // Check that we don't decompose again, which would result in an infinite loop when inlining
1232
+ // functions.
1233
+ times = 2 ;
1234
+ helperExposeExpression (before , "yield" , after );
1244
1235
}
1245
1236
1246
1237
@ Test
@@ -1541,6 +1532,7 @@ public void testMoveSuperCall_noSideEffects() {
1541
1532
1542
1533
@ Test
1543
1534
public void testExposeSuperCall () {
1535
+ times = 2 ;
1544
1536
helperExposeExpression (
1545
1537
"class A { constructor() { super(goo(), foo()) } }" ,
1546
1538
"foo" ,
@@ -1553,6 +1545,7 @@ public void testExposeSuperCall() {
1553
1545
1554
1546
@ Test
1555
1547
public void testExposeSuperCall_noSideEffects () {
1548
+ times = 2 ;
1556
1549
// String() is being used since it's known to not have side-effects.
1557
1550
helperExposeExpression (
1558
1551
"class A { constructor() { super(goo(), String()) } }" ,
@@ -1633,7 +1626,9 @@ private Node helperExposeExpressionThenTypeCheck(String code, Function<Node, Nod
1633
1626
Node expr = nodeFinder .apply (tree );
1634
1627
1635
1628
compiler .resetUniqueNameId ();
1636
- decomposer .maybeExposeExpression (expr );
1629
+ for (int i = 0 ; i < times ; i ++) {
1630
+ decomposer .exposeExpression (expr );
1631
+ }
1637
1632
processForTypecheck (compiler , tree );
1638
1633
1639
1634
return tree ;
@@ -1670,7 +1665,9 @@ private void helperExposeExpression(
1670
1665
assertThat (result ).isEqualTo (DecompositionType .DECOMPOSABLE );
1671
1666
1672
1667
compiler .resetUniqueNameId ();
1673
- decomposer .maybeExposeExpression (expr );
1668
+ for (int i = 0 ; i < times ; i ++) {
1669
+ decomposer .exposeExpression (expr );
1670
+ }
1674
1671
validateSourceInfo (compiler , tree );
1675
1672
assertNode (tree ).usingSerializer (compiler ::toSource ).isEqualTo (expectedRoot );
1676
1673
@@ -1716,7 +1713,9 @@ private void helperMoveExpression(
1716
1713
assertWithMessage ("Expected node was not found." ).that (expr ).isNotNull ();
1717
1714
1718
1715
compiler .resetUniqueNameId ();
1719
- decomposer .moveExpression (expr );
1716
+ for (int i = 0 ; i < times ; i ++) {
1717
+ decomposer .moveExpression (expr );
1718
+ }
1720
1719
validateSourceInfo (compiler , tree );
1721
1720
assertNode (tree ).usingSerializer (compiler ::toSource ).isEqualTo (expectedRoot );
1722
1721
@@ -1725,7 +1724,9 @@ private void helperMoveExpression(
1725
1724
Node originalExpr = nodeFinder .apply (originalTree );
1726
1725
1727
1726
compiler .resetUniqueNameId ();
1728
- decomposer .moveExpression (originalExpr );
1727
+ for (int i = 0 ; i < times ; i ++) {
1728
+ decomposer .moveExpression (originalExpr );
1729
+ }
1729
1730
processForTypecheck (compiler , originalTree );
1730
1731
1731
1732
// TODO(bradfordcsmith): Don't assume type check + decompose gives the same results as
0 commit comments