diff --git a/rules/no-for-loop.js b/rules/no-for-loop.js index dc1e77e9d5..94673cda65 100644 --- a/rules/no-for-loop.js +++ b/rules/no-for-loop.js @@ -2,9 +2,10 @@ const {isClosingParenToken, getStaticValue} = require('eslint-utils'); const isLiteralValue = require('./utils/is-literal-value.js'); const avoidCapture = require('./utils/avoid-capture.js'); -const getChildScopesRecursive = require('./utils/get-child-scopes-recursive.js'); +const getScopes = require('./utils/get-scopes.js'); const singular = require('./utils/singular.js'); const toLocation = require('./utils/to-location.js'); +const getReferences = require('./utils/get-references.js'); const MESSAGE_ID = 'no-for-loop'; const messages = { @@ -261,13 +262,8 @@ const someVariablesLeakOutOfTheLoop = (forStatement, variables, forScope) => { }); }; -const getReferencesInChildScopes = (scope, name) => { - const references = scope.references.filter(reference => reference.identifier.name === name); - return [ - ...references, - ...scope.childScopes.flatMap(s => getReferencesInChildScopes(s, name)), - ]; -}; +const getReferencesInChildScopes = (scope, name) => + getReferences(scope).filter(reference => reference.identifier.name === name); const create = context => { const sourceCode = context.getSourceCode(); @@ -355,7 +351,7 @@ const create = context => { const index = indexIdentifierName; const element = elementIdentifierName || - avoidCapture(singular(arrayIdentifierName) || defaultElementName, getChildScopesRecursive(bodyScope)); + avoidCapture(singular(arrayIdentifierName) || defaultElementName, getScopes(bodyScope)); const array = arrayIdentifierName; let declarationElement = element; diff --git a/rules/prefer-array-find.js b/rules/prefer-array-find.js index ea1e6b751c..18799b8b44 100644 --- a/rules/prefer-array-find.js +++ b/rules/prefer-array-find.js @@ -7,7 +7,7 @@ const { } = require('./selectors/index.js'); const getVariableIdentifiers = require('./utils/get-variable-identifiers.js'); const avoidCapture = require('./utils/avoid-capture.js'); -const getChildScopesRecursive = require('./utils/get-child-scopes-recursive.js'); +const getScopes = require('./utils/get-scopes.js'); const singular = require('./utils/singular.js'); const { extendFixRange, @@ -299,7 +299,7 @@ const create = context => { const singularName = singular(node.id.name); if (singularName) { // Rename variable to be singularized now that it refers to a single item in the array instead of the entire array. - const singularizedName = avoidCapture(singularName, getChildScopesRecursive(scope)); + const singularizedName = avoidCapture(singularName, getScopes(scope)); yield * renameVariable(variable, singularizedName, fixer); // Prevent possible variable conflicts diff --git a/rules/prevent-abbreviations.js b/rules/prevent-abbreviations.js index 2ae436f037..1b47c4661f 100644 --- a/rules/prevent-abbreviations.js +++ b/rules/prevent-abbreviations.js @@ -10,6 +10,7 @@ const getVariableIdentifiers = require('./utils/get-variable-identifiers.js'); const isStaticRequire = require('./utils/is-static-require.js'); const {defaultReplacements, defaultAllowList} = require('./shared/abbreviations.js'); const {renameVariable} = require('./fix/index.js'); +const getScopes = require('./utils/get-scopes.js'); const isUpperCase = string => string === string.toUpperCase(); const isUpperFirst = string => isUpperCase(string[0]); @@ -447,16 +448,11 @@ const create = context => { } }; - const checkChildScopes = scope => { - for (const childScope of scope.childScopes) { - checkScope(childScope); - } - }; - const checkScope = scope => { - checkVariables(scope); - - return checkChildScopes(scope); + const scopes = getScopes(scope); + for (const scope of scopes) { + checkVariables(scope); + } }; return { diff --git a/rules/utils/avoid-capture.js b/rules/utils/avoid-capture.js index d0765b6272..e8ab2e4647 100644 --- a/rules/utils/avoid-capture.js +++ b/rules/utils/avoid-capture.js @@ -5,6 +5,7 @@ const { isKeyword, } = require('@babel/helper-validator-identifier'); const resolveVariableName = require('./resolve-variable-name.js'); +const getReferences = require('./get-references.js'); // /~https://github.com/microsoft/TypeScript/issues/2536#issuecomment-87194347 const typescriptReservedWords = new Set([ @@ -98,8 +99,7 @@ function unicorn() { ``` */ const isUnresolvedName = (name, scope) => - scope.references.some(reference => reference.identifier && reference.identifier.name === name && !reference.resolved) || - scope.childScopes.some(scope => isUnresolvedName(name, scope)); + getReferences(scope).some(({identifier, resolved}) => identifier && identifier.name === name && !resolved); const isSafeName = (name, scopes) => !scopes.some(scope => resolveVariableName(name, scope) || isUnresolvedName(name, scope)); diff --git a/rules/utils/get-references.js b/rules/utils/get-references.js index 6fafe83870..9f6c74588f 100644 --- a/rules/utils/get-references.js +++ b/rules/utils/get-references.js @@ -1,9 +1,9 @@ 'use strict'; const {uniq} = require('lodash'); +const getScopes = require('./get-scopes.js'); -const getReferences = scope => uniq([ - ...scope.references, - ...scope.childScopes.flatMap(scope => getReferences(scope)), -]); +const getReferences = scope => uniq( + getScopes(scope).flatMap(({references}) => references), +); module.exports = getReferences; diff --git a/rules/utils/get-child-scopes-recursive.js b/rules/utils/get-scopes.js similarity index 56% rename from rules/utils/get-child-scopes-recursive.js rename to rules/utils/get-scopes.js index 756a11e2f5..fff2fdca4b 100644 --- a/rules/utils/get-child-scopes-recursive.js +++ b/rules/utils/get-scopes.js @@ -6,9 +6,9 @@ Gather a list of all Scopes starting recursively from the input Scope. @param {Scope} scope - The Scope to start checking from. @returns {Scope[]} - The resulting Scopes. */ -const getChildScopesRecursive = scope => [ +const getScopes = scope => [ scope, - ...scope.childScopes.flatMap(scope => getChildScopesRecursive(scope)), + ...scope.childScopes.flatMap(scope => getScopes(scope)), ]; -module.exports = getChildScopesRecursive; +module.exports = getScopes;