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 location.
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