Skip to content

Commit 7a4fb85

Browse files
authored
enhance comparisons (#5889)
1 parent da3d86a commit 7a4fb85

2 files changed

Lines changed: 114 additions & 139 deletions

File tree

lib/compress.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12079,17 +12079,16 @@ Compressor.prototype.compress = function(node) {
1207912079
case "&&":
1208012080
case "||":
1208112081
// void 0 !== x && null !== x ---> null != x
12082-
// void 0 === x || null === x ---> null == x
12082+
// void 0 === x.a || null === x.a ---> null == x.a
1208312083
var left = self.left;
1208412084
if (!(left instanceof AST_Binary)) break;
1208512085
if (left.operator != (self.operator == "&&" ? "!==" : "===")) break;
1208612086
if (!(self.right instanceof AST_Binary)) break;
1208712087
if (left.operator != self.right.operator) break;
1208812088
if (is_undefined(left.left, compressor) && self.right.left instanceof AST_Null
1208912089
|| left.left instanceof AST_Null && is_undefined(self.right.left, compressor)) {
12090-
var expr = left.right;
12091-
if (expr instanceof AST_Assign && expr.operator == "=") expr = expr.left;
12092-
if (expr.has_side_effects(compressor)) break;
12090+
var expr = extract_lhs(left.right, compressor);
12091+
if (!repeatable(compressor, expr)) break;
1209312092
if (!expr.equals(self.right.right)) break;
1209412093
left.operator = left.operator.slice(0, -1);
1209512094
left.left = make_node(AST_Null, self);

test/compress/comparisons.js

Lines changed: 111 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -167,48 +167,24 @@ issue_2857_1: {
167167
comparisons: true,
168168
}
169169
input: {
170-
function f1(a) {
171-
a === undefined || a === null;
172-
a === undefined || a !== null;
173-
a !== undefined || a === null;
174-
a !== undefined || a !== null;
175-
a === undefined && a === null;
176-
a === undefined && a !== null;
177-
a !== undefined && a === null;
178-
a !== undefined && a !== null;
179-
}
180-
function f2(a) {
181-
a === null || a === undefined;
182-
a === null || a !== undefined;
183-
a !== null || a === undefined;
184-
a !== null || a !== undefined;
185-
a === null && a === undefined;
186-
a === null && a !== undefined;
187-
a !== null && a === undefined;
188-
a !== null && a !== undefined;
189-
}
170+
a === undefined || a === null;
171+
a === undefined || a !== null;
172+
a !== undefined || a === null;
173+
a !== undefined || a !== null;
174+
a === undefined && a === null;
175+
a === undefined && a !== null;
176+
a !== undefined && a === null;
177+
a !== undefined && a !== null;
190178
}
191179
expect: {
192-
function f1(a) {
193-
null == a;
194-
void 0 === a || null !== a;
195-
void 0 !== a || null === a;
196-
void 0 !== a || null !== a;
197-
void 0 === a && null === a;
198-
void 0 === a && null !== a;
199-
void 0 !== a && null === a;
200-
null != a;
201-
}
202-
function f2(a) {
203-
null == a;
204-
null === a || void 0 !== a;
205-
null !== a || void 0 === a;
206-
null !== a || void 0 !== a;
207-
null === a && void 0 === a;
208-
null === a && void 0 !== a;
209-
null !== a && void 0 === a;
210-
null != a;
211-
}
180+
null == a;
181+
void 0 === a || null !== a;
182+
void 0 !== a || null === a;
183+
void 0 !== a || null !== a;
184+
void 0 === a && null === a;
185+
void 0 === a && null !== a;
186+
void 0 !== a && null === a;
187+
null != a;
212188
}
213189
}
214190

@@ -217,28 +193,24 @@ issue_2857_2: {
217193
comparisons: true,
218194
}
219195
input: {
220-
function f(a, p) {
221-
a === undefined || a === null || p;
222-
a === undefined || a !== null || p;
223-
a !== undefined || a === null || p;
224-
a !== undefined || a !== null || p;
225-
a === undefined && a === null || p;
226-
a === undefined && a !== null || p;
227-
a !== undefined && a === null || p;
228-
a !== undefined && a !== null || p;
229-
}
196+
a === null || a === undefined;
197+
a === null || a !== undefined;
198+
a !== null || a === undefined;
199+
a !== null || a !== undefined;
200+
a === null && a === undefined;
201+
a === null && a !== undefined;
202+
a !== null && a === undefined;
203+
a !== null && a !== undefined;
230204
}
231205
expect: {
232-
function f(a, p) {
233-
null == a || p;
234-
void 0 === a || null !== a || p;
235-
void 0 !== a || null === a || p;
236-
void 0 !== a || null !== a || p;
237-
void 0 === a && null === a || p;
238-
void 0 === a && null !== a || p;
239-
void 0 !== a && null === a || p;
240-
null != a || p;
241-
}
206+
null == a;
207+
null === a || void 0 !== a;
208+
null !== a || void 0 === a;
209+
null !== a || void 0 !== a;
210+
null === a && void 0 === a;
211+
null === a && void 0 !== a;
212+
null !== a && void 0 === a;
213+
null != a;
242214
}
243215
}
244216

@@ -247,59 +219,50 @@ issue_2857_3: {
247219
comparisons: true,
248220
}
249221
input: {
250-
function f(a, p) {
251-
a === undefined || a === null && p;
252-
a === undefined || a !== null && p;
253-
a !== undefined || a === null && p;
254-
a !== undefined || a !== null && p;
255-
a === undefined && a === null && p;
256-
a === undefined && a !== null && p;
257-
a !== undefined && a === null && p;
258-
a !== undefined && a !== null && p;
259-
}
222+
a === undefined || a === null || p;
223+
a === undefined || a !== null || p;
224+
a !== undefined || a === null || p;
225+
a !== undefined || a !== null || p;
226+
a === undefined && a === null || p;
227+
a === undefined && a !== null || p;
228+
a !== undefined && a === null || p;
229+
a !== undefined && a !== null || p;
260230
}
261231
expect: {
262-
function f(a, p) {
263-
void 0 === a || null === a && p;
264-
void 0 === a || null !== a && p;
265-
void 0 !== a || null === a && p;
266-
void 0 !== a || null !== a && p;
267-
void 0 === a && null === a && p;
268-
void 0 === a && null !== a && p;
269-
void 0 !== a && null === a && p;
270-
null != a && p;
271-
}
232+
null == a || p;
233+
void 0 === a || null !== a || p;
234+
void 0 !== a || null === a || p;
235+
void 0 !== a || null !== a || p;
236+
void 0 === a && null === a || p;
237+
void 0 === a && null !== a || p;
238+
void 0 !== a && null === a || p;
239+
null != a || p;
272240
}
273241
}
274242

275243
issue_2857_4: {
276244
options = {
277245
comparisons: true,
278-
conditionals: true,
279246
}
280247
input: {
281-
function f(a, p) {
282-
p || a === undefined || a === null;
283-
p || a === undefined || a !== null;
284-
p || a !== undefined || a === null;
285-
p || a !== undefined || a !== null;
286-
p || a === undefined && a === null;
287-
p || a === undefined && a !== null;
288-
p || a !== undefined && a === null;
289-
p || a !== undefined && a !== null;
290-
}
248+
a === undefined || a === null && p;
249+
a === undefined || a !== null && p;
250+
a !== undefined || a === null && p;
251+
a !== undefined || a !== null && p;
252+
a === undefined && a === null && p;
253+
a === undefined && a !== null && p;
254+
a !== undefined && a === null && p;
255+
a !== undefined && a !== null && p;
291256
}
292257
expect: {
293-
function f(a, p) {
294-
p || null == a;
295-
p || void 0 === a || null !== a;
296-
p || void 0 !== a || null === a;
297-
p || void 0 !== a || null !== a;
298-
p || void 0 === a && null === a;
299-
p || void 0 === a && null !== a;
300-
p || void 0 !== a && null === a;
301-
p || null != a;
302-
}
258+
void 0 === a || null === a && p;
259+
void 0 === a || null !== a && p;
260+
void 0 !== a || null === a && p;
261+
void 0 !== a || null !== a && p;
262+
void 0 === a && null === a && p;
263+
void 0 === a && null !== a && p;
264+
void 0 !== a && null === a && p;
265+
null != a && p;
303266
}
304267
}
305268

@@ -309,60 +272,73 @@ issue_2857_5: {
309272
conditionals: true,
310273
}
311274
input: {
312-
function f(a, p) {
313-
p && a === undefined || a === null;
314-
p && a === undefined || a !== null;
315-
p && a !== undefined || a === null;
316-
p && a !== undefined || a !== null;
317-
p && a === undefined && a === null;
318-
p && a === undefined && a !== null;
319-
p && a !== undefined && a === null;
320-
p && a !== undefined && a !== null;
321-
}
275+
p || a === undefined || a === null;
276+
p || a === undefined || a !== null;
277+
p || a !== undefined || a === null;
278+
p || a !== undefined || a !== null;
279+
p || a === undefined && a === null;
280+
p || a === undefined && a !== null;
281+
p || a !== undefined && a === null;
282+
p || a !== undefined && a !== null;
322283
}
323284
expect: {
324-
function f(a, p) {
325-
p && void 0 === a || null === a;
326-
p && void 0 === a || null !== a;
327-
p && void 0 !== a || null === a;
328-
p && void 0 !== a || null !== a;
329-
p && void 0 === a && null === a;
330-
p && void 0 === a && null !== a;
331-
p && void 0 !== a && null === a;
332-
p && null != a;
333-
}
285+
p || null == a;
286+
p || void 0 === a || null !== a;
287+
p || void 0 !== a || null === a;
288+
p || void 0 !== a || null !== a;
289+
p || void 0 === a && null === a;
290+
p || void 0 === a && null !== a;
291+
p || void 0 !== a && null === a;
292+
p || null != a;
334293
}
335294
}
336295

337296
issue_2857_6: {
297+
options = {
298+
comparisons: true,
299+
conditionals: true,
300+
}
301+
input: {
302+
p && a === undefined || a === null;
303+
p && a === undefined || a !== null;
304+
p && a !== undefined || a === null;
305+
p && a !== undefined || a !== null;
306+
p && a === undefined && a === null;
307+
p && a === undefined && a !== null;
308+
p && a !== undefined && a === null;
309+
p && a !== undefined && a !== null;
310+
}
311+
expect: {
312+
p && void 0 === a || null === a;
313+
p && void 0 === a || null !== a;
314+
p && void 0 !== a || null === a;
315+
p && void 0 !== a || null !== a;
316+
p && void 0 === a && null === a;
317+
p && void 0 === a && null !== a;
318+
p && void 0 !== a && null === a;
319+
p && null != a;
320+
}
321+
}
322+
323+
issue_2857_7: {
338324
options = {
339325
comparisons: true,
340326
pure_getters: "strict",
341327
reduce_vars: true,
342328
}
343329
input: {
344330
function f(a) {
345-
if (({}).b === undefined || {}.b === null)
331+
if ({}.b === undefined || {}.b === null)
346332
return a.b !== undefined && a.b !== null;
347333
}
348-
console.log(f({
349-
a: [ null ],
350-
get b() {
351-
return this.a.shift();
352-
}
353-
}));
334+
console.log(f({ b: [] }));
354335
}
355336
expect: {
356337
function f(a) {
357338
if (null == {}.b)
358-
return void 0 !== a.b && null !== a.b;
339+
return null != a.b;
359340
}
360-
console.log(f({
361-
a: [ null ],
362-
get b() {
363-
return this.a.shift();
364-
}
365-
}));
341+
console.log(f({ b: [] }));
366342
}
367343
expect_stdout: "true"
368344
}

0 commit comments

Comments
 (0)