diff options
Diffstat (limited to 'tools/eslint/lib/rules/no-useless-computed-key.js')
-rw-r--r-- | tools/eslint/lib/rules/no-useless-computed-key.js | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/tools/eslint/lib/rules/no-useless-computed-key.js b/tools/eslint/lib/rules/no-useless-computed-key.js index c1ab1d9acd..fd5ec2c92b 100644 --- a/tools/eslint/lib/rules/no-useless-computed-key.js +++ b/tools/eslint/lib/rules/no-useless-computed-key.js @@ -5,6 +5,13 @@ "use strict"; //------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const astUtils = require("../ast-utils"); +const esUtils = require("esutils"); + +//------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ @@ -34,15 +41,14 @@ module.exports = { const key = node.key, nodeType = typeof key.value; - if (key.type === "Literal" && (nodeType === "string" || nodeType === "number")) { + if (key.type === "Literal" && (nodeType === "string" || nodeType === "number") && key.value !== "__proto__") { context.report({ node, message: MESSAGE_UNNECESSARY_COMPUTED, data: { property: sourceCode.getText(key) }, fix(fixer) { - const leftSquareBracket = sourceCode.getFirstToken(node, node.value.generator || node.value.async ? 1 : 0); - const rightSquareBracket = sourceCode.getTokensBetween(node.key, node.value).find(token => token.value === "]"); - + const leftSquareBracket = sourceCode.getFirstToken(node, astUtils.isOpeningBracketToken); + const rightSquareBracket = sourceCode.getFirstTokenBetween(node.key, node.value, astUtils.isClosingBracketToken); const tokensBetween = sourceCode.getTokensBetween(leftSquareBracket, rightSquareBracket, 1); if (tokensBetween.slice(0, -1).some((token, index) => sourceCode.getText().slice(token.range[1], tokensBetween[index + 1].range[0]).trim())) { @@ -50,7 +56,17 @@ module.exports = { // If there are comments between the brackets and the property name, don't do a fix. return null; } - return fixer.replaceTextRange([leftSquareBracket.range[0], rightSquareBracket.range[1]], key.raw); + + const tokenBeforeLeftBracket = sourceCode.getTokenBefore(leftSquareBracket); + + // Insert a space before the key to avoid changing identifiers, e.g. ({ get[2]() {} }) to ({ get2() {} }) + const needsSpaceBeforeKey = tokenBeforeLeftBracket.range[1] === leftSquareBracket.range[0] && + esUtils.code.isIdentifierPartES6(tokenBeforeLeftBracket.value.slice(-1).charCodeAt(0)) && + esUtils.code.isIdentifierPartES6(key.raw.charCodeAt(0)); + + const replacementKey = (needsSpaceBeforeKey ? " " : "") + key.raw; + + return fixer.replaceTextRange([leftSquareBracket.range[0], rightSquareBracket.range[1]], replacementKey); } }); } |