mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
79 lines
2.2 KiB
/**
|
|
* @fileoverview Rule to flag unnecessary bind calls
|
|
* @author Bence Dányi <bence@danyi.me>
|
|
* @copyright 2014 Bence Dányi. All rights reserved.
|
|
*/
|
|
"use strict";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Rule Definition
|
|
//------------------------------------------------------------------------------
|
|
|
|
module.exports = function(context) {
|
|
|
|
var scope = [{
|
|
depth: -1,
|
|
found: 0
|
|
}];
|
|
|
|
/**
|
|
* Get the topmost scope
|
|
* @returns {Object} The topmost scope
|
|
*/
|
|
function getTopScope() {
|
|
return scope[scope.length - 1];
|
|
}
|
|
|
|
/**
|
|
* Increment the depth of the top scope
|
|
* @returns {void}
|
|
*/
|
|
function incrementScopeDepth() {
|
|
var top = getTopScope();
|
|
top.depth++;
|
|
}
|
|
|
|
/**
|
|
* Decrement the depth of the top scope
|
|
* @returns {void}
|
|
*/
|
|
function decrementScopeDepth() {
|
|
var top = getTopScope();
|
|
top.depth--;
|
|
}
|
|
|
|
return {
|
|
"CallExpression": function(node) {
|
|
if (node.arguments.length === 1 &&
|
|
node.callee.type === "MemberExpression" &&
|
|
node.callee.property.name === "bind" &&
|
|
/FunctionExpression$/.test(node.callee.object.type)) {
|
|
scope.push({
|
|
call: node,
|
|
depth: -1,
|
|
found: 0
|
|
});
|
|
}
|
|
},
|
|
"CallExpression:exit": function(node) {
|
|
var top = getTopScope();
|
|
if (top.call === node && top.found === 0) {
|
|
context.report(node, "The function binding is unnecessary.");
|
|
scope.pop();
|
|
}
|
|
},
|
|
"ArrowFunctionExpression": incrementScopeDepth,
|
|
"ArrowFunctionExpression:exit": decrementScopeDepth,
|
|
"FunctionExpression": incrementScopeDepth,
|
|
"FunctionExpression:exit": decrementScopeDepth,
|
|
"FunctionDeclaration": incrementScopeDepth,
|
|
"FunctionDeclaration:exit": decrementScopeDepth,
|
|
"ThisExpression": function() {
|
|
var top = getTopScope();
|
|
if (top.depth === 0) {
|
|
top.found++;
|
|
}
|
|
}
|
|
};
|
|
|
|
};
|
|
|