Skip to content

Commit cd1dc57

Browse files
not-an-aardvarknzakas
authored andcommitted
Update: Add a fixer for dot-location (#7186)
1 parent 89787b2 commit cd1dc57

3 files changed

Lines changed: 48 additions & 3 deletions

File tree

docs/rules/dot-location.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Enforce newline before and after dot (dot-location)
22

3+
(fixable) The `--fix` option on the [command line](../user-guide/command-line-interface#fix) automatically fixes problems reported by this rule.
4+
35
JavaScript allows you to place newlines before or after a dot in a member expression.
46

57
Consistency in placing a newline before or after the dot can greatly increase readability.

lib/rules/dot-location.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ module.exports = {
2323
{
2424
enum: ["object", "property"]
2525
}
26-
]
26+
],
27+
28+
fixable: "code"
2729
},
2830

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

4852
if (dot.type === "Punctuator" && dot.value === ".") {
4953
if (onObject) {
5054
if (!astUtils.isTokenOnSameLine(obj, dot)) {
51-
context.report(node, dot.loc.start, "Expected dot to be on same line as object.");
55+
const neededTextAfterObj = astUtils.isDecimalInteger(obj) ? " " : "";
56+
57+
context.report({
58+
node,
59+
loc: dot.loc.start,
60+
message: "Expected dot to be on same line as object.",
61+
fix: fixer => fixer.replaceTextRange([obj.range[1], prop.range[0]], `${neededTextAfterObj}.${textBeforeDot}${textAfterDot}`)
62+
});
5263
}
5364
} else if (!astUtils.isTokenOnSameLine(dot, prop)) {
54-
context.report(node, dot.loc.start, "Expected dot to be on same line as property.");
65+
context.report({
66+
node,
67+
loc: dot.loc.start,
68+
message: "Expected dot to be on same line as property.",
69+
fix: fixer => fixer.replaceTextRange([obj.range[1], prop.range[0]], `${textBeforeDot}${textAfterDot}.`)
70+
});
5571
}
5672
}
5773
}

tests/lib/rules/dot-location.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,45 @@ ruleTester.run("dot-location", rule, {
4242
invalid: [
4343
{
4444
code: "obj\n.property",
45+
output: "obj.\nproperty",
4546
options: [ "object" ],
4647
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 1 } ]
4748
},
4849
{
4950
code: "obj.\nproperty",
51+
output: "obj\n.property",
5052
options: [ "property" ],
5153
errors: [ { message: "Expected dot to be on same line as property.", type: "MemberExpression", line: 1, column: 4 } ]
5254
},
5355
{
5456
code: "(obj).\nproperty",
57+
output: "(obj)\n.property",
5558
options: [ "property" ],
5659
errors: [ { message: "Expected dot to be on same line as property.", type: "MemberExpression", line: 1, column: 6 } ]
60+
},
61+
{
62+
code: "5\n.toExponential()",
63+
output: "5 .\ntoExponential()",
64+
options: [ "object" ],
65+
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 1 } ]
66+
},
67+
{
68+
code: "-5\n.toExponential()",
69+
output: "-5 .\ntoExponential()",
70+
options: [ "object" ],
71+
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 1 } ]
72+
},
73+
{
74+
code: "foo /* a */ . /* b */ \n /* c */ bar",
75+
output: "foo /* a */ /* b */ \n /* c */ .bar",
76+
options: [ "property" ],
77+
errors: [ { message: "Expected dot to be on same line as property.", type: "MemberExpression", line: 1, column: 13 } ]
78+
},
79+
{
80+
code: "foo /* a */ \n /* b */ . /* c */ bar",
81+
output: "foo. /* a */ \n /* b */ /* c */ bar",
82+
options: [ "object" ],
83+
errors: [ { message: "Expected dot to be on same line as object.", type: "MemberExpression", line: 2, column: 10 } ]
5784
}
5885
]
5986
});

0 commit comments

Comments
 (0)