Blame view

node_modules/eslint/lib/rules/no-confusing-arrow.js 2.44 KB
ce4c83ff   wxy   初始提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  /**
   * @fileoverview A rule to warn against using arrow functions when they could be
   * confused with comparisions
   * @author Jxck <https://github.com/Jxck>
   */
  
  "use strict";
  
  const astUtils = require("../ast-utils.js");
  
  //------------------------------------------------------------------------------
  // Helpers
  //------------------------------------------------------------------------------
  
  /**
   * Checks whether or not a node is a conditional expression.
   * @param {ASTNode} node - node to test
   * @returns {boolean} `true` if the node is a conditional expression.
   */
  function isConditional(node) {
      return node && node.type === "ConditionalExpression";
  }
  
  //------------------------------------------------------------------------------
  // Rule Definition
  //------------------------------------------------------------------------------
  
  module.exports = {
      meta: {
          docs: {
              description: "disallow arrow functions where they could be confused with comparisons",
              category: "ECMAScript 6",
              recommended: false,
              url: "https://eslint.org/docs/rules/no-confusing-arrow"
          },
  
          fixable: "code",
  
          schema: [{
              type: "object",
              properties: {
                  allowParens: { type: "boolean" }
              },
              additionalProperties: false
          }],
  
          messages: {
              confusing: "Arrow function used ambiguously with a conditional expression."
          }
      },
  
      create(context) {
          const config = context.options[0] || {};
          const sourceCode = context.getSourceCode();
  
          /**
           * Reports if an arrow function contains an ambiguous conditional.
           * @param {ASTNode} node - A node to check and report.
           * @returns {void}
           */
          function checkArrowFunc(node) {
              const body = node.body;
  
              if (isConditional(body) && !(config.allowParens && astUtils.isParenthesised(sourceCode, body))) {
                  context.report({
                      node,
                      messageId: "confusing",
                      fix(fixer) {
  
                          // if `allowParens` is not set to true dont bother wrapping in parens
                          return config.allowParens && fixer.replaceText(node.body, `(${sourceCode.getText(node.body)})`);
                      }
                  });
              }
          }
  
          return {
              ArrowFunctionExpression: checkArrowFunc
          };
      }
  };