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.
64 lines
2.0 KiB
64 lines
2.0 KiB
9 years ago
|
/**
|
||
|
* @fileoverview Rule to flag the use of redundant constructors in classes.
|
||
|
* @author Alberto Rodríguez
|
||
|
* @copyright 2015 Alberto Rodríguez. All rights reserved.
|
||
|
* See LICENSE file in root directory for full license.
|
||
|
*/
|
||
|
"use strict";
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
// Rule Definition
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
module.exports = function(context) {
|
||
|
|
||
|
/**
|
||
|
* Checks whether the constructor body is a redundant super call.
|
||
|
* @param {Array} body - constructor body content.
|
||
|
* @param {Array} ctorParams - The params to check against super call.
|
||
|
* @returns {boolean} true if the construtor body is redundant
|
||
|
*/
|
||
|
function isRedundantSuperCall(body, ctorParams) {
|
||
|
if (body.length !== 1 ||
|
||
|
body[0].type !== "ExpressionStatement" ||
|
||
|
body[0].expression.callee.type !== "Super") {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
return body[0].expression.arguments.every(function(arg, index) {
|
||
|
return (arg.type === "Identifier" && arg.name === ctorParams[index].name) ||
|
||
|
(
|
||
|
arg.type === "SpreadElement" &&
|
||
|
ctorParams[index].type === "RestElement" &&
|
||
|
arg.argument.name === ctorParams[index].argument.name
|
||
|
);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks whether a node is a redundant construtor
|
||
|
* @param {ASTNode} node - node to check
|
||
|
* @returns {void}
|
||
|
*/
|
||
|
function checkForConstructor(node) {
|
||
|
if (node.kind !== "constructor") {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var body = node.value.body.body;
|
||
|
|
||
|
if (!node.parent.parent.superClass && body.length === 0 ||
|
||
|
node.parent.parent.superClass && isRedundantSuperCall(body, node.value.params)) {
|
||
|
context.report(node, "Useless constructor.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
return {
|
||
|
"MethodDefinition": checkForConstructor
|
||
|
};
|
||
|
};
|
||
|
|
||
|
module.exports.schema = [];
|