mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
tools: lint for alignment of variable assignments
Enforce alignment/indentation on variable assignments that span multiple lines. PR-URL: https://github.com/nodejs/node/pull/6242 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Johan Bergström <bugs@bergstroem.nu> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
31600735f4
commit
ca698330ac
@ -13,7 +13,7 @@ rules:
|
||||
no-duplicate-case: 2
|
||||
no-empty-character-class: 2
|
||||
no-ex-assign: 2
|
||||
no-extra-boolean-cast : 2
|
||||
no-extra-boolean-cast: 2
|
||||
no-extra-parens: [2, "functions"]
|
||||
no-extra-semi: 2
|
||||
no-func-assign: 2
|
||||
@ -86,7 +86,7 @@ rules:
|
||||
|
||||
# Custom rules in tools/eslint-rules
|
||||
new-with-error: [2, "Error", "RangeError", "TypeError", "SyntaxError", "ReferenceError"]
|
||||
|
||||
align-multiline-assignment: 2
|
||||
|
||||
# Global scoped method and vars
|
||||
globals:
|
||||
|
68
tools/eslint-rules/align-multiline-assignment.js
Normal file
68
tools/eslint-rules/align-multiline-assignment.js
Normal file
@ -0,0 +1,68 @@
|
||||
/**
|
||||
* @fileoverview Align multiline variable assignments
|
||||
* @author Rich Trott
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Rule Definition
|
||||
//------------------------------------------------------------------------------
|
||||
function getBinaryExpressionStarts(binaryExpression, starts = []) {
|
||||
function getStartsFromOneSide(side, starts) {
|
||||
starts.push(side.loc.start);
|
||||
if (side.type === 'BinaryExpression') {
|
||||
starts = getBinaryExpressionStarts(side, starts);
|
||||
}
|
||||
return starts;
|
||||
}
|
||||
|
||||
starts = getStartsFromOneSide(binaryExpression.left, starts);
|
||||
starts = getStartsFromOneSide(binaryExpression.right, starts);
|
||||
return starts;
|
||||
}
|
||||
|
||||
function checkExpressionAlignment(expression) {
|
||||
if (!expression)
|
||||
return;
|
||||
|
||||
var msg = '';
|
||||
|
||||
switch (expression.type) {
|
||||
case 'BinaryExpression':
|
||||
var starts = getBinaryExpressionStarts(expression);
|
||||
var startLine = starts[0].line;
|
||||
const startColumn = starts[0].column;
|
||||
starts.forEach((loc) => {
|
||||
if (loc.line > startLine) {
|
||||
startLine = loc.line;
|
||||
if (loc.column !== startColumn) {
|
||||
msg = 'Misaligned multiline assignment';
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
function testAssignment(context, node) {
|
||||
const msg = checkExpressionAlignment(node.right);
|
||||
if (msg)
|
||||
context.report(node, msg);
|
||||
}
|
||||
|
||||
function testDeclaration(context, node) {
|
||||
node.declarations.forEach((declaration) => {
|
||||
const msg = checkExpressionAlignment(declaration.init);
|
||||
// const start = declaration.init.loc.start;
|
||||
if (msg)
|
||||
context.report(node, msg);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = function(context) {
|
||||
return {
|
||||
'AssignmentExpression': (node) => testAssignment(context, node),
|
||||
'VariableDeclaration': (node) => testDeclaration(context, node)
|
||||
};
|
||||
};
|
Loading…
Reference in New Issue
Block a user