]>
Commit | Line | Data |
---|---|---|
eb39fafa DC |
1 | /** |
2 | * @fileoverview Rule to flag when return statement contains assignment | |
3 | * @author Ilya Volodin | |
4 | */ | |
5 | "use strict"; | |
6 | ||
7 | //------------------------------------------------------------------------------ | |
8 | // Requirements | |
9 | //------------------------------------------------------------------------------ | |
10 | ||
11 | const astUtils = require("./utils/ast-utils"); | |
12 | ||
13 | //------------------------------------------------------------------------------ | |
14 | // Helpers | |
15 | //------------------------------------------------------------------------------ | |
16 | ||
17 | const SENTINEL_TYPE = /^(?:[a-zA-Z]+?Statement|ArrowFunctionExpression|FunctionExpression|ClassExpression)$/u; | |
18 | ||
19 | //------------------------------------------------------------------------------ | |
20 | // Rule Definition | |
21 | //------------------------------------------------------------------------------ | |
22 | ||
34eeec05 | 23 | /** @type {import('../shared/types').Rule} */ |
eb39fafa DC |
24 | module.exports = { |
25 | meta: { | |
26 | type: "suggestion", | |
27 | ||
28 | docs: { | |
8f9d1d4d | 29 | description: "Disallow assignment operators in `return` statements", |
eb39fafa | 30 | recommended: false, |
f2a92ac6 | 31 | url: "https://eslint.org/docs/latest/rules/no-return-assign" |
eb39fafa DC |
32 | }, |
33 | ||
34 | schema: [ | |
35 | { | |
36 | enum: ["except-parens", "always"] | |
37 | } | |
38 | ], | |
39 | ||
40 | messages: { | |
41 | returnAssignment: "Return statement should not contain assignment.", | |
42 | arrowAssignment: "Arrow function should not return assignment." | |
43 | } | |
44 | }, | |
45 | ||
46 | create(context) { | |
47 | const always = (context.options[0] || "except-parens") !== "except-parens"; | |
f2a92ac6 | 48 | const sourceCode = context.sourceCode; |
eb39fafa DC |
49 | |
50 | return { | |
51 | AssignmentExpression(node) { | |
52 | if (!always && astUtils.isParenthesised(sourceCode, node)) { | |
53 | return; | |
54 | } | |
55 | ||
56 | let currentChild = node; | |
57 | let parent = currentChild.parent; | |
58 | ||
59 | // Find ReturnStatement or ArrowFunctionExpression in ancestors. | |
60 | while (parent && !SENTINEL_TYPE.test(parent.type)) { | |
61 | currentChild = parent; | |
62 | parent = parent.parent; | |
63 | } | |
64 | ||
65 | // Reports. | |
66 | if (parent && parent.type === "ReturnStatement") { | |
67 | context.report({ | |
68 | node: parent, | |
69 | messageId: "returnAssignment" | |
70 | }); | |
71 | } else if (parent && parent.type === "ArrowFunctionExpression" && parent.body === currentChild) { | |
72 | context.report({ | |
73 | node: parent, | |
74 | messageId: "arrowAssignment" | |
75 | }); | |
76 | } | |
77 | } | |
78 | }; | |
79 | } | |
80 | }; |