Skip to content

Commit

Permalink
Fix: no-implicit-coercion string concat false positive (fixes #7057)
Browse files Browse the repository at this point in the history
  • Loading branch information
kaicataldo committed Sep 5, 2016
1 parent 3960617 commit dcaefe2
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
18 changes: 15 additions & 3 deletions lib/rules/no-implicit-coercion.js
Expand Up @@ -5,6 +5,8 @@

"use strict";

const astUtils = require("../ast-utils");

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------
Expand Down Expand Up @@ -105,15 +107,25 @@ function getNonNumericOperand(node) {
return null;
}

/**
* Checks whether a node is an empty string literal or not.
* @param {ASTNode} node The node to check.
* @returns {boolean} Whether or not the passed in node is an
* empty string literal or not.
*/
function isEmptyString(node) {
return astUtils.isStringLiteral(node) && node.value === "";
}

/**
* Checks whether or not a node is a concatenating with an empty string.
* @param {ASTNode} node - A BinaryExpression node to check.
* @returns {boolean} Whether or not the node is a concatenating with an empty string.
*/
function isConcatWithEmptyString(node) {
return node.operator === "+" && (
(node.left.type === "Literal" && node.left.value === "") ||
(node.right.type === "Literal" && node.right.value === "")
(isEmptyString(node.left) && !astUtils.isStringLiteral(node.right)) ||
(isEmptyString(node.right) && !astUtils.isStringLiteral(node.left))
);
}

Expand All @@ -123,7 +135,7 @@ function isConcatWithEmptyString(node) {
* @returns {boolean} Whether or not the node is appended with an empty string.
*/
function isAppendEmptyString(node) {
return node.operator === "+=" && node.right.type === "Literal" && node.right.value === "";
return node.operator === "+=" && isEmptyString(node.right);
}

/**
Expand Down
8 changes: 8 additions & 0 deletions tests/lib/rules/no-implicit-coercion.js
Expand Up @@ -64,6 +64,14 @@ ruleTester.run("no-implicit-coercion", rule, {
{code: "0 + foo"},
{code: "~foo.bar()"},

// https://github.com/eslint/eslint/issues/7057
{code: "'' + 'foo'"},
{code: "'' + `${foo}`", parserOptions: { ecmaVersion: 6 } },
{code: "'foo' + ''"},
{code: "`${foo}` + ''", parserOptions: { ecmaVersion: 6 } },
{code: "foo += 'bar'"},
{code: "+42"},

{code: "!!foo", options: [{boolean: false}]},
{code: "~foo.indexOf(1)", options: [{boolean: false}]},
{code: "+foo", options: [{number: false}]},
Expand Down

0 comments on commit dcaefe2

Please sign in to comment.