Blame view

node_modules/eslint/lib/rules/no-dupe-class-members.js 2.61 KB
c39994410   Ryan Glover   wip converting to...
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
82
  /**
   * @fileoverview A rule to disallow duplicate name in class members.
   * @author Toru Nagashima
   * @copyright 2015 Toru Nagashima. All rights reserved.
   */
  
  "use strict";
  
  //------------------------------------------------------------------------------
  // Rule Definition
  //------------------------------------------------------------------------------
  
  module.exports = function(context) {
      var stack = [];
  
      /**
       * Gets state of a given member name.
       * @param {string} name - A name of a member.
       * @param {boolean} isStatic - A flag which specifies that is a static member.
       * @returns {object} A state of a given member name.
       *   - retv.init {boolean} A flag which shows the name is declared as normal member.
       *   - retv.get {boolean} A flag which shows the name is declared as getter.
       *   - retv.set {boolean} A flag which shows the name is declared as setter.
       */
      function getState(name, isStatic) {
          var stateMap = stack[stack.length - 1];
          var key = "$" + name; // to avoid "__proto__".
  
          if (!stateMap[key]) {
              stateMap[key] = {
                  nonStatic: {init: false, get: false, set: false},
                  static: {init: false, get: false, set: false}
              };
          }
  
          return stateMap[key][isStatic ? "static" : "nonStatic"];
      }
  
      return {
          // Initializes the stack of state of member declarations.
          "Program": function() {
              stack = [];
          },
  
          // Initializes state of member declarations for the class.
          "ClassBody": function() {
              stack.push(Object.create(null));
          },
  
          // Disposes the state for the class.
          "ClassBody:exit": function() {
              stack.pop();
          },
  
          // Reports the node if its name has been declared already.
          "MethodDefinition": function(node) {
              if (node.computed) {
                  return;
              }
  
              var name = node.key.name;
              var state = getState(name, node.static);
              var isDuplicate = false;
              if (node.kind === "get") {
                  isDuplicate = (state.init || state.get);
                  state.get = true;
              } else if (node.kind === "set") {
                  isDuplicate = (state.init || state.set);
                  state.set = true;
              } else {
                  isDuplicate = (state.init || state.get || state.set);
                  state.init = true;
              }
  
              if (isDuplicate) {
                  context.report(node, "Duplicate name \"{{name}}\".", {name: name});
              }
          }
      };
  };
  
  module.exports.schema = [];