Blame view

node_modules/eslint/lib/rules/no-case-declarations.js 1.64 KB
f7563de62   Palak Handa   first commit
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
  /**
   * @fileoverview Rule to flag use of an lexical declarations inside a case clause
   * @author Erik Arvidsson
   */
  "use strict";
  
  //------------------------------------------------------------------------------
  // Rule Definition
  //------------------------------------------------------------------------------
  
  module.exports = {
      meta: {
          docs: {
              description: "disallow lexical declarations in case clauses",
              category: "Best Practices",
              recommended: true
          },
  
          schema: []
      },
  
      create(context) {
  
          /**
           * Checks whether or not a node is a lexical declaration.
           * @param {ASTNode} node A direct child statement of a switch case.
           * @returns {boolean} Whether or not the node is a lexical declaration.
           */
          function isLexicalDeclaration(node) {
              switch (node.type) {
                  case "FunctionDeclaration":
                  case "ClassDeclaration":
                      return true;
                  case "VariableDeclaration":
                      return node.kind !== "var";
                  default:
                      return false;
              }
          }
  
          return {
              SwitchCase(node) {
                  for (let i = 0; i < node.consequent.length; i++) {
                      const statement = node.consequent[i];
  
                      if (isLexicalDeclaration(statement)) {
                          context.report({
                              node,
                              message: "Unexpected lexical declaration in case block."
                          });
                      }
                  }
              }
          };
  
      }
  };