|
|
|
/**
|
|
|
|
* @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)
|
|
|
|
};
|
|
|
|
};
|