blob: 945eb5ecea1ff076f12cf59d4865fe0dabc82b9e [file] [log] [blame]
Yang Guo4fd355c2019-09-19 10:59:03 +02001/**
2 * @fileoverview Rule to flag when regex literals are not wrapped in parens
3 * @author Matt DuVall <http://www.mattduvall.com>
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Rule Definition
10//------------------------------------------------------------------------------
11
12module.exports = {
13 meta: {
14 type: "layout",
15
16 docs: {
17 description: "require parenthesis around regex literals",
Yang Guo4fd355c2019-09-19 10:59:03 +020018 recommended: false,
19 url: "https://eslint.org/docs/rules/wrap-regex"
20 },
21
22 schema: [],
23 fixable: "code",
24
25 messages: {
26 requireParens: "Wrap the regexp literal in parens to disambiguate the slash."
27 }
28 },
29
30 create(context) {
31 const sourceCode = context.getSourceCode();
32
33 return {
34
35 Literal(node) {
36 const token = sourceCode.getFirstToken(node),
37 nodeType = token.type;
38
39 if (nodeType === "RegularExpression") {
40 const beforeToken = sourceCode.getTokenBefore(node);
41 const afterToken = sourceCode.getTokenAfter(node);
42 const ancestors = context.getAncestors();
43 const grandparent = ancestors[ancestors.length - 1];
44
45 if (grandparent.type === "MemberExpression" && grandparent.object === node &&
46 !(beforeToken && beforeToken.value === "(" && afterToken && afterToken.value === ")")) {
47 context.report({
48 node,
49 messageId: "requireParens",
50 fix: fixer => fixer.replaceText(node, `(${sourceCode.getText(node)})`)
51 });
52 }
53 }
54 }
55 };
56
57 }
58};