summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/lib/rules/no-useless-computed-key.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/eslint/lib/rules/no-useless-computed-key.js')
-rw-r--r--tools/node_modules/eslint/lib/rules/no-useless-computed-key.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/tools/node_modules/eslint/lib/rules/no-useless-computed-key.js b/tools/node_modules/eslint/lib/rules/no-useless-computed-key.js
new file mode 100644
index 0000000000..f8114ab754
--- /dev/null
+++ b/tools/node_modules/eslint/lib/rules/no-useless-computed-key.js
@@ -0,0 +1,75 @@
+/**
+ * @fileoverview Rule to disallow unnecessary computed property keys in object literals
+ * @author Burak Yigit Kaya
+ */
+"use strict";
+
+//------------------------------------------------------------------------------
+// Requirements
+//------------------------------------------------------------------------------
+
+const astUtils = require("../ast-utils");
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+const MESSAGE_UNNECESSARY_COMPUTED = "Unnecessarily computed property [{{property}}] found.";
+
+module.exports = {
+ meta: {
+ docs: {
+ description: "disallow unnecessary computed property keys in object literals",
+ category: "ECMAScript 6",
+ recommended: false
+ },
+
+ schema: [],
+
+ fixable: "code"
+ },
+ create(context) {
+ const sourceCode = context.getSourceCode();
+
+ return {
+ Property(node) {
+ if (!node.computed) {
+ return;
+ }
+
+ const key = node.key,
+ nodeType = typeof key.value;
+
+ 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, 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())) {
+
+ // If there are comments between the brackets and the property name, don't do a fix.
+ return null;
+ }
+
+ 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] &&
+ !astUtils.canTokensBeAdjacent(tokenBeforeLeftBracket, sourceCode.getFirstToken(key));
+
+ const replacementKey = (needsSpaceBeforeKey ? " " : "") + key.raw;
+
+ return fixer.replaceTextRange([leftSquareBracket.range[0], rightSquareBracket.range[1]], replacementKey);
+ }
+ });
+ }
+ }
+ };
+ }
+};