From 301d0c05229dbd6cfb1045d716524e8ec46fa2c1 Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Fri, 18 Dec 2020 19:07:34 +0100 Subject: [PATCH] Fix: no-constant-condition false positives with unary expressions (#13927) --- lib/rules/no-constant-condition.js | 12 +++++++++--- tests/lib/rules/no-constant-condition.js | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/rules/no-constant-condition.js b/lib/rules/no-constant-condition.js index 790d5ea8811..7d324634244 100644 --- a/lib/rules/no-constant-condition.js +++ b/lib/rules/no-constant-condition.js @@ -147,12 +147,18 @@ module.exports = { } case "UnaryExpression": - if (node.operator === "void") { + if ( + node.operator === "void" || + node.operator === "typeof" && inBooleanPosition + ) { return true; } - return (node.operator === "typeof" && inBooleanPosition) || - isConstant(node.argument, true); + if (node.operator === "!") { + return isConstant(node.argument, true); + } + + return isConstant(node.argument, false); case "BinaryExpression": return isConstant(node.left, false) && diff --git a/tests/lib/rules/no-constant-condition.js b/tests/lib/rules/no-constant-condition.js index b83b337a65f..565a8a53dd6 100644 --- a/tests/lib/rules/no-constant-condition.js +++ b/tests/lib/rules/no-constant-condition.js @@ -32,6 +32,10 @@ ruleTester.run("no-constant-condition", rule, { "if (`foo${a}` === 'fooa');", "if (tag`a`);", "if (tag`${a}`);", + "if (+(a || true));", + "if (-(a || true));", + "if (~(a || 1));", + "if (+(a && 0) === +(b && 0));", "while(~!a);", "while(a = b);", "while(`${a}`);", @@ -162,6 +166,15 @@ ruleTester.run("no-constant-condition", rule, { { code: "if(`foo${0 || 1}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] }, { code: "if(`foo${bar}`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] }, { code: "if(`${bar}foo`);", errors: [{ messageId: "unexpected", type: "TemplateLiteral" }] }, + { code: "if(!(true || a));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] }, + { code: "if(!(a && void b && c));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] }, + { code: "if(0 || !(a && null));", errors: [{ messageId: "unexpected", type: "LogicalExpression" }] }, + { code: "if(1 + !(a || true));", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] }, + { code: "if(!(null && a) > 1);", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] }, + { code: "if(+(!(a && 0)));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] }, + { code: "if(!typeof a === 'string');", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] }, + { code: "if(-('foo' || a));", errors: [{ messageId: "unexpected", type: "UnaryExpression" }] }, + { code: "if(+(void a && b) === ~(1 || c));", errors: [{ messageId: "unexpected", type: "BinaryExpression" }] }, { code: "while([]);", errors: [{ messageId: "unexpected", type: "ArrayExpression" }] },