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 dot = sourceCode.getTokenBefore(property);
57 // `obj` expression can be parenthesized, but those paren tokens are not a part of the `obj` node.
58 const tokenBeforeDot = sourceCode.getTokenBefore(dot);
60 const textBeforeDot = sourceCode.getText().slice(tokenBeforeDot.range[1], dot.range[0]);
61 const textAfterDot = sourceCode.getText().slice(dot.range[1], property.range[0]);
64 if (!astUtils.isTokenOnSameLine(tokenBeforeDot, dot)) {
65 const neededTextAfterToken = astUtils.isDecimalIntegerNumericToken(tokenBeforeDot) ? " " : "";
70 messageId: "expectedDotAfterObject",
71 fix: fixer => fixer.replaceTextRange([tokenBeforeDot.range[1], property.range[0]], `${neededTextAfterToken}.${textBeforeDot}${textAfterDot}`)
74 } else if (!astUtils.isTokenOnSameLine(dot, property)) {
78 messageId: "expectedDotBeforeProperty",
79 fix: fixer => fixer.replaceTextRange([tokenBeforeDot.range[1], property.range[0]], `${textBeforeDot}${textAfterDot}.`)
85 * Checks the spacing of the dot within a member expression.
86 * @param {ASTNode} node The node to check.
89 function checkNode(node) {
91 checkDotLocation(node);
96 MemberExpression: checkNode