Skip to content

⬅️ Back to Table of Contents

📄 prefer-for-of.ts

📊 Analysis Summary

Metric Count
🔧 Functions 8
📦 Imports 5
📊 Variables & Constants 5

📚 Table of Contents

🛠️ File Location:

📂 packages/eslint-plugin/src/rules/prefer-for-of.ts

📦 Imports

Name Source
TSESLint @typescript-eslint/utils
TSESTree @typescript-eslint/utils
AST_NODE_TYPES @typescript-eslint/utils
createRule ../util
isAssignee ../util

Variables & Constants

Name Type Kind Value Exported
expr any const node.right
id any const reference.identifier
node any const id.parent
declarator any const `node.init.declarations[0] as
TSESTree.VariableDeclarator
undefined`
indexName any const declarator.id.name

Functions

isSingleVariableDeclaration(node: TSESTree.Node | null): node is TSESTree.VariableDeclaration

Code
function isSingleVariableDeclaration(
      node: TSESTree.Node | null,
    ): node is TSESTree.VariableDeclaration {
      return (
        node?.type === AST_NODE_TYPES.VariableDeclaration &&
        node.kind !== 'const' &&
        node.declarations.length === 1
      );
    }
  • Parameters:
  • node: TSESTree.Node | null
  • Return Type: node is TSESTree.VariableDeclaration

isLiteral(node: TSESTree.Expression | TSESTree.PrivateIdentifier, value: number): boolean

Code
function isLiteral(
      node: TSESTree.Expression | TSESTree.PrivateIdentifier,
      value: number,
    ): boolean {
      return node.type === AST_NODE_TYPES.Literal && node.value === value;
    }
  • Parameters:
  • node: TSESTree.Expression | TSESTree.PrivateIdentifier
  • value: number
  • Return Type: boolean

isZeroInitialized(node: TSESTree.VariableDeclarator): boolean

Code
function isZeroInitialized(node: TSESTree.VariableDeclarator): boolean {
      return node.init != null && isLiteral(node.init, 0);
    }
  • Parameters:
  • node: TSESTree.VariableDeclarator
  • Return Type: boolean
  • Calls:
  • isLiteral

isMatchingIdentifier(node: TSESTree.Expression | TSESTree.PrivateIdentifier, name: string): boolean

Code
function isMatchingIdentifier(
      node: TSESTree.Expression | TSESTree.PrivateIdentifier,
      name: string,
    ): boolean {
      return node.type === AST_NODE_TYPES.Identifier && node.name === name;
    }
  • Parameters:
  • node: TSESTree.Expression | TSESTree.PrivateIdentifier
  • name: string
  • Return Type: boolean

isLessThanLengthExpression(node: TSESTree.Node | null, name: string): TSESTree.Expression | null

Code
function isLessThanLengthExpression(
      node: TSESTree.Node | null,
      name: string,
    ): TSESTree.Expression | null {
      if (
        node?.type === AST_NODE_TYPES.BinaryExpression &&
        node.operator === '<' &&
        isMatchingIdentifier(node.left, name) &&
        node.right.type === AST_NODE_TYPES.MemberExpression &&
        isMatchingIdentifier(node.right.property, 'length')
      ) {
        return node.right.object;
      }
      return null;
    }
  • Parameters:
  • node: TSESTree.Node | null
  • name: string
  • Return Type: TSESTree.Expression | null
  • Calls:
  • isMatchingIdentifier

isIncrement(node: TSESTree.Node | null, name: string): boolean

Code
function isIncrement(node: TSESTree.Node | null, name: string): boolean {
      if (!node) {
        return false;
      }

      switch (node.type) {
        case AST_NODE_TYPES.UpdateExpression:
          // x++ or ++x
          return (
            node.operator === '++' && isMatchingIdentifier(node.argument, name)
          );
        case AST_NODE_TYPES.AssignmentExpression:
          if (isMatchingIdentifier(node.left, name)) {
            if (node.operator === '+=') {
              // x += 1
              return isLiteral(node.right, 1);
            }
            if (node.operator === '=') {
              // x = x + 1 or x = 1 + x
              const expr = node.right;
              return (
                expr.type === AST_NODE_TYPES.BinaryExpression &&
                expr.operator === '+' &&
                ((isMatchingIdentifier(expr.left, name) &&
                  isLiteral(expr.right, 1)) ||
                  (isLiteral(expr.left, 1) &&
                    isMatchingIdentifier(expr.right, name)))
              );
            }
          }
      }
      return false;
    }
  • Parameters:
  • node: TSESTree.Node | null
  • name: string
  • Return Type: boolean
  • Calls:
  • isMatchingIdentifier
  • isLiteral
  • Internal Comments:
    // x++ or ++x
    // x += 1
    // x = x + 1 or x = 1 + x (x2)
    

contains(outer: TSESTree.Node, inner: TSESTree.Node): boolean

Code
function contains(outer: TSESTree.Node, inner: TSESTree.Node): boolean {
      return (
        outer.range[0] <= inner.range[0] && outer.range[1] >= inner.range[1]
      );
    }
  • Parameters:
  • outer: TSESTree.Node
  • inner: TSESTree.Node
  • Return Type: boolean

isIndexOnlyUsedWithArray(body: TSESTree.Statement, indexVar: TSESLint.Scope.Variable, arrayExpression: TSESTree.Expression): boolean

Code
function isIndexOnlyUsedWithArray(
      body: TSESTree.Statement,
      indexVar: TSESLint.Scope.Variable,
      arrayExpression: TSESTree.Expression,
    ): boolean {
      const arrayText = context.sourceCode.getText(arrayExpression);
      return indexVar.references.every(reference => {
        const id = reference.identifier;
        const node = id.parent;
        return (
          !contains(body, id) ||
          (node.type === AST_NODE_TYPES.MemberExpression &&
            node.object.type !== AST_NODE_TYPES.ThisExpression &&
            node.property === id &&
            context.sourceCode.getText(node.object) === arrayText &&
            !isAssignee(node))
        );
      });
    }
  • Parameters:
  • body: TSESTree.Statement
  • indexVar: TSESLint.Scope.Variable
  • arrayExpression: TSESTree.Expression
  • Return Type: boolean
  • Calls:
  • context.sourceCode.getText
  • indexVar.references.every
  • contains
  • isAssignee (from ../util)