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