Skip to content

Commit

Permalink
Update: Add a fixer for dot-location (#7186)
Browse files Browse the repository at this point in the history
  • Loading branch information
not-an-aardvark authored and nzakas committed Sep 29, 2016
1 parent 89787b2 commit cd1dc57
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
2 changes: 2 additions & 0 deletions docs/rules/dot-location.md
@@ -1,5 +1,7 @@
# Enforce newline before and after dot (dot-location)

(fixable) The `--fix` option on the [command line](../user-guide/command-line-interface#fix) automatically fixes problems reported by this rule.

JavaScript allows you to place newlines before or after a dot in a member expression.

Consistency in placing a newline before or after the dot can greatly increase readability.
Expand Down
22 changes: 19 additions & 3 deletions lib/rules/dot-location.js
Expand Up @@ -23,7 +23,9 @@ module.exports = {
{
enum: ["object", "property"]
}
]
],

fixable: "code"
},

create(context) {
Expand All @@ -44,14 +46,28 @@ module.exports = {
*/
function checkDotLocation(obj, prop, node) {
const dot = sourceCode.getTokenBefore(prop);
const textBeforeDot = sourceCode.getText().slice(obj.range[1], dot.range[0]);
const textAfterDot = sourceCode.getText().slice(dot.range[1], prop.range[0]);

if (dot.type === "Punctuator" && dot.value === ".") {
if (onObject) {
if (!astUtils.isTokenOnSameLine(obj, dot)) {
context.report(node, dot.loc.start, "Expected dot to be on same line as object.");
const neededTextAfterObj = astUtils.isDecimalInteger(obj) ? " " : "";

context.report({
node,
loc: dot.loc.start,
message: "Expected dot to be on same line as object.",
fix: fixer => fixer.replaceTextRange([obj.range[1], prop.range[0]], `${neededTextAfterObj}.${textBeforeDot}${textAfterDot}`)
});
}
} else if (!astUtils.isTokenOnSameLine(dot, prop)) {
context.report(node, dot.loc.start, "Expected dot to be on same line as property.");
context.report({
node,
loc: dot.loc.start,
message: "Expected dot to be on same line as property.",
fix: fixer => fixer.replaceTextRange([obj.range[1], prop.range[0]], `${textBeforeDot}${textAfterDot}.`)
});
}
}
}
Expand Down
27 changes: 27 additions & 0 deletions tests/lib/rules/dot-location.js
Expand Up @@ -42,18 +42,45 @@ ruleTester.run("dot-location", rule, {
invalid: [
{
code: "obj\n.property",
output: "obj.\nproperty",
options: [ "object" ],
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 1 } ]
},
{
code: "obj.\nproperty",
output: "obj\n.property",
options: [ "property" ],
errors: [ { message: "Expected dot to be on same line as property.", type: "MemberExpression", line: 1, column: 4 } ]
},
{
code: "(obj).\nproperty",
output: "(obj)\n.property",
options: [ "property" ],
errors: [ { message: "Expected dot to be on same line as property.", type: "MemberExpression", line: 1, column: 6 } ]
},
{
code: "5\n.toExponential()",
output: "5 .\ntoExponential()",
options: [ "object" ],
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 1 } ]
},
{
code: "-5\n.toExponential()",
output: "-5 .\ntoExponential()",
options: [ "object" ],
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 1 } ]
},
{
code: "foo /* a */ . /* b */ \n /* c */ bar",
output: "foo /* a */ /* b */ \n /* c */ .bar",
options: [ "property" ],
errors: [ { message: "Expected dot to be on same line as property.", type: "MemberExpression", line: 1, column: 13 } ]
},
{
code: "foo /* a */ \n /* b */ . /* c */ bar",
output: "foo. /* a */ \n /* b */ /* c */ bar",
options: [ "object" ],
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 10 } ]
}
]
});

0 comments on commit cd1dc57

Please sign in to comment.