UNPKG

2.45 kBJavaScriptView Raw
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
11const astUtils = require("../ast-utils");
12
13//------------------------------------------------------------------------------
14// Helpers
15//------------------------------------------------------------------------------
16
17const SENTINEL_TYPE = /^(?:[a-zA-Z]+?Statement|ArrowFunctionExpression|FunctionExpression|ClassExpression)$/;
18
19//------------------------------------------------------------------------------
20// Rule Definition
21//------------------------------------------------------------------------------
22
23module.exports = {
24 meta: {
25 docs: {
26 description: "disallow assignment operators in `return` statements",
27 category: "Best Practices",
28 recommended: false,
29 url: "https://eslint.org/docs/rules/no-return-assign"
30 },
31
32 schema: [
33 {
34 enum: ["except-parens", "always"]
35 }
36 ]
37 },
38
39 create(context) {
40 const always = (context.options[0] || "except-parens") !== "except-parens";
41 const sourceCode = context.getSourceCode();
42
43 return {
44 AssignmentExpression(node) {
45 if (!always && astUtils.isParenthesised(sourceCode, node)) {
46 return;
47 }
48
49 let parent = node.parent;
50
51 // Find ReturnStatement or ArrowFunctionExpression in ancestors.
52 while (parent && !SENTINEL_TYPE.test(parent.type)) {
53 node = parent;
54 parent = parent.parent;
55 }
56
57 // Reports.
58 if (parent && parent.type === "ReturnStatement") {
59 context.report({
60 node: parent,
61 message: "Return statement should not contain assignment."
62 });
63 } else if (parent && parent.type === "ArrowFunctionExpression" && parent.body === node) {
64 context.report({
65 node: parent,
66 message: "Arrow function should not return assignment."
67 });
68 }
69 }
70 };
71 }
72};