diff --git a/packages/eslint-plugin/src/rules/no-use-before-define.ts b/packages/eslint-plugin/src/rules/no-use-before-define.ts index ebd4ef5a4d0..f813f9ad6fe 100644 --- a/packages/eslint-plugin/src/rules/no-use-before-define.ts +++ b/packages/eslint-plugin/src/rules/no-use-before-define.ts @@ -317,6 +317,16 @@ export default util.createRule({ return true; } + function isDefinedBeforeUse( + variable: TSESLint.Scope.Variable, + reference: TSESLint.Scope.Reference, + ): boolean { + return ( + variable.identifiers[0].range[1] <= reference.identifier.range[1] && + !isInInitializer(variable, reference) + ); + } + /** * Finds and validates all variables in a given scope. */ @@ -324,7 +334,7 @@ export default util.createRule({ scope.references.forEach(reference => { const variable = reference.resolved; - const report = (): void => + function report(): void { context.report({ node: reference.identifier, messageId: 'noUseBeforeDefine', @@ -332,6 +342,7 @@ export default util.createRule({ name: reference.identifier.name, }, }); + } // Skips when the reference is: // - initializations. @@ -344,14 +355,10 @@ export default util.createRule({ } if (!options.allowNamedExports && isNamedExports(reference)) { - if ( - !variable || - variable.identifiers[0].range[1] > reference.identifier.range[1] || - isInInitializer(variable, reference) - ) { + if (!variable || !isDefinedBeforeUse(variable, reference)) { report(); - return; } + return; } if (!variable) { @@ -360,8 +367,7 @@ export default util.createRule({ if ( variable.identifiers.length === 0 || - (variable.identifiers[0].range[1] <= reference.identifier.range[1] && - !isInInitializer(variable, reference)) || + isDefinedBeforeUse(variable, reference) || !isForbidden(variable, reference) || isClassRefInClassDecorator(variable, reference) || reference.from.type === TSESLint.Scope.ScopeType.functionType