2 * @fileoverview Validates newlines before and after dots
8 const astUtils
= require("./utils/ast-utils");
10 //------------------------------------------------------------------------------
12 //------------------------------------------------------------------------------
19 description
: "enforce consistent newlines before and after dots",
20 category
: "Best Practices",
22 url
: "https://eslint.org/docs/rules/dot-location"
27 enum: ["object", "property"]
34 expectedDotAfterObject
: "Expected dot to be on same line as object.",
35 expectedDotBeforeProperty
: "Expected dot to be on same line as property."
41 const config
= context
.options
[0];
43 // default to onObject if no preference is passed
44 const onObject
= config
=== "object" || !config
;
46 const sourceCode
= context
.getSourceCode();
49 * Reports if the dot between object and property is on the correct loccation.
50 * @param {ASTNode} node The `MemberExpression` node.
53 function checkDotLocation(node
) {
54 const property
= node
.property
;
55 const dotToken
= sourceCode
.getTokenBefore(property
);
59 // `obj` expression can be parenthesized, but those paren tokens are not a part of the `obj` node.
60 const tokenBeforeDot
= sourceCode
.getTokenBefore(dotToken
);
62 if (!astUtils
.isTokenOnSameLine(tokenBeforeDot
, dotToken
)) {
66 messageId
: "expectedDotAfterObject",
68 if (dotToken
.value
.startsWith(".") && astUtils
.isDecimalIntegerNumericToken(tokenBeforeDot
)) {
69 yield fixer
.insertTextAfter(tokenBeforeDot
, ` ${dotToken.value}`);
71 yield fixer
.insertTextAfter(tokenBeforeDot
, dotToken
.value
);
73 yield fixer
.remove(dotToken
);
77 } else if (!astUtils
.isTokenOnSameLine(dotToken
, property
)) {
81 messageId
: "expectedDotBeforeProperty",
83 yield fixer
.remove(dotToken
);
84 yield fixer
.insertTextBefore(property
, dotToken
.value
);
91 * Checks the spacing of the dot within a member expression.
92 * @param {ASTNode} node The node to check.
95 function checkNode(node
) {
97 checkDotLocation(node
);
102 MemberExpression
: checkNode