@@ -65,8 +65,12 @@ public void testFoldOneChildBlocks() {
65
65
late = false ;
66
66
fold ("function f(){if(x)a();x=3}" ,
67
67
"function f(){x&&a();x=3}" );
68
+ fold ("function f(){if(x)a?.();x=3}" , "function f(){x&&a?.();x=3}" );
69
+
68
70
fold ("function f(){if(x){a()}x=3}" ,
69
71
"function f(){x&&a();x=3}" );
72
+ fold ("function f(){if(x){a?.()}x=3}" , "function f(){x&&a?.();x=3}" );
73
+
70
74
fold ("function f(){if(x){return 3}}" ,
71
75
"function f(){if(x)return 3}" );
72
76
fold ("function f(){if(x){a()}}" ,
@@ -84,6 +88,7 @@ public void testFoldOneChildBlocks() {
84
88
fold ("function f(){if(x){a.b+=1}}" , "function f(){x&&(a.b+=1)}" );
85
89
fold ("function f(){if(x){++a.b}}" , "function f(){x&&++a.b}" );
86
90
fold ("function f(){if(x){a.foo()}}" , "function f(){x&&a.foo()}" );
91
+ fold ("function f(){if(x){a?.foo()}}" , "function f(){x&&a?.foo()}" );
87
92
88
93
// Try it out with throw/catch/finally [which should not change]
89
94
foldSame ("function f(){try{foo()}catch(e){bar(e)}finally{baz()}}" );
@@ -178,6 +183,7 @@ public void testCombineIfs2() {
178
183
// Can't combine, side-effect
179
184
fold ("function f(){ if (x) g(); if (y) g() }" ,
180
185
"function f(){ x&&g(); y&&g() }" );
186
+ fold ("function f(){ if (x) g?.(); if (y) g?.() }" , "function f(){ x&&g?.(); y&&g?.() }" );
181
187
// Can't combine, side-effect
182
188
fold ("function f(){ if (x) y = 0; if (y) y = 0; }" ,
183
189
"function f(){ x&&(y = 0); y&&(y = 0); }" );
@@ -269,6 +275,7 @@ public void testAndParenthesesCount() {
269
275
fold ("function f(){if(x||y)a.foo()}" , "function f(){(x||y)&&a.foo()}" );
270
276
fold ("function f(){if(x.a)x.a=0}" ,
271
277
"function f(){x.a&&(x.a=0)}" );
278
+ fold ("function f(){if(x?.a)x.a=0}" , "function f(){x?.a&&(x.a=0)}" );
272
279
foldSame ("function f(){if(x()||y()){x()||y()}}" );
273
280
}
274
281
@@ -400,8 +407,12 @@ public void testMinimizeHook() {
400
407
fold ("x ? x : y" , "x || y" );
401
408
// We assume GETPROPs don't have side effects.
402
409
fold ("x.y ? x.y : x.z" , "x.y || x.z" );
410
+ fold ("x?.y ? x?.y : x.z" , "x?.y || x.z" );
411
+ fold ("x?.y ? x?.y : x?.z" , "x?.y || x?.z" );
412
+
403
413
// This can be folded if x() does not have side effects.
404
414
foldSame ("x() ? x() : y()" );
415
+ foldSame ("x?.() ? x?.() : y()" );
405
416
406
417
fold ("!x ? foo() : bar()" ,
407
418
"x ? bar() : foo()" );
@@ -752,13 +763,21 @@ public void testNestedIfCombine() {
752
763
fold ("if(x)if(y){if(z){while(1){}}}" , "if(x&&(y&&z)){while(1){}}" );
753
764
}
754
765
766
+ // See: http://blickly.github.io/closure-compiler-issues/#291
755
767
@ Test
756
768
public void testIssue291 () {
757
769
fold ("if (true) { f.onchange(); }" , "if (1) f.onchange();" );
758
770
foldSame ("if (f) { f.onchange(); }" );
759
771
foldSame ("if (f) { f.bar(); } else { f.onchange(); }" );
760
772
fold ("if (f) { f.bonchange(); }" , "f && f.bonchange();" );
761
773
foldSame ("if (f) { f['x'](); }" );
774
+
775
+ // optional versions
776
+ fold ("if (true) { f?.onchange(); }" , "if (1) f?.onchange();" );
777
+ foldSame ("if (f) { f?.onchange(); }" );
778
+ foldSame ("if (f) { f?.bar(); } else { f?.onchange(); }" );
779
+ fold ("if (f) { f?.bonchange(); }" , "f && f?.bonchange();" );
780
+ foldSame ("if (f) { f?.['x'](); }" );
762
781
}
763
782
764
783
@ Test
@@ -835,6 +854,15 @@ public void testIssue925() {
835
854
"}" ,
836
855
"a = (x[--y]) ? 0 : 1;" );
837
856
857
+ test (
858
+ lines (
859
+ "if (x?.[--y]) {" , //
860
+ " a = 0;" ,
861
+ "} else {" ,
862
+ " a = 1;" ,
863
+ "}" ),
864
+ "a = (x?.[--y]) ? 0 : 1;" );
865
+
838
866
test ("if (x++) { x += 2 } else { x += 3 }" ,
839
867
"x++ ? x += 2 : x += 3" );
840
868
0 commit comments