Skip to content

fix(linter/no-cond-assign): align ternary handling#22761

Merged
graphite-app[bot] merged 1 commit into
mainfrom
codex/fix-no-cond-assign-ternary
May 27, 2026
Merged

fix(linter/no-cond-assign): align ternary handling#22761
graphite-app[bot] merged 1 commit into
mainfrom
codex/fix-no-cond-assign-ternary

Conversation

@camc314

@camc314 camc314 commented May 27, 2026

Copy link
Copy Markdown
Contributor

Fixes #22760

eslint/no-cond-assign in always mode was treating the full span of a ternary expression as conditional context when checking nested assignments. That meant assignments in the consequent or alternate branch were reported even though ESLint only treats the ternary test as the conditional expression.

This changes the ancestor check for ConditionalExpression to use only the test span, so cases like a = a ? (a += 5) : 1 no longer report while assignments in actual conditional positions still do.

@camc314 camc314 self-assigned this May 27, 2026
@github-actions github-actions Bot added the A-linter Area - Linter label May 27, 2026
@camc314 camc314 changed the title fix(linter): align no-cond-assign ternary handling fix(linter/no-cond-assign): align ternary handling May 27, 2026
@camc314 camc314 marked this pull request as ready for review May 27, 2026 12:15
Copilot AI review requested due to automatic review settings May 27, 2026 12:15

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes eslint/no-cond-assign in always mode to match ESLint’s handling of ternary (ConditionalExpression) context: only the ternary test is considered conditional, not the consequent/alternate branches. This prevents false positives for assignments that appear only within ternary branches.

Changes:

  • Update the AssignmentExpression ancestor-span check to treat ConditionalExpression as conditional context only over cond_expr.test.span().
  • Simplify the ancestor scanning logic by checking each conditional span on the fly (avoids accumulating a Vec<Span>).
  • Add a regression test covering an assignment inside a ternary branch that should not be reported in always mode.

@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label May 27, 2026

camc314 commented May 27, 2026

Copy link
Copy Markdown
Contributor Author

Merge activity

Fixes #22760

`eslint/no-cond-assign` in `always` mode was treating the full span of a ternary expression as conditional context when checking nested assignments. That meant assignments in the consequent or alternate branch were reported even though ESLint only treats the ternary test as the conditional expression.

This changes the ancestor check for `ConditionalExpression` to use only the test span, so cases like `a = a ? (a += 5) : 1` no longer report while assignments in actual conditional positions still do.
@graphite-app graphite-app Bot force-pushed the codex/fix-no-cond-assign-ternary branch from 0e693f3 to 82366d9 Compare May 27, 2026 12:21
@graphite-app graphite-app Bot merged commit 82366d9 into main May 27, 2026
29 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label May 27, 2026
@graphite-app graphite-app Bot deleted the codex/fix-no-cond-assign-ternary branch May 27, 2026 12:26
camc314 pushed a commit that referenced this pull request Jun 1, 2026
# Oxlint
### 🚀 Features

- e4b1f46 linter/typescript: Implement `method-signature-style` rule
(#22679) (Mikhail Baev)
- bc462ca linter/vue: Implement no-reserved-component-names rule
(#22741) (bab)
- ef9e751 linter/vue: Implement component-definition-name-casing rule
(#22818) (bab)
- d67f51a linter/vue: Implement require-prop-type-constructor rule
(#22708) (bab)
- 1444f82 linter/promise/spec-only: Add `Promise.try` to `Promise`
static methods (#22812) (Ben Saufley)
- 8422e8b linter/jsdoc: Implement `require-yields-description` rule
(#22805) (Mikhail Baev)
- fe93f97 linter/eslint: Implement `prefer-named-capture-group` rule
(#22759) (Sebastian Poxhofer)
- 1a7798b linter: Add suggestion for `unicorn/no-new-array` (#22682)
(Sysix)

### 🐛 Bug Fixes

- 760a9f9 linter: Report errors when writing to the filesystem (#22881)
(camc314)
- e5a2748 linter: Avoid no-unreachable false positive after conditional
loop (#22869) (camc314)
- 39d92d6 linter/arrow-body-style: Preserve comments within function
(#22854) (Sysix)
- 3d13e29 parser: Reject `declare` in an already-ambient context
(TS1038) (#22850) (Boshen)
- 5152854 parser: Reject statements in ambient contexts (TS1036)
(#22849) (Boshen)
- 2eafea6 parser: Reject function implementations in ambient contexts
(TS1183) (#22845) (Boshen)
- c645615 parser: Reject incompatible class member modifiers (#22843)
(Boshen)
- 4a1ca4a linter/export: Detect duplicate explicit exports (#22798)
(camc314)
- 0a9a735 linter/no-loop-func: Allow safe let closures (#22811)
(camc314)
- 1599f11 linter: Align lsp extends default plugins (#22788) (camc314)
- db32ec9 linter/no-accumulating-spread: Use loop as primary span
(#22800) (camc314)
- 33ec6b4 linter/consistent-test-it: Avoid adjacent describe leakage
(#22796) (camc314)
- 2606069 linter/no-array-sort: Unwrap parenthesized sort args (#22794)
(camc314)
- 9f2f709 linter/no-array-sort: Skip non compare fn sort arguments
(#22752) (Gaurav Dubey)
- 27268a0 linter/no-else-return: Preserve statement boundary in fixer
(#22687) (camc314)
- d9cb6d8 linter/no-empty-function: Allow functions callbacks with
`allow: functions` (#22764) (camc314)
- a40a314 linter/no-shadow-restricted-names: Ignore enum members
(#22762) (camc314)
- 82366d9 linter/no-cond-assign: Align ternary handling (#22761)
(camc314)

### 📚 Documentation

- 5e113ba linter: Add license notices for ported ESLint plugins (#22768)
(Boshen)
# Oxfmt
### 🚀 Features

- d75cbbf oxfmt: Format `parser:json` files by `oxc_formatter_json`
(#22709) (leaysgur)
- 49db054 formatter_json: Implement `oxc_formatter_json` (json variant
only) (#22641) (leaysgur)
- 9c71f2e ast, codegen, formatter: Add `WithClauseKeyword::as_str`
helper and use it (#22791) (camc314)

### 🐛 Bug Fixes

- d3cdd62 oxfmt: Skip formatting for whitespace-only file (#22780)
(leaysgur)
- 23f0cc8 formatter: Don't move comments inside variable declaration in
for in loop (#22776) (leaysgur)
- f200c40 formatter: Don't move comments inside variable declaration in
for of loop (#22773) (Leonabcd123)

### 📚 Documentation

- 845f393 oxfmt,formatter,formatter_json,formatter_core: Add/update
AGENTS.md (#22873) (leaysgur)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-linter Area - Linter

Projects

None yet

Development

Successfully merging this pull request may close these issues.

linter: eslint/no-cond-assign with always flags conditional expression in ternary expression

2 participants