Actualizacion maquina principal
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / eslint / lib / rules / dot-location.js
1 /**
2  * @fileoverview Validates newlines before and after dots
3  * @author Greg Cochard
4  */
5
6 "use strict";
7
8 const astUtils = require("./utils/ast-utils");
9
10 //------------------------------------------------------------------------------
11 // Rule Definition
12 //------------------------------------------------------------------------------
13
14 module.exports = {
15     meta: {
16         type: "layout",
17
18         docs: {
19             description: "enforce consistent newlines before and after dots",
20             category: "Best Practices",
21             recommended: false,
22             url: "https://eslint.org/docs/rules/dot-location"
23         },
24
25         schema: [
26             {
27                 enum: ["object", "property"]
28             }
29         ],
30
31         fixable: "code",
32
33         messages: {
34             expectedDotAfterObject: "Expected dot to be on same line as object.",
35             expectedDotBeforeProperty: "Expected dot to be on same line as property."
36         }
37     },
38
39     create(context) {
40
41         const config = context.options[0];
42
43         // default to onObject if no preference is passed
44         const onObject = config === "object" || !config;
45
46         const sourceCode = context.getSourceCode();
47
48         /**
49          * Reports if the dot between object and property is on the correct loccation.
50          * @param {ASTNode} node The `MemberExpression` node.
51          * @returns {void}
52          */
53         function checkDotLocation(node) {
54             const property = node.property;
55             const dot = sourceCode.getTokenBefore(property);
56
57             // `obj` expression can be parenthesized, but those paren tokens are not a part of the `obj` node.
58             const tokenBeforeDot = sourceCode.getTokenBefore(dot);
59
60             const textBeforeDot = sourceCode.getText().slice(tokenBeforeDot.range[1], dot.range[0]);
61             const textAfterDot = sourceCode.getText().slice(dot.range[1], property.range[0]);
62
63             if (onObject) {
64                 if (!astUtils.isTokenOnSameLine(tokenBeforeDot, dot)) {
65                     const neededTextAfterToken = astUtils.isDecimalIntegerNumericToken(tokenBeforeDot) ? " " : "";
66
67                     context.report({
68                         node,
69                         loc: dot.loc,
70                         messageId: "expectedDotAfterObject",
71                         fix: fixer => fixer.replaceTextRange([tokenBeforeDot.range[1], property.range[0]], `${neededTextAfterToken}.${textBeforeDot}${textAfterDot}`)
72                     });
73                 }
74             } else if (!astUtils.isTokenOnSameLine(dot, property)) {
75                 context.report({
76                     node,
77                     loc: dot.loc,
78                     messageId: "expectedDotBeforeProperty",
79                     fix: fixer => fixer.replaceTextRange([tokenBeforeDot.range[1], property.range[0]], `${textBeforeDot}${textAfterDot}.`)
80                 });
81             }
82         }
83
84         /**
85          * Checks the spacing of the dot within a member expression.
86          * @param {ASTNode} node The node to check.
87          * @returns {void}
88          */
89         function checkNode(node) {
90             if (!node.computed) {
91                 checkDotLocation(node);
92             }
93         }
94
95         return {
96             MemberExpression: checkNode
97         };
98     }
99 };