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,98 +1,98 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Checks for unreachable code due to return, throws, break, and continue.
|
3
|
-
* @author Joel Feenstra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
//------------------------------------------------------------------------------
|
8
|
-
// Helpers
|
9
|
-
//------------------------------------------------------------------------------
|
10
|
-
|
11
|
-
|
12
|
-
function report(context, node, unreachableType) {
|
13
|
-
var keyword;
|
14
|
-
switch (unreachableType) {
|
15
|
-
case "BreakStatement":
|
16
|
-
keyword = "break";
|
17
|
-
break;
|
18
|
-
case "ContinueStatement":
|
19
|
-
keyword = "continue";
|
20
|
-
break;
|
21
|
-
case "ReturnStatement":
|
22
|
-
keyword = "return";
|
23
|
-
break;
|
24
|
-
case "ThrowStatement":
|
25
|
-
keyword = "throw";
|
26
|
-
break;
|
27
|
-
default:
|
28
|
-
return;
|
29
|
-
}
|
30
|
-
context.report(node, "Found unexpected statement after a {{type}}.", { type: keyword });
|
31
|
-
}
|
32
|
-
|
33
|
-
|
34
|
-
//------------------------------------------------------------------------------
|
35
|
-
// Rule Definition
|
36
|
-
//------------------------------------------------------------------------------
|
37
|
-
|
38
|
-
module.exports = function(context) {
|
39
|
-
|
40
|
-
/**
|
41
|
-
* Checks if a node is an exception for no-unreachable because of variable/function hoisting
|
42
|
-
* @param {ASTNode} node The AST node to check.
|
43
|
-
* @returns {boolean} if the node doesn't trigger unreachable
|
44
|
-
* @private
|
45
|
-
*/
|
46
|
-
function isUnreachableAllowed(node) {
|
47
|
-
return node.type === "FunctionDeclaration" ||
|
48
|
-
node.type === "VariableDeclaration" &&
|
49
|
-
node.declarations.every(function(declaration) {
|
50
|
-
return declaration.type === "VariableDeclarator" && declaration.init === null;
|
51
|
-
});
|
52
|
-
}
|
53
|
-
|
54
|
-
/*
|
55
|
-
* Verifies that the given node is the last node or followed exclusively by
|
56
|
-
* hoisted declarations
|
57
|
-
* @param {ASTNode} node Node that should be the last node
|
58
|
-
* @returns {void}
|
59
|
-
* @private
|
60
|
-
*/
|
61
|
-
function checkNode(node) {
|
62
|
-
var parent = context.getAncestors().pop();
|
63
|
-
var field, i, sibling;
|
64
|
-
|
65
|
-
switch (parent.type) {
|
66
|
-
case "SwitchCase":
|
67
|
-
field = "consequent";
|
68
|
-
break;
|
69
|
-
case "Program":
|
70
|
-
case "BlockStatement":
|
71
|
-
field = "body";
|
72
|
-
break;
|
73
|
-
default:
|
74
|
-
return;
|
75
|
-
}
|
76
|
-
|
77
|
-
for (i = parent[field].length - 1; i >= 0; i--) {
|
78
|
-
sibling = parent[field][i];
|
79
|
-
if (sibling === node) {
|
80
|
-
return; // Found the last reachable statement, all done
|
81
|
-
}
|
82
|
-
|
83
|
-
if (!isUnreachableAllowed(sibling)) {
|
84
|
-
report(context, sibling, node.type);
|
85
|
-
}
|
86
|
-
}
|
87
|
-
}
|
88
|
-
|
89
|
-
return {
|
90
|
-
"ReturnStatement": checkNode,
|
91
|
-
"ThrowStatement": checkNode,
|
92
|
-
"ContinueStatement": checkNode,
|
93
|
-
"BreakStatement": checkNode
|
94
|
-
};
|
95
|
-
|
96
|
-
};
|
97
|
-
|
98
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Checks for unreachable code due to return, throws, break, and continue.
|
3
|
+
* @author Joel Feenstra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
//------------------------------------------------------------------------------
|
8
|
+
// Helpers
|
9
|
+
//------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
|
12
|
+
function report(context, node, unreachableType) {
|
13
|
+
var keyword;
|
14
|
+
switch (unreachableType) {
|
15
|
+
case "BreakStatement":
|
16
|
+
keyword = "break";
|
17
|
+
break;
|
18
|
+
case "ContinueStatement":
|
19
|
+
keyword = "continue";
|
20
|
+
break;
|
21
|
+
case "ReturnStatement":
|
22
|
+
keyword = "return";
|
23
|
+
break;
|
24
|
+
case "ThrowStatement":
|
25
|
+
keyword = "throw";
|
26
|
+
break;
|
27
|
+
default:
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
context.report(node, "Found unexpected statement after a {{type}}.", { type: keyword });
|
31
|
+
}
|
32
|
+
|
33
|
+
|
34
|
+
//------------------------------------------------------------------------------
|
35
|
+
// Rule Definition
|
36
|
+
//------------------------------------------------------------------------------
|
37
|
+
|
38
|
+
module.exports = function(context) {
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Checks if a node is an exception for no-unreachable because of variable/function hoisting
|
42
|
+
* @param {ASTNode} node The AST node to check.
|
43
|
+
* @returns {boolean} if the node doesn't trigger unreachable
|
44
|
+
* @private
|
45
|
+
*/
|
46
|
+
function isUnreachableAllowed(node) {
|
47
|
+
return node.type === "FunctionDeclaration" ||
|
48
|
+
node.type === "VariableDeclaration" &&
|
49
|
+
node.declarations.every(function(declaration) {
|
50
|
+
return declaration.type === "VariableDeclarator" && declaration.init === null;
|
51
|
+
});
|
52
|
+
}
|
53
|
+
|
54
|
+
/*
|
55
|
+
* Verifies that the given node is the last node or followed exclusively by
|
56
|
+
* hoisted declarations
|
57
|
+
* @param {ASTNode} node Node that should be the last node
|
58
|
+
* @returns {void}
|
59
|
+
* @private
|
60
|
+
*/
|
61
|
+
function checkNode(node) {
|
62
|
+
var parent = context.getAncestors().pop();
|
63
|
+
var field, i, sibling;
|
64
|
+
|
65
|
+
switch (parent.type) {
|
66
|
+
case "SwitchCase":
|
67
|
+
field = "consequent";
|
68
|
+
break;
|
69
|
+
case "Program":
|
70
|
+
case "BlockStatement":
|
71
|
+
field = "body";
|
72
|
+
break;
|
73
|
+
default:
|
74
|
+
return;
|
75
|
+
}
|
76
|
+
|
77
|
+
for (i = parent[field].length - 1; i >= 0; i--) {
|
78
|
+
sibling = parent[field][i];
|
79
|
+
if (sibling === node) {
|
80
|
+
return; // Found the last reachable statement, all done
|
81
|
+
}
|
82
|
+
|
83
|
+
if (!isUnreachableAllowed(sibling)) {
|
84
|
+
report(context, sibling, node.type);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
return {
|
90
|
+
"ReturnStatement": checkNode,
|
91
|
+
"ThrowStatement": checkNode,
|
92
|
+
"ContinueStatement": checkNode,
|
93
|
+
"BreakStatement": checkNode
|
94
|
+
};
|
95
|
+
|
96
|
+
};
|
97
|
+
|
98
|
+
module.exports.schema = [];
|
@@ -1,76 +1,76 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview Flag expressions in statement position that do not side effect
|
3
|
-
* @author Michael Ficarra
|
4
|
-
* @copyright 2013 Michael Ficarra. All rights reserved.
|
5
|
-
*/
|
6
|
-
"use strict";
|
7
|
-
|
8
|
-
//------------------------------------------------------------------------------
|
9
|
-
// Rule Definition
|
10
|
-
//------------------------------------------------------------------------------
|
11
|
-
|
12
|
-
module.exports = function(context) {
|
13
|
-
|
14
|
-
/**
|
15
|
-
* @param {ASTNode} node - any node
|
16
|
-
* @returns {Boolean} whether the given node structurally represents a directive
|
17
|
-
*/
|
18
|
-
function looksLikeDirective(node) {
|
19
|
-
return node.type === "ExpressionStatement" &&
|
20
|
-
node.expression.type === "Literal" && typeof node.expression.value === "string";
|
21
|
-
}
|
22
|
-
|
23
|
-
/**
|
24
|
-
* @param {Function} predicate - ([a] -> Boolean) the function used to make the determination
|
25
|
-
* @param {a[]} list - the input list
|
26
|
-
* @returns {a[]} the leading sequence of members in the given list that pass the given predicate
|
27
|
-
*/
|
28
|
-
function takeWhile(predicate, list) {
|
29
|
-
for (var i = 0, l = list.length; i < l; ++i) {
|
30
|
-
if (!predicate(list[i])) {
|
31
|
-
break;
|
32
|
-
}
|
33
|
-
}
|
34
|
-
return [].slice.call(list, 0, i);
|
35
|
-
}
|
36
|
-
|
37
|
-
/**
|
38
|
-
* @param {ASTNode} node - a Program or BlockStatement node
|
39
|
-
* @returns {ASTNode[]} the leading sequence of directive nodes in the given node's body
|
40
|
-
*/
|
41
|
-
function directives(node) {
|
42
|
-
return takeWhile(looksLikeDirective, node.body);
|
43
|
-
}
|
44
|
-
|
45
|
-
/**
|
46
|
-
* @param {ASTNode} node - any node
|
47
|
-
* @param {ASTNode[]} ancestors - the given node's ancestors
|
48
|
-
* @returns {Boolean} whether the given node is considered a directive in its current position
|
49
|
-
*/
|
50
|
-
function isDirective(node, ancestors) {
|
51
|
-
var parent = ancestors[ancestors.length - 1],
|
52
|
-
grandparent = ancestors[ancestors.length - 2];
|
53
|
-
return (parent.type === "Program" || parent.type === "BlockStatement" &&
|
54
|
-
(/Function/.test(grandparent.type))) &&
|
55
|
-
directives(parent).indexOf(node) >= 0;
|
56
|
-
}
|
57
|
-
|
58
|
-
return {
|
59
|
-
"ExpressionStatement": function(node) {
|
60
|
-
|
61
|
-
var type = node.expression.type,
|
62
|
-
ancestors = context.getAncestors();
|
63
|
-
|
64
|
-
if (
|
65
|
-
!/^(?:Assignment|Call|New|Update|Yield)Expression$/.test(type) &&
|
66
|
-
(type !== "UnaryExpression" || ["delete", "void"].indexOf(node.expression.operator) < 0) &&
|
67
|
-
!isDirective(node, ancestors)
|
68
|
-
) {
|
69
|
-
context.report(node, "Expected an assignment or function call and instead saw an expression.");
|
70
|
-
}
|
71
|
-
}
|
72
|
-
};
|
73
|
-
|
74
|
-
};
|
75
|
-
|
76
|
-
module.exports.schema = [];
|
1
|
+
/**
|
2
|
+
* @fileoverview Flag expressions in statement position that do not side effect
|
3
|
+
* @author Michael Ficarra
|
4
|
+
* @copyright 2013 Michael Ficarra. All rights reserved.
|
5
|
+
*/
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
//------------------------------------------------------------------------------
|
9
|
+
// Rule Definition
|
10
|
+
//------------------------------------------------------------------------------
|
11
|
+
|
12
|
+
module.exports = function(context) {
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @param {ASTNode} node - any node
|
16
|
+
* @returns {Boolean} whether the given node structurally represents a directive
|
17
|
+
*/
|
18
|
+
function looksLikeDirective(node) {
|
19
|
+
return node.type === "ExpressionStatement" &&
|
20
|
+
node.expression.type === "Literal" && typeof node.expression.value === "string";
|
21
|
+
}
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @param {Function} predicate - ([a] -> Boolean) the function used to make the determination
|
25
|
+
* @param {a[]} list - the input list
|
26
|
+
* @returns {a[]} the leading sequence of members in the given list that pass the given predicate
|
27
|
+
*/
|
28
|
+
function takeWhile(predicate, list) {
|
29
|
+
for (var i = 0, l = list.length; i < l; ++i) {
|
30
|
+
if (!predicate(list[i])) {
|
31
|
+
break;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
return [].slice.call(list, 0, i);
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
* @param {ASTNode} node - a Program or BlockStatement node
|
39
|
+
* @returns {ASTNode[]} the leading sequence of directive nodes in the given node's body
|
40
|
+
*/
|
41
|
+
function directives(node) {
|
42
|
+
return takeWhile(looksLikeDirective, node.body);
|
43
|
+
}
|
44
|
+
|
45
|
+
/**
|
46
|
+
* @param {ASTNode} node - any node
|
47
|
+
* @param {ASTNode[]} ancestors - the given node's ancestors
|
48
|
+
* @returns {Boolean} whether the given node is considered a directive in its current position
|
49
|
+
*/
|
50
|
+
function isDirective(node, ancestors) {
|
51
|
+
var parent = ancestors[ancestors.length - 1],
|
52
|
+
grandparent = ancestors[ancestors.length - 2];
|
53
|
+
return (parent.type === "Program" || parent.type === "BlockStatement" &&
|
54
|
+
(/Function/.test(grandparent.type))) &&
|
55
|
+
directives(parent).indexOf(node) >= 0;
|
56
|
+
}
|
57
|
+
|
58
|
+
return {
|
59
|
+
"ExpressionStatement": function(node) {
|
60
|
+
|
61
|
+
var type = node.expression.type,
|
62
|
+
ancestors = context.getAncestors();
|
63
|
+
|
64
|
+
if (
|
65
|
+
!/^(?:Assignment|Call|New|Update|Yield)Expression$/.test(type) &&
|
66
|
+
(type !== "UnaryExpression" || ["delete", "void"].indexOf(node.expression.operator) < 0) &&
|
67
|
+
!isDirective(node, ancestors)
|
68
|
+
) {
|
69
|
+
context.report(node, "Expected an assignment or function call and instead saw an expression.");
|
70
|
+
}
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
};
|
75
|
+
|
76
|
+
module.exports.schema = [];
|