@mysticatea/eslint-plugin
Version:
Additional ESLint rules.
98 lines (84 loc) • 2.98 kB
JavaScript
/**
* @fileoverview Rule to disallow a use of ignored variables.
* @author Toru Nagashima
*/
//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------
const DEFAULT_IGNORE_PATTERN = /^_[a-zA-Z]+$/u
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = {
meta: {
docs: {
description: "Disallow a use of ignored variables.",
category: "Stylistic Issues",
recommended: false,
url:
"https://github.com/mysticatea/eslint-plugin/blob/v13.0.0/docs/rules/no-use-ignored-vars.md",
},
fixable: null,
schema: [{ type: "string" }],
type: "suggestion",
},
create(context) {
const ignorePattern =
context.options[0] != null
? new RegExp(context.options[0], "u")
: DEFAULT_IGNORE_PATTERN
/**
* Checks whether a given variable is ignored or not.
*
* @param {escope.Variable} variable - A variable to check.
* @returns {boolean} `true` if the variable is ignored.
*/
function isIgnored(variable) {
return ignorePattern.test(variable.name)
}
/**
* Checks whether a given reference is an initializer or not.
*
* @param {escope.Reference} reference - A reference to check.
* @returns {boolean} `true` if the reference ia an initializer.
*/
function isNotInitializer(reference) {
return !reference.init
}
/**
* Reports a reference.
*
* @param {escope.Reference} reference - A reference to report.
* @returns {void}
*/
function report(reference) {
const id = reference.identifier
context.report({
node: id,
message:
"Unexpected a use of '{{name}}'. This name is matched to ignored pattern.",
data: id,
})
}
/**
* Reports references of a given variable.
*
* @param {escope.Variable} variable - A variable to report.
* @returns {void}
*/
function reportReferences(variable) {
variable.references.filter(isNotInitializer).forEach(report)
}
return {
"Program:exit"() {
const queue = [context.getScope()]
let scope = null
while ((scope = queue.pop()) != null) {
scope.variables.filter(isIgnored).forEach(reportReferences)
Array.prototype.push.apply(queue, scope.childScopes)
}
},
}
},
}