{"record":{"id":"614af967ffabb57e","repo":"oxc-project/oxc","slug":"returned-expression-contains-an-assignment","errorCode":null,"errorMessage":"Returned expression contains an assignment.","messagePattern":"Returned expression contains an assignment\\.","errorType":"validation","errorClass":"OxcDiagnostic","httpStatus":null,"severity":"warning","filePath":"crates/oxc_linter/src/rules/eslint/no_return_assign.rs","lineNumber":16,"sourceCode":"use oxc_ast::AstKind;\nuse oxc_diagnostics::OxcDiagnostic;\nuse oxc_macros::declare_oxc_lint;\nuse oxc_span::{GetSpan, Span};\nuse schemars::JsonSchema;\nuse serde::Deserialize;\nuse serde_json::Value;\n\nuse crate::{\n    AstNode,\n    context::LintContext,\n    rule::{DefaultRuleConfig, Rule},\n};\n\nfn no_return_assign_diagnostic(span: Span, help: &'static str) -> OxcDiagnostic {\n    OxcDiagnostic::warn(\"Returned expression contains an assignment.\")\n        .with_label(span)\n        .with_help(help)\n}\n\n#[derive(Debug, Default, Clone, Deserialize)]\npub struct NoReturnAssign(NoReturnAssignMode);\n\n#[derive(Debug, Default, Clone, JsonSchema, Deserialize)]\n#[serde(rename_all = \"kebab-case\")]\npub enum NoReturnAssignMode {\n    /// Disallow all assignments in return statements.\n    Always,\n    /// Allow assignments in return statements only if they are enclosed in parentheses.\n    /// This is the default mode.\n    #[default]\n    ExceptParens,\n}\n","sourceCodeStart":1,"sourceCodeEnd":34,"githubUrl":"https://github.com/oxc-project/oxc/blob/e1e7af627c8843ab64044ed466b128fcc21a035b/crates/oxc_linter/src/rules/eslint/no_return_assign.rs#L1-L34","documentation":"oxlint's port of ESLint `no-return-assign`. It flags `return` statements whose expression is an assignment, because `return a = b` looks like a comparison/typo and returns the assigned value as a side effect. Mode `always` (default) flags every assignment operator; mode `except` allows the listed operators (e.g. `+=`) and flags the rest.","triggerScenarios":"`function f(a, b) { return a = b; }` in always mode; `return total += x;` is allowed only under `\"except\": [\"+=\"]`; arrow-concise bodies with assignment produce the same diagnostic.","commonSituations":"Condensing initialization and return into one line; porting old C-style code; typos where `==`/`===` was intended (`return a = b` vs `return a == b`).","solutions":["Split into two statements: assign, then `return a;`.","If a comparison was intended, use `===`/`==` explicitly.","For accumulate-and-return patterns, switch the rule to `\"except\": [\"+=\", \"-=\"]` in .oxlintrc."],"exampleFix":"// before\nfunction f(a, b) {\n  return a = b;\n}\n\n// after\nfunction f(a, b) {\n  a = b;\n  return a;\n}","handlingStrategy":"validation","validationCode":"// Flag `return <expr> =` / `return <expr> +=` shapes\nfunction hasReturnAssign(src) {\n  return /return\\s+[^;\\n]+(?::?=|\\+=|-=|\\*=|\\/=|&&=|\\|\\||\\?\\?=)[^=]/.test(src);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never fold assignment into `return`; write the assignment, then return the variable.","When a comparison is intended, type `===` deliberately and enable eqeqeq to reinforce it.","Use `\"except\": [\"+=\"]` only if accumulate-and-return is an accepted team pattern."],"tags":["lint","eslint","no-return-assign","expressions","best-practices"],"backgroundTag":"assignment-in-expression","analyzedSha":"e1e7af627c8843ab64044ed466b128fcc21a035b","analyzedAt":"2026-08-20T07:01:07.079Z","contentChangedAt":"2026-08-20T07:01:07.079Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}