Skip to content

Commit

Permalink
Fix: improve newline-per-chained-call message (fixes #6340)
Browse files Browse the repository at this point in the history
  • Loading branch information
mysticatea committed Jun 9, 2016
1 parent 977cdd5 commit f9bbd76
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 17 deletions.
15 changes: 14 additions & 1 deletion lib/rules/newline-per-chained-call.js
Expand Up @@ -38,6 +38,19 @@ module.exports = {

var sourceCode = context.getSourceCode();

/**
* Gets the property text of a given MemberExpression node.
* If the text is multiline, this returns only the first line.
*
* @param {ASTNode} node - A MemberExpression node to get.
* @returns {string} The property text of the node.
*/
function getPropertyText(node) {
var prefix = node.computed ? "[" : ".";

return prefix + sourceCode.getText(node.property).split(/\r\n|\r|\n/g)[0];
}

return {
"CallExpression:exit": function(node) {
if (!node.callee || node.callee.type !== "MemberExpression") {
Expand All @@ -57,7 +70,7 @@ module.exports = {
context.report(
callee.property,
callee.property.loc.start,
"Expected line break after `" + sourceCode.getText(callee.object).replace(/\r\n|\r|\n/g, "\\n") + "`."
"Expected line break before `" + getPropertyText(callee) + "`."
);
}
}
Expand Down
62 changes: 46 additions & 16 deletions tests/lib/rules/newline-per-chained-call.js
Expand Up @@ -53,56 +53,86 @@ ruleTester.run("newline-per-chained-call", rule, {
invalid: [{
code: "_\n.chain({}).map(foo).filter(bar).value();",
errors: [{
message: "Expected line break after `_\\n.chain({}).map(foo)`."
message: "Expected line break before `.filter`."
}, {
message: "Expected line break after `_\\n.chain({}).map(foo).filter(bar)`."
message: "Expected line break before `.value`."
}]
}, {
code: "_\n.chain({})\n.map(foo)\n.filter(bar).value();",
errors: [{
message: "Expected line break after `_\\n.chain({})\\n.map(foo)\\n.filter(bar)`."
message: "Expected line break before `.value`."
}]
}, {
code: "a().b().c().e.d()",
errors: [{
message: "Expected line break after `a().b()`."
}]
}, {
code: "a().b().c().e.d()",
errors: [{
message: "Expected line break after `a().b()`."
message: "Expected line break before `.c`."
}]
}, {
code: "a.b.c().e().d()",
errors: [{
message: "Expected line break after `a.b.c().e()`."
message: "Expected line break before `.d`."
}]
}, {
code: "_.chain({}).map(a).value(); ",
errors: [{
message: "Expected line break after `_.chain({}).map(a)`."
message: "Expected line break before `.value`."
}]
}, {
code: "var a = m1.m2();\n var b = m1.m2().m3().m4().m5();",
errors: [{
message: "Expected line break after `m1.m2().m3()`."
message: "Expected line break before `.m4`."
}, {
message: "Expected line break after `m1.m2().m3().m4()`."
message: "Expected line break before `.m5`."
}]
}, {
code: "var a = m1.m2();\n var b = m1.m2().m3()\n.m4().m5();",
errors: [{
message: "Expected line break after `m1.m2().m3()\\n.m4()`."
message: "Expected line break before `.m5`."
}]
}, {
code: "var a = m1().m2\n.m3().m4().m5().m6().m7();",
options: [{
ignoreChainWithDepth: 3
}],
errors: [{
message: "Expected line break after `m1().m2\\n.m3().m4().m5()`."
message: "Expected line break before `.m6`."
}, {
message: "Expected line break before `.m7`."
}]
}, {
code: [
"http.request({",
" // Param",
" // Param",
" // Param",
"}).on('response', function(response) {",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
" // Do something with response.",
"}).on('error', function(error) {",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
" // Do something with error.",
"}).end();"
].join("\n"),
errors: [{
message: "Expected line break before `.on`."
}, {
message: "Expected line break after `m1().m2\\n.m3().m4().m5().m6()`."
message: "Expected line break before `.end`."
}]
}]

Expand Down

0 comments on commit f9bbd76

Please sign in to comment.