summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js')
-rw-r--r--tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js160
1 files changed, 81 insertions, 79 deletions
diff --git a/tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js b/tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js
index 49dff0d0ce..623144dc06 100644
--- a/tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js
+++ b/tools/node_modules/eslint/lib/rules/no-unmodified-loop-condition.js
@@ -107,84 +107,6 @@ const isInLoop = {
};
/**
- * Checks whether or not a given group node has any dynamic elements.
- *
- * @param {ASTNode} root - A node to check.
- * This node is one of BinaryExpression or ConditionalExpression.
- * @returns {boolean} `true` if the node is dynamic.
- */
-function hasDynamicExpressions(root) {
- let retv = false;
- const traverser = new Traverser();
-
- traverser.traverse(root, {
- enter(node) {
- if (DYNAMIC_PATTERN.test(node.type)) {
- retv = true;
- this.break();
- } else if (SKIP_PATTERN.test(node.type)) {
- this.skip();
- }
- }
- });
-
- return retv;
-}
-
-/**
- * Creates the loop condition information from a given reference.
- *
- * @param {eslint-scope.Reference} reference - A reference to create.
- * @returns {LoopConditionInfo|null} Created loop condition info, or null.
- */
-function toLoopCondition(reference) {
- if (reference.init) {
- return null;
- }
-
- let group = null;
- let child = reference.identifier;
- let node = child.parent;
-
- while (node) {
- if (SENTINEL_PATTERN.test(node.type)) {
- if (LOOP_PATTERN.test(node.type) && node.test === child) {
-
- // This reference is inside of a loop condition.
- return {
- reference,
- group,
- isInLoop: isInLoop[node.type].bind(null, node),
- modified: false
- };
- }
-
- // This reference is outside of a loop condition.
- break;
- }
-
- /*
- * If it's inside of a group, OK if either operand is modified.
- * So stores the group this reference belongs to.
- */
- if (GROUP_PATTERN.test(node.type)) {
-
- // If this expression is dynamic, no need to check.
- if (hasDynamicExpressions(node)) {
- break;
- } else {
- group = node;
- }
- }
-
- child = node;
- node = node.parent;
- }
-
- return null;
-}
-
-/**
* Gets the function which encloses a given reference.
* This supports only FunctionDeclaration.
*
@@ -247,13 +169,15 @@ module.exports = {
docs: {
description: "disallow unmodified loop conditions",
category: "Best Practices",
- recommended: false
+ recommended: false,
+ url: "https://eslint.org/docs/rules/no-unmodified-loop-condition"
},
schema: []
},
create(context) {
+ const sourceCode = context.getSourceCode();
let groupMap = null;
/**
@@ -308,6 +232,84 @@ module.exports = {
}
/**
+ * Checks whether or not a given group node has any dynamic elements.
+ *
+ * @param {ASTNode} root - A node to check.
+ * This node is one of BinaryExpression or ConditionalExpression.
+ * @returns {boolean} `true` if the node is dynamic.
+ */
+ function hasDynamicExpressions(root) {
+ let retv = false;
+
+ Traverser.traverse(root, {
+ visitorKeys: sourceCode.visitorKeys,
+ enter(node) {
+ if (DYNAMIC_PATTERN.test(node.type)) {
+ retv = true;
+ this.break();
+ } else if (SKIP_PATTERN.test(node.type)) {
+ this.skip();
+ }
+ }
+ });
+
+ return retv;
+ }
+
+ /**
+ * Creates the loop condition information from a given reference.
+ *
+ * @param {eslint-scope.Reference} reference - A reference to create.
+ * @returns {LoopConditionInfo|null} Created loop condition info, or null.
+ */
+ function toLoopCondition(reference) {
+ if (reference.init) {
+ return null;
+ }
+
+ let group = null;
+ let child = reference.identifier;
+ let node = child.parent;
+
+ while (node) {
+ if (SENTINEL_PATTERN.test(node.type)) {
+ if (LOOP_PATTERN.test(node.type) && node.test === child) {
+
+ // This reference is inside of a loop condition.
+ return {
+ reference,
+ group,
+ isInLoop: isInLoop[node.type].bind(null, node),
+ modified: false
+ };
+ }
+
+ // This reference is outside of a loop condition.
+ break;
+ }
+
+ /*
+ * If it's inside of a group, OK if either operand is modified.
+ * So stores the group this reference belongs to.
+ */
+ if (GROUP_PATTERN.test(node.type)) {
+
+ // If this expression is dynamic, no need to check.
+ if (hasDynamicExpressions(node)) {
+ break;
+ } else {
+ group = node;
+ }
+ }
+
+ child = node;
+ node = node.parent;
+ }
+
+ return null;
+ }
+
+ /**
* Finds unmodified references which are inside of a loop condition.
* Then reports the references which are outside of groups.
*