summaryrefslogtreecommitdiff
path: root/tools/eslint/lib/rules/no-useless-computed-key.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/eslint/lib/rules/no-useless-computed-key.js')
-rw-r--r--tools/eslint/lib/rules/no-useless-computed-key.js26
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);
}
});
}