eslint 0.22.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +111 -95
  3. package/bin/eslint.js +41 -41
  4. package/conf/environments.js +87 -81
  5. package/conf/eslint.json +186 -179
  6. package/lib/api.js +13 -12
  7. package/lib/cli-engine.js +441 -451
  8. package/lib/cli.js +196 -196
  9. package/lib/config-initializer.js +145 -145
  10. package/lib/config-validator.js +110 -110
  11. package/lib/config.js +428 -416
  12. package/lib/eslint.js +1072 -1073
  13. package/lib/file-finder.js +167 -167
  14. package/lib/formatters/checkstyle.js +68 -68
  15. package/lib/formatters/compact.js +53 -53
  16. package/lib/formatters/jslint-xml.js +40 -40
  17. package/lib/formatters/junit.js +63 -63
  18. package/lib/formatters/stylish.js +90 -90
  19. package/lib/formatters/tap.js +86 -86
  20. package/lib/ignored-paths.js +137 -137
  21. package/lib/load-rules.js +39 -39
  22. package/lib/options.js +132 -126
  23. package/lib/rule-context.js +107 -107
  24. package/lib/rules/accessor-pairs.js +65 -65
  25. package/lib/rules/array-bracket-spacing.js +180 -0
  26. package/lib/rules/block-scoped-var.js +339 -320
  27. package/lib/rules/brace-style.js +228 -228
  28. package/lib/rules/camelcase.js +111 -111
  29. package/lib/rules/comma-dangle.js +67 -64
  30. package/lib/rules/comma-spacing.js +191 -191
  31. package/lib/rules/comma-style.js +195 -195
  32. package/lib/rules/complexity.js +94 -94
  33. package/lib/rules/computed-property-spacing.js +144 -0
  34. package/lib/rules/consistent-return.js +75 -75
  35. package/lib/rules/consistent-this.js +119 -119
  36. package/lib/rules/constructor-super.js +108 -0
  37. package/lib/rules/curly.js +109 -109
  38. package/lib/rules/default-case.js +66 -66
  39. package/lib/rules/dot-location.js +63 -63
  40. package/lib/rules/dot-notation.js +119 -119
  41. package/lib/rules/eol-last.js +38 -38
  42. package/lib/rules/eqeqeq.js +96 -96
  43. package/lib/rules/func-names.js +45 -45
  44. package/lib/rules/func-style.js +49 -49
  45. package/lib/rules/generator-star-spacing.js +104 -87
  46. package/lib/rules/generator-star.js +76 -76
  47. package/lib/rules/global-strict.js +49 -49
  48. package/lib/rules/guard-for-in.js +32 -32
  49. package/lib/rules/handle-callback-err.js +81 -124
  50. package/lib/rules/indent.js +486 -486
  51. package/lib/rules/key-spacing.js +325 -325
  52. package/lib/rules/linebreak-style.js +44 -44
  53. package/lib/rules/lines-around-comment.js +228 -160
  54. package/lib/rules/max-depth.js +89 -89
  55. package/lib/rules/max-len.js +76 -76
  56. package/lib/rules/max-nested-callbacks.js +73 -73
  57. package/lib/rules/max-params.js +45 -45
  58. package/lib/rules/max-statements.js +61 -61
  59. package/lib/rules/new-cap.js +224 -224
  60. package/lib/rules/new-parens.js +29 -29
  61. package/lib/rules/newline-after-var.js +127 -127
  62. package/lib/rules/no-alert.js +153 -153
  63. package/lib/rules/no-array-constructor.js +31 -31
  64. package/lib/rules/no-bitwise.js +57 -57
  65. package/lib/rules/no-caller.js +29 -29
  66. package/lib/rules/no-catch-shadow.js +52 -52
  67. package/lib/rules/no-comma-dangle.js +45 -45
  68. package/lib/rules/no-cond-assign.js +123 -123
  69. package/lib/rules/no-console.js +27 -27
  70. package/lib/rules/no-constant-condition.js +73 -73
  71. package/lib/rules/no-continue.js +23 -23
  72. package/lib/rules/no-control-regex.js +58 -58
  73. package/lib/rules/no-debugger.js +22 -22
  74. package/lib/rules/no-delete-var.js +25 -25
  75. package/lib/rules/no-div-regex.js +27 -27
  76. package/lib/rules/no-dupe-args.js +89 -85
  77. package/lib/rules/no-dupe-keys.js +43 -43
  78. package/lib/rules/no-duplicate-case.js +67 -67
  79. package/lib/rules/no-else-return.js +125 -125
  80. package/lib/rules/no-empty-character-class.js +43 -43
  81. package/lib/rules/no-empty-class.js +45 -45
  82. package/lib/rules/no-empty-label.js +27 -27
  83. package/lib/rules/no-empty.js +49 -49
  84. package/lib/rules/no-eq-null.js +29 -29
  85. package/lib/rules/no-eval.js +26 -26
  86. package/lib/rules/no-ex-assign.js +42 -42
  87. package/lib/rules/no-extend-native.js +103 -103
  88. package/lib/rules/no-extra-bind.js +81 -81
  89. package/lib/rules/no-extra-boolean-cast.js +71 -71
  90. package/lib/rules/no-extra-parens.js +368 -355
  91. package/lib/rules/no-extra-semi.js +70 -23
  92. package/lib/rules/no-extra-strict.js +86 -86
  93. package/lib/rules/no-fallthrough.js +97 -97
  94. package/lib/rules/no-floating-decimal.js +30 -30
  95. package/lib/rules/no-func-assign.js +83 -83
  96. package/lib/rules/no-implied-eval.js +76 -76
  97. package/lib/rules/no-inline-comments.js +49 -49
  98. package/lib/rules/no-inner-declarations.js +78 -78
  99. package/lib/rules/no-invalid-regexp.js +53 -53
  100. package/lib/rules/no-irregular-whitespace.js +135 -135
  101. package/lib/rules/no-iterator.js +28 -28
  102. package/lib/rules/no-label-var.js +64 -64
  103. package/lib/rules/no-labels.js +44 -44
  104. package/lib/rules/no-lone-blocks.js +106 -27
  105. package/lib/rules/no-lonely-if.js +30 -30
  106. package/lib/rules/no-loop-func.js +58 -58
  107. package/lib/rules/no-mixed-requires.js +165 -165
  108. package/lib/rules/no-mixed-spaces-and-tabs.js +74 -74
  109. package/lib/rules/no-multi-spaces.js +119 -119
  110. package/lib/rules/no-multi-str.js +43 -43
  111. package/lib/rules/no-multiple-empty-lines.js +98 -98
  112. package/lib/rules/no-native-reassign.js +62 -62
  113. package/lib/rules/no-negated-in-lhs.js +25 -25
  114. package/lib/rules/no-nested-ternary.js +24 -24
  115. package/lib/rules/no-new-func.js +25 -25
  116. package/lib/rules/no-new-object.js +25 -25
  117. package/lib/rules/no-new-require.js +25 -25
  118. package/lib/rules/no-new-wrappers.js +26 -26
  119. package/lib/rules/no-new.js +27 -27
  120. package/lib/rules/no-obj-calls.js +28 -28
  121. package/lib/rules/no-octal-escape.js +39 -39
  122. package/lib/rules/no-octal.js +25 -25
  123. package/lib/rules/no-param-reassign.js +87 -87
  124. package/lib/rules/no-path-concat.js +39 -39
  125. package/lib/rules/no-plusplus.js +24 -24
  126. package/lib/rules/no-process-env.js +30 -30
  127. package/lib/rules/no-process-exit.js +33 -33
  128. package/lib/rules/no-proto.js +28 -28
  129. package/lib/rules/no-redeclare.js +68 -68
  130. package/lib/rules/no-regex-spaces.js +35 -35
  131. package/lib/rules/no-reserved-keys.js +56 -56
  132. package/lib/rules/no-restricted-modules.js +85 -85
  133. package/lib/rules/no-return-assign.js +53 -24
  134. package/lib/rules/no-script-url.js +34 -34
  135. package/lib/rules/no-self-compare.js +29 -29
  136. package/lib/rules/no-sequences.js +94 -94
  137. package/lib/rules/no-shadow-restricted-names.js +51 -51
  138. package/lib/rules/no-shadow.js +181 -136
  139. package/lib/rules/no-space-before-semi.js +98 -98
  140. package/lib/rules/no-spaced-func.js +37 -37
  141. package/lib/rules/no-sparse-arrays.js +33 -33
  142. package/lib/rules/no-sync.js +30 -30
  143. package/lib/rules/no-ternary.js +24 -24
  144. package/lib/rules/no-this-before-super.js +144 -0
  145. package/lib/rules/no-throw-literal.js +33 -33
  146. package/lib/rules/no-trailing-spaces.js +74 -63
  147. package/lib/rules/no-undef-init.js +28 -28
  148. package/lib/rules/no-undef.js +92 -92
  149. package/lib/rules/no-undefined.js +27 -27
  150. package/lib/rules/no-underscore-dangle.js +73 -73
  151. package/lib/rules/no-unexpected-multiline.js +58 -0
  152. package/lib/rules/no-unneeded-ternary.js +48 -48
  153. package/lib/rules/no-unreachable.js +98 -98
  154. package/lib/rules/no-unused-expressions.js +76 -76
  155. package/lib/rules/no-unused-vars.js +252 -250
  156. package/lib/rules/no-use-before-define.js +105 -105
  157. package/lib/rules/no-var.js +26 -26
  158. package/lib/rules/no-void.js +28 -28
  159. package/lib/rules/no-warning-comments.js +102 -102
  160. package/lib/rules/no-with.js +22 -22
  161. package/lib/rules/no-wrap-func.js +65 -65
  162. package/lib/rules/object-curly-spacing.js +231 -206
  163. package/lib/rules/object-shorthand.js +74 -73
  164. package/lib/rules/one-var.js +311 -304
  165. package/lib/rules/operator-assignment.js +118 -118
  166. package/lib/rules/operator-linebreak.js +114 -114
  167. package/lib/rules/padded-blocks.js +98 -98
  168. package/lib/rules/prefer-const.js +91 -0
  169. package/lib/rules/quote-props.js +72 -72
  170. package/lib/rules/quotes.js +92 -92
  171. package/lib/rules/radix.js +41 -41
  172. package/lib/rules/semi-spacing.js +167 -167
  173. package/lib/rules/semi.js +136 -136
  174. package/lib/rules/sort-vars.js +49 -49
  175. package/lib/rules/space-after-function-name.js +49 -49
  176. package/lib/rules/space-after-keywords.js +82 -82
  177. package/lib/rules/space-before-blocks.js +91 -91
  178. package/lib/rules/space-before-function-paren.js +139 -139
  179. package/lib/rules/space-before-function-parentheses.js +139 -139
  180. package/lib/rules/space-in-brackets.js +305 -305
  181. package/lib/rules/space-in-parens.js +281 -281
  182. package/lib/rules/space-infix-ops.js +106 -106
  183. package/lib/rules/space-return-throw-case.js +38 -38
  184. package/lib/rules/space-unary-ops.js +124 -133
  185. package/lib/rules/spaced-comment.js +143 -0
  186. package/lib/rules/spaced-line-comment.js +89 -89
  187. package/lib/rules/strict.js +242 -242
  188. package/lib/rules/use-isnan.js +26 -26
  189. package/lib/rules/valid-jsdoc.js +215 -215
  190. package/lib/rules/valid-typeof.js +42 -42
  191. package/lib/rules/vars-on-top.js +115 -115
  192. package/lib/rules/wrap-iife.js +48 -48
  193. package/lib/rules/wrap-regex.js +38 -38
  194. package/lib/rules/yoda.js +242 -225
  195. package/lib/rules.js +88 -88
  196. package/lib/timing.js +109 -109
  197. package/lib/token-store.js +201 -201
  198. package/lib/util/traverse.js +105 -105
  199. package/lib/util.js +125 -85
  200. package/package.json +6 -6
  201. package/CHANGELOG.md +0 -1638
@@ -1,250 +1,252 @@
1
- /**
2
- * @fileoverview Rule to flag declared but unused variables
3
- * @author Ilya Volodin
4
- */
5
-
6
- "use strict";
7
-
8
- //------------------------------------------------------------------------------
9
- // Rule Definition
10
- //------------------------------------------------------------------------------
11
-
12
- module.exports = function(context) {
13
-
14
- var MESSAGE = "{{name}} is defined but never used";
15
-
16
- var config = {
17
- vars: "all",
18
- args: "after-used"
19
- };
20
-
21
- if (context.options[0]) {
22
- if (typeof context.options[0] === "string") {
23
- config.vars = context.options[0];
24
- } else {
25
- config.vars = context.options[0].vars || config.vars;
26
- config.args = context.options[0].args || config.args;
27
- }
28
- }
29
-
30
- //--------------------------------------------------------------------------
31
- // Helpers
32
- //--------------------------------------------------------------------------
33
-
34
-
35
- /**
36
- * Determines if a given variable is being exported from a module.
37
- * @param {Variable} variable - EScope variable object.
38
- * @returns {boolean} True if the variable is exported, false if not.
39
- * @private
40
- */
41
- function isExported(variable) {
42
-
43
- var definition = variable.defs[0];
44
-
45
- if (definition) {
46
-
47
- definition = definition.node;
48
- if (definition.type === "VariableDeclarator") {
49
- definition = definition.parent;
50
- }
51
-
52
- return definition.parent.type.indexOf("Export") === 0;
53
- } else {
54
- return false;
55
- }
56
- }
57
-
58
- /**
59
- * Determines if a reference is a read operation.
60
- * @param {Reference} ref - An escope Reference
61
- * @returns {Boolean} whether the given reference represents a read operation
62
- * @private
63
- */
64
- function isReadRef(ref) {
65
- return ref.isRead();
66
- }
67
-
68
- /**
69
- * Determine if an identifier is referencing an enclosing function name.
70
- * @param {Reference} ref - The reference to check.
71
- * @param {ASTNode[]} nodes - The candidate function nodes.
72
- * @returns {boolean} True if it's a self-reference, false if not.
73
- * @private
74
- */
75
- function isSelfReference(ref, nodes) {
76
- var scope = ref.from;
77
-
78
- while (scope != null) {
79
- if (nodes.indexOf(scope.block) >= 0) {
80
- return true;
81
- }
82
-
83
- scope = scope.upper;
84
- }
85
-
86
- return false;
87
- }
88
-
89
- /**
90
- * Determines if the variable is used.
91
- * @param {Variable} variable - The variable to check.
92
- * @param {Reference[]} references - The variable references to check.
93
- * @returns {boolean} True if the variable is used
94
- */
95
- function isUsedVariable(variable, references) {
96
- var functionNodes = variable.defs.filter(function (def) {
97
- return def.type === "FunctionName";
98
- }).map(function (def) {
99
- return def.node;
100
- }),
101
- isFunctionDefinition = functionNodes.length > 0;
102
-
103
- return references.some(function (ref) {
104
- return isReadRef(ref) && !(isFunctionDefinition && isSelfReference(ref, functionNodes));
105
- });
106
- }
107
-
108
- /**
109
- * Gets unresolved references.
110
- * They contains var's, function's, and explicit global variable's.
111
- * If `config.vars` is not "all", returns empty map.
112
- * @param {Scope} scope - the global scope.
113
- * @returns {object} Unresolved references. Keys of the object is its variable name. Values of the object is an array of its references.
114
- * @private
115
- */
116
- function collectUnresolvedReferences(scope) {
117
- var unresolvedRefs = Object.create(null);
118
-
119
- if (config.vars === "all") {
120
- for (var i = 0, l = scope.through.length; i < l; ++i) {
121
- var ref = scope.through[i];
122
- var name = ref.identifier.name;
123
-
124
- if (isReadRef(ref)) {
125
- if (!unresolvedRefs[name]) {
126
- unresolvedRefs[name] = [];
127
- }
128
- unresolvedRefs[name].push(ref);
129
- }
130
- }
131
- }
132
-
133
- return unresolvedRefs;
134
- }
135
-
136
- /**
137
- * Gets an array of variables without read references.
138
- * @param {Scope} scope - an escope Scope object.
139
- * @param {object} unresolvedRefs - a map of each variable name and its references.
140
- * @param {Variable[]} unusedVars - an array that saving result.
141
- * @returns {Variable[]} unused variables of the scope and descendant scopes.
142
- * @private
143
- */
144
- function collectUnusedVariables(scope, unresolvedRefs, unusedVars) {
145
- var variables = scope.variables;
146
- var childScopes = scope.childScopes;
147
- var i, l;
148
-
149
- if (scope.type !== "TDZ" && (scope.type !== "global" || config.vars === "all")) {
150
- for (i = 0, l = variables.length; i < l; ++i) {
151
- var variable = variables[i];
152
-
153
- // skip a variable of class itself name in the class scope
154
- if (scope.type === "class" && scope.block.id === variable.identifiers[0]) {
155
- continue;
156
- }
157
- // skip function expression names
158
- if (scope.functionExpressionScope || variable.eslintUsed) {
159
- continue;
160
- }
161
- // skip implicit "arguments" variable
162
- if (scope.type === "function" && variable.name === "arguments" && variable.identifiers.length === 0) {
163
- continue;
164
- }
165
-
166
- // explicit global variables don't have definitions.
167
- var def = variable.defs[0];
168
- if (def != null) {
169
- var type = def.type;
170
-
171
- // skip catch variables
172
- if (type === "CatchClause") {
173
- continue;
174
- }
175
-
176
- // skip any setter argument
177
- if (type === "Parameter" && def.node.parent.type === "Property" && def.node.parent.kind === "set") {
178
- continue;
179
- }
180
-
181
- // if "args" option is "none", skip any parameter
182
- if (config.args === "none" && type === "Parameter") {
183
- continue;
184
- }
185
-
186
- // if "args" option is "after-used", skip all but the last parameter
187
- if (config.args === "after-used" && type === "Parameter" && def.index < def.node.params.length - 1) {
188
- continue;
189
- }
190
- }
191
-
192
- // On global, variables without let/const/class are unresolved.
193
- var references = (scope.type === "global" ? unresolvedRefs[variable.name] : null) || variable.references;
194
- if (!isUsedVariable(variable, references) && !isExported(variable)) {
195
- unusedVars.push(variable);
196
- }
197
- }
198
- }
199
-
200
- for (i = 0, l = childScopes.length; i < l; ++i) {
201
- collectUnusedVariables(childScopes[i], unresolvedRefs, unusedVars);
202
- }
203
-
204
- return unusedVars;
205
- }
206
-
207
- //--------------------------------------------------------------------------
208
- // Public
209
- //--------------------------------------------------------------------------
210
-
211
- return {
212
- "Program:exit": function(programNode) {
213
- var globalScope = context.getScope();
214
- var unresolvedRefs = collectUnresolvedReferences(globalScope);
215
- var unusedVars = collectUnusedVariables(globalScope, unresolvedRefs, []);
216
-
217
- for (var i = 0, l = unusedVars.length; i < l; ++i) {
218
- var unusedVar = unusedVars[i];
219
-
220
- if (unusedVar.eslintExplicitGlobal) {
221
- context.report(programNode, MESSAGE, unusedVar);
222
- } else if (unusedVar.defs.length > 0) {
223
- context.report(unusedVar.identifiers[0], MESSAGE, unusedVar);
224
- }
225
- }
226
- }
227
- };
228
-
229
- };
230
-
231
- module.exports.schema = [
232
- {
233
- "oneOf": [
234
- {
235
- "enum": ["all", "local"]
236
- },
237
- {
238
- "type": "object",
239
- "properties": {
240
- "vars": {
241
- "enum": ["all", "local"]
242
- },
243
- "args": {
244
- "enum": ["all", "after-used", "none"]
245
- }
246
- }
247
- }
248
- ]
249
- }
250
- ];
1
+ /**
2
+ * @fileoverview Rule to flag declared but unused variables
3
+ * @author Ilya Volodin
4
+ */
5
+
6
+ "use strict";
7
+
8
+ //------------------------------------------------------------------------------
9
+ // Rule Definition
10
+ //------------------------------------------------------------------------------
11
+
12
+ module.exports = function(context) {
13
+
14
+ var MESSAGE = "{{name}} is defined but never used";
15
+
16
+ var config = {
17
+ vars: "all",
18
+ args: "after-used"
19
+ };
20
+
21
+ if (context.options[0]) {
22
+ if (typeof context.options[0] === "string") {
23
+ config.vars = context.options[0];
24
+ } else {
25
+ config.vars = context.options[0].vars || config.vars;
26
+ config.args = context.options[0].args || config.args;
27
+ }
28
+ }
29
+
30
+ //--------------------------------------------------------------------------
31
+ // Helpers
32
+ //--------------------------------------------------------------------------
33
+
34
+
35
+ /**
36
+ * Determines if a given variable is being exported from a module.
37
+ * @param {Variable} variable - EScope variable object.
38
+ * @returns {boolean} True if the variable is exported, false if not.
39
+ * @private
40
+ */
41
+ function isExported(variable) {
42
+
43
+ var definition = variable.defs[0];
44
+
45
+ if (definition) {
46
+
47
+ var node = definition.node;
48
+ if (node.type === "VariableDeclarator") {
49
+ node = node.parent;
50
+ } else if (definition.type === "Parameter" && node.type === "FunctionDeclaration") {
51
+ return false;
52
+ }
53
+
54
+ return node.parent.type.indexOf("Export") === 0;
55
+ } else {
56
+ return false;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Determines if a reference is a read operation.
62
+ * @param {Reference} ref - An escope Reference
63
+ * @returns {Boolean} whether the given reference represents a read operation
64
+ * @private
65
+ */
66
+ function isReadRef(ref) {
67
+ return ref.isRead();
68
+ }
69
+
70
+ /**
71
+ * Determine if an identifier is referencing an enclosing function name.
72
+ * @param {Reference} ref - The reference to check.
73
+ * @param {ASTNode[]} nodes - The candidate function nodes.
74
+ * @returns {boolean} True if it's a self-reference, false if not.
75
+ * @private
76
+ */
77
+ function isSelfReference(ref, nodes) {
78
+ var scope = ref.from;
79
+
80
+ while (scope != null) {
81
+ if (nodes.indexOf(scope.block) >= 0) {
82
+ return true;
83
+ }
84
+
85
+ scope = scope.upper;
86
+ }
87
+
88
+ return false;
89
+ }
90
+
91
+ /**
92
+ * Determines if the variable is used.
93
+ * @param {Variable} variable - The variable to check.
94
+ * @param {Reference[]} references - The variable references to check.
95
+ * @returns {boolean} True if the variable is used
96
+ */
97
+ function isUsedVariable(variable, references) {
98
+ var functionNodes = variable.defs.filter(function (def) {
99
+ return def.type === "FunctionName";
100
+ }).map(function (def) {
101
+ return def.node;
102
+ }),
103
+ isFunctionDefinition = functionNodes.length > 0;
104
+
105
+ return references.some(function (ref) {
106
+ return isReadRef(ref) && !(isFunctionDefinition && isSelfReference(ref, functionNodes));
107
+ });
108
+ }
109
+
110
+ /**
111
+ * Gets unresolved references.
112
+ * They contains var's, function's, and explicit global variable's.
113
+ * If `config.vars` is not "all", returns empty map.
114
+ * @param {Scope} scope - the global scope.
115
+ * @returns {object} Unresolved references. Keys of the object is its variable name. Values of the object is an array of its references.
116
+ * @private
117
+ */
118
+ function collectUnresolvedReferences(scope) {
119
+ var unresolvedRefs = Object.create(null);
120
+
121
+ if (config.vars === "all") {
122
+ for (var i = 0, l = scope.through.length; i < l; ++i) {
123
+ var ref = scope.through[i];
124
+ var name = ref.identifier.name;
125
+
126
+ if (isReadRef(ref)) {
127
+ if (!unresolvedRefs[name]) {
128
+ unresolvedRefs[name] = [];
129
+ }
130
+ unresolvedRefs[name].push(ref);
131
+ }
132
+ }
133
+ }
134
+
135
+ return unresolvedRefs;
136
+ }
137
+
138
+ /**
139
+ * Gets an array of variables without read references.
140
+ * @param {Scope} scope - an escope Scope object.
141
+ * @param {object} unresolvedRefs - a map of each variable name and its references.
142
+ * @param {Variable[]} unusedVars - an array that saving result.
143
+ * @returns {Variable[]} unused variables of the scope and descendant scopes.
144
+ * @private
145
+ */
146
+ function collectUnusedVariables(scope, unresolvedRefs, unusedVars) {
147
+ var variables = scope.variables;
148
+ var childScopes = scope.childScopes;
149
+ var i, l;
150
+
151
+ if (scope.type !== "TDZ" && (scope.type !== "global" || config.vars === "all")) {
152
+ for (i = 0, l = variables.length; i < l; ++i) {
153
+ var variable = variables[i];
154
+
155
+ // skip a variable of class itself name in the class scope
156
+ if (scope.type === "class" && scope.block.id === variable.identifiers[0]) {
157
+ continue;
158
+ }
159
+ // skip function expression names
160
+ if (scope.functionExpressionScope || variable.eslintUsed) {
161
+ continue;
162
+ }
163
+ // skip implicit "arguments" variable
164
+ if (scope.type === "function" && variable.name === "arguments" && variable.identifiers.length === 0) {
165
+ continue;
166
+ }
167
+
168
+ // explicit global variables don't have definitions.
169
+ var def = variable.defs[0];
170
+ if (def != null) {
171
+ var type = def.type;
172
+
173
+ // skip catch variables
174
+ if (type === "CatchClause") {
175
+ continue;
176
+ }
177
+
178
+ // skip any setter argument
179
+ if (type === "Parameter" && def.node.parent.type === "Property" && def.node.parent.kind === "set") {
180
+ continue;
181
+ }
182
+
183
+ // if "args" option is "none", skip any parameter
184
+ if (config.args === "none" && type === "Parameter") {
185
+ continue;
186
+ }
187
+
188
+ // if "args" option is "after-used", skip all but the last parameter
189
+ if (config.args === "after-used" && type === "Parameter" && def.index < def.node.params.length - 1) {
190
+ continue;
191
+ }
192
+ }
193
+
194
+ // On global, variables without let/const/class are unresolved.
195
+ var references = (scope.type === "global" ? unresolvedRefs[variable.name] : null) || variable.references;
196
+ if (!isUsedVariable(variable, references) && !isExported(variable)) {
197
+ unusedVars.push(variable);
198
+ }
199
+ }
200
+ }
201
+
202
+ for (i = 0, l = childScopes.length; i < l; ++i) {
203
+ collectUnusedVariables(childScopes[i], unresolvedRefs, unusedVars);
204
+ }
205
+
206
+ return unusedVars;
207
+ }
208
+
209
+ //--------------------------------------------------------------------------
210
+ // Public
211
+ //--------------------------------------------------------------------------
212
+
213
+ return {
214
+ "Program:exit": function(programNode) {
215
+ var globalScope = context.getScope();
216
+ var unresolvedRefs = collectUnresolvedReferences(globalScope);
217
+ var unusedVars = collectUnusedVariables(globalScope, unresolvedRefs, []);
218
+
219
+ for (var i = 0, l = unusedVars.length; i < l; ++i) {
220
+ var unusedVar = unusedVars[i];
221
+
222
+ if (unusedVar.eslintExplicitGlobal) {
223
+ context.report(programNode, MESSAGE, unusedVar);
224
+ } else if (unusedVar.defs.length > 0) {
225
+ context.report(unusedVar.identifiers[0], MESSAGE, unusedVar);
226
+ }
227
+ }
228
+ }
229
+ };
230
+
231
+ };
232
+
233
+ module.exports.schema = [
234
+ {
235
+ "oneOf": [
236
+ {
237
+ "enum": ["all", "local"]
238
+ },
239
+ {
240
+ "type": "object",
241
+ "properties": {
242
+ "vars": {
243
+ "enum": ["all", "local"]
244
+ },
245
+ "args": {
246
+ "enum": ["all", "after-used", "none"]
247
+ }
248
+ }
249
+ }
250
+ ]
251
+ }
252
+ ];