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.
- package/LICENSE +20 -20
- package/README.md +111 -95
- package/bin/eslint.js +41 -41
- package/conf/environments.js +87 -81
- package/conf/eslint.json +186 -179
- package/lib/api.js +13 -12
- package/lib/cli-engine.js +441 -451
- package/lib/cli.js +196 -196
- package/lib/config-initializer.js +145 -145
- package/lib/config-validator.js +110 -110
- package/lib/config.js +428 -416
- package/lib/eslint.js +1072 -1073
- package/lib/file-finder.js +167 -167
- package/lib/formatters/checkstyle.js +68 -68
- package/lib/formatters/compact.js +53 -53
- package/lib/formatters/jslint-xml.js +40 -40
- package/lib/formatters/junit.js +63 -63
- package/lib/formatters/stylish.js +90 -90
- package/lib/formatters/tap.js +86 -86
- package/lib/ignored-paths.js +137 -137
- package/lib/load-rules.js +39 -39
- package/lib/options.js +132 -126
- package/lib/rule-context.js +107 -107
- package/lib/rules/accessor-pairs.js +65 -65
- package/lib/rules/array-bracket-spacing.js +180 -0
- package/lib/rules/block-scoped-var.js +339 -320
- package/lib/rules/brace-style.js +228 -228
- package/lib/rules/camelcase.js +111 -111
- package/lib/rules/comma-dangle.js +67 -64
- package/lib/rules/comma-spacing.js +191 -191
- package/lib/rules/comma-style.js +195 -195
- package/lib/rules/complexity.js +94 -94
- package/lib/rules/computed-property-spacing.js +144 -0
- package/lib/rules/consistent-return.js +75 -75
- package/lib/rules/consistent-this.js +119 -119
- package/lib/rules/constructor-super.js +108 -0
- package/lib/rules/curly.js +109 -109
- package/lib/rules/default-case.js +66 -66
- package/lib/rules/dot-location.js +63 -63
- package/lib/rules/dot-notation.js +119 -119
- package/lib/rules/eol-last.js +38 -38
- package/lib/rules/eqeqeq.js +96 -96
- package/lib/rules/func-names.js +45 -45
- package/lib/rules/func-style.js +49 -49
- package/lib/rules/generator-star-spacing.js +104 -87
- package/lib/rules/generator-star.js +76 -76
- package/lib/rules/global-strict.js +49 -49
- package/lib/rules/guard-for-in.js +32 -32
- package/lib/rules/handle-callback-err.js +81 -124
- package/lib/rules/indent.js +486 -486
- package/lib/rules/key-spacing.js +325 -325
- package/lib/rules/linebreak-style.js +44 -44
- package/lib/rules/lines-around-comment.js +228 -160
- package/lib/rules/max-depth.js +89 -89
- package/lib/rules/max-len.js +76 -76
- package/lib/rules/max-nested-callbacks.js +73 -73
- package/lib/rules/max-params.js +45 -45
- package/lib/rules/max-statements.js +61 -61
- package/lib/rules/new-cap.js +224 -224
- package/lib/rules/new-parens.js +29 -29
- package/lib/rules/newline-after-var.js +127 -127
- package/lib/rules/no-alert.js +153 -153
- package/lib/rules/no-array-constructor.js +31 -31
- package/lib/rules/no-bitwise.js +57 -57
- package/lib/rules/no-caller.js +29 -29
- package/lib/rules/no-catch-shadow.js +52 -52
- package/lib/rules/no-comma-dangle.js +45 -45
- package/lib/rules/no-cond-assign.js +123 -123
- package/lib/rules/no-console.js +27 -27
- package/lib/rules/no-constant-condition.js +73 -73
- package/lib/rules/no-continue.js +23 -23
- package/lib/rules/no-control-regex.js +58 -58
- package/lib/rules/no-debugger.js +22 -22
- package/lib/rules/no-delete-var.js +25 -25
- package/lib/rules/no-div-regex.js +27 -27
- package/lib/rules/no-dupe-args.js +89 -85
- package/lib/rules/no-dupe-keys.js +43 -43
- package/lib/rules/no-duplicate-case.js +67 -67
- package/lib/rules/no-else-return.js +125 -125
- package/lib/rules/no-empty-character-class.js +43 -43
- package/lib/rules/no-empty-class.js +45 -45
- package/lib/rules/no-empty-label.js +27 -27
- package/lib/rules/no-empty.js +49 -49
- package/lib/rules/no-eq-null.js +29 -29
- package/lib/rules/no-eval.js +26 -26
- package/lib/rules/no-ex-assign.js +42 -42
- package/lib/rules/no-extend-native.js +103 -103
- package/lib/rules/no-extra-bind.js +81 -81
- package/lib/rules/no-extra-boolean-cast.js +71 -71
- package/lib/rules/no-extra-parens.js +368 -355
- package/lib/rules/no-extra-semi.js +70 -23
- package/lib/rules/no-extra-strict.js +86 -86
- package/lib/rules/no-fallthrough.js +97 -97
- package/lib/rules/no-floating-decimal.js +30 -30
- package/lib/rules/no-func-assign.js +83 -83
- package/lib/rules/no-implied-eval.js +76 -76
- package/lib/rules/no-inline-comments.js +49 -49
- package/lib/rules/no-inner-declarations.js +78 -78
- package/lib/rules/no-invalid-regexp.js +53 -53
- package/lib/rules/no-irregular-whitespace.js +135 -135
- package/lib/rules/no-iterator.js +28 -28
- package/lib/rules/no-label-var.js +64 -64
- package/lib/rules/no-labels.js +44 -44
- package/lib/rules/no-lone-blocks.js +106 -27
- package/lib/rules/no-lonely-if.js +30 -30
- package/lib/rules/no-loop-func.js +58 -58
- package/lib/rules/no-mixed-requires.js +165 -165
- package/lib/rules/no-mixed-spaces-and-tabs.js +74 -74
- package/lib/rules/no-multi-spaces.js +119 -119
- package/lib/rules/no-multi-str.js +43 -43
- package/lib/rules/no-multiple-empty-lines.js +98 -98
- package/lib/rules/no-native-reassign.js +62 -62
- package/lib/rules/no-negated-in-lhs.js +25 -25
- package/lib/rules/no-nested-ternary.js +24 -24
- package/lib/rules/no-new-func.js +25 -25
- package/lib/rules/no-new-object.js +25 -25
- package/lib/rules/no-new-require.js +25 -25
- package/lib/rules/no-new-wrappers.js +26 -26
- package/lib/rules/no-new.js +27 -27
- package/lib/rules/no-obj-calls.js +28 -28
- package/lib/rules/no-octal-escape.js +39 -39
- package/lib/rules/no-octal.js +25 -25
- package/lib/rules/no-param-reassign.js +87 -87
- package/lib/rules/no-path-concat.js +39 -39
- package/lib/rules/no-plusplus.js +24 -24
- package/lib/rules/no-process-env.js +30 -30
- package/lib/rules/no-process-exit.js +33 -33
- package/lib/rules/no-proto.js +28 -28
- package/lib/rules/no-redeclare.js +68 -68
- package/lib/rules/no-regex-spaces.js +35 -35
- package/lib/rules/no-reserved-keys.js +56 -56
- package/lib/rules/no-restricted-modules.js +85 -85
- package/lib/rules/no-return-assign.js +53 -24
- package/lib/rules/no-script-url.js +34 -34
- package/lib/rules/no-self-compare.js +29 -29
- package/lib/rules/no-sequences.js +94 -94
- package/lib/rules/no-shadow-restricted-names.js +51 -51
- package/lib/rules/no-shadow.js +181 -136
- package/lib/rules/no-space-before-semi.js +98 -98
- package/lib/rules/no-spaced-func.js +37 -37
- package/lib/rules/no-sparse-arrays.js +33 -33
- package/lib/rules/no-sync.js +30 -30
- package/lib/rules/no-ternary.js +24 -24
- package/lib/rules/no-this-before-super.js +144 -0
- package/lib/rules/no-throw-literal.js +33 -33
- package/lib/rules/no-trailing-spaces.js +74 -63
- package/lib/rules/no-undef-init.js +28 -28
- package/lib/rules/no-undef.js +92 -92
- package/lib/rules/no-undefined.js +27 -27
- package/lib/rules/no-underscore-dangle.js +73 -73
- package/lib/rules/no-unexpected-multiline.js +58 -0
- package/lib/rules/no-unneeded-ternary.js +48 -48
- package/lib/rules/no-unreachable.js +98 -98
- package/lib/rules/no-unused-expressions.js +76 -76
- package/lib/rules/no-unused-vars.js +252 -250
- package/lib/rules/no-use-before-define.js +105 -105
- package/lib/rules/no-var.js +26 -26
- package/lib/rules/no-void.js +28 -28
- package/lib/rules/no-warning-comments.js +102 -102
- package/lib/rules/no-with.js +22 -22
- package/lib/rules/no-wrap-func.js +65 -65
- package/lib/rules/object-curly-spacing.js +231 -206
- package/lib/rules/object-shorthand.js +74 -73
- package/lib/rules/one-var.js +311 -304
- package/lib/rules/operator-assignment.js +118 -118
- package/lib/rules/operator-linebreak.js +114 -114
- package/lib/rules/padded-blocks.js +98 -98
- package/lib/rules/prefer-const.js +91 -0
- package/lib/rules/quote-props.js +72 -72
- package/lib/rules/quotes.js +92 -92
- package/lib/rules/radix.js +41 -41
- package/lib/rules/semi-spacing.js +167 -167
- package/lib/rules/semi.js +136 -136
- package/lib/rules/sort-vars.js +49 -49
- package/lib/rules/space-after-function-name.js +49 -49
- package/lib/rules/space-after-keywords.js +82 -82
- package/lib/rules/space-before-blocks.js +91 -91
- package/lib/rules/space-before-function-paren.js +139 -139
- package/lib/rules/space-before-function-parentheses.js +139 -139
- package/lib/rules/space-in-brackets.js +305 -305
- package/lib/rules/space-in-parens.js +281 -281
- package/lib/rules/space-infix-ops.js +106 -106
- package/lib/rules/space-return-throw-case.js +38 -38
- package/lib/rules/space-unary-ops.js +124 -133
- package/lib/rules/spaced-comment.js +143 -0
- package/lib/rules/spaced-line-comment.js +89 -89
- package/lib/rules/strict.js +242 -242
- package/lib/rules/use-isnan.js +26 -26
- package/lib/rules/valid-jsdoc.js +215 -215
- package/lib/rules/valid-typeof.js +42 -42
- package/lib/rules/vars-on-top.js +115 -115
- package/lib/rules/wrap-iife.js +48 -48
- package/lib/rules/wrap-regex.js +38 -38
- package/lib/rules/yoda.js +242 -225
- package/lib/rules.js +88 -88
- package/lib/timing.js +109 -109
- package/lib/token-store.js +201 -201
- package/lib/util/traverse.js +105 -105
- package/lib/util.js +125 -85
- package/package.json +6 -6
- 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
|
-
|
48
|
-
if (
|
49
|
-
|
50
|
-
}
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
return
|
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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
*
|
93
|
-
* @
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
return def.
|
100
|
-
})
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
*
|
112
|
-
*
|
113
|
-
*
|
114
|
-
* @
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
*
|
140
|
-
* @param {
|
141
|
-
* @
|
142
|
-
* @
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
var
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
//--------------------------------------------------------------------------
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
var
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
context.report(
|
224
|
-
}
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
};
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
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
|
+
];
|