]>
Commit | Line | Data |
---|---|---|
eb39fafa DC |
1 | /** |
2 | * @fileoverview Enforces or disallows inline comments. | |
3 | * @author Greg Cochard | |
4 | */ | |
5 | "use strict"; | |
6 | ||
7 | const astUtils = require("./utils/ast-utils"); | |
8 | ||
9 | //------------------------------------------------------------------------------ | |
10 | // Rule Definition | |
11 | //------------------------------------------------------------------------------ | |
12 | ||
34eeec05 | 13 | /** @type {import('../shared/types').Rule} */ |
eb39fafa DC |
14 | module.exports = { |
15 | meta: { | |
16 | type: "suggestion", | |
17 | ||
18 | docs: { | |
8f9d1d4d | 19 | description: "Disallow inline comments after code", |
eb39fafa DC |
20 | recommended: false, |
21 | url: "https://eslint.org/docs/rules/no-inline-comments" | |
22 | }, | |
23 | ||
6f036462 TL |
24 | schema: [ |
25 | { | |
26 | type: "object", | |
27 | properties: { | |
28 | ignorePattern: { | |
29 | type: "string" | |
30 | } | |
31 | }, | |
32 | additionalProperties: false | |
33 | } | |
34 | ], | |
eb39fafa DC |
35 | |
36 | messages: { | |
37 | unexpectedInlineComment: "Unexpected comment inline with code." | |
38 | } | |
39 | }, | |
40 | ||
41 | create(context) { | |
42 | const sourceCode = context.getSourceCode(); | |
6f036462 TL |
43 | const options = context.options[0]; |
44 | let customIgnoreRegExp; | |
45 | ||
46 | if (options && options.ignorePattern) { | |
47 | customIgnoreRegExp = new RegExp(options.ignorePattern, "u"); | |
48 | } | |
eb39fafa DC |
49 | |
50 | /** | |
51 | * Will check that comments are not on lines starting with or ending with code | |
52 | * @param {ASTNode} node The comment node to check | |
53 | * @private | |
54 | * @returns {void} | |
55 | */ | |
56 | function testCodeAroundComment(node) { | |
57 | ||
58 | const startLine = String(sourceCode.lines[node.loc.start.line - 1]), | |
59 | endLine = String(sourceCode.lines[node.loc.end.line - 1]), | |
60 | preamble = startLine.slice(0, node.loc.start.column).trim(), | |
61 | postamble = endLine.slice(node.loc.end.column).trim(), | |
62 | isPreambleEmpty = !preamble, | |
63 | isPostambleEmpty = !postamble; | |
64 | ||
65 | // Nothing on both sides | |
66 | if (isPreambleEmpty && isPostambleEmpty) { | |
67 | return; | |
68 | } | |
69 | ||
6f036462 TL |
70 | // Matches the ignore pattern |
71 | if (customIgnoreRegExp && customIgnoreRegExp.test(node.value)) { | |
72 | return; | |
73 | } | |
74 | ||
eb39fafa DC |
75 | // JSX Exception |
76 | if ( | |
77 | (isPreambleEmpty || preamble === "{") && | |
78 | (isPostambleEmpty || postamble === "}") | |
79 | ) { | |
80 | const enclosingNode = sourceCode.getNodeByRangeIndex(node.range[0]); | |
81 | ||
82 | if (enclosingNode && enclosingNode.type === "JSXEmptyExpression") { | |
83 | return; | |
84 | } | |
85 | } | |
86 | ||
87 | // Don't report ESLint directive comments | |
88 | if (astUtils.isDirectiveComment(node)) { | |
89 | return; | |
90 | } | |
91 | ||
92 | context.report({ | |
93 | node, | |
94 | messageId: "unexpectedInlineComment" | |
95 | }); | |
96 | } | |
97 | ||
98 | //-------------------------------------------------------------------------- | |
99 | // Public | |
100 | //-------------------------------------------------------------------------- | |
101 | ||
102 | return { | |
103 | Program() { | |
6f036462 TL |
104 | sourceCode.getAllComments() |
105 | .filter(token => token.type !== "Shebang") | |
106 | .forEach(testCodeAroundComment); | |
eb39fafa DC |
107 | } |
108 | }; | |
109 | } | |
110 | }; |