Conversation
…urns Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
4a160b7 to
7537556
Compare
There was a problem hiding this comment.
Pull request overview
This PR fixes the catch-or-return linter rule to correctly handle arrow functions with implicit returns. Previously, the rule incorrectly flagged arrow functions with expression bodies (e.g., () => Promise.resolve(null)) as missing catch handlers, even though these expressions are implicitly returned and therefore exempt from the rule.
Key Changes:
- Added a helper function to detect when an ExpressionStatement is implicitly returned by an arrow function (by checking the
expressionflag on the AST node) - Integrated the check into the rule's run logic to skip diagnostics for implicitly-returned promises
- Added comprehensive test coverage with 10 new test cases covering various scenarios
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
crates/oxc_linter/src/rules/promise/catch_or_return.rs |
Added is_arrow_function_expression_return helper function and integrated it into the rule logic; added pass/fail test cases |
crates/oxc_linter/src/snapshots/promise_catch_or_return.snap |
Updated snapshots with two new failing test cases for arrow functions with block bodies that don't return |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
CodSpeed Performance ReportMerging #17440 will not alter performanceComparing Summary
Footnotes
|
# Oxlint ### 💥 BREAKING CHANGES - f7da875 oxlint: [**BREAKING**] Remove oxc_language_server binary (#17457) (Boshen) ### 🚀 Features - 659c23e linter: Init note field boilerplate (#17589) (Shrey Sudhir) - 6870b64 parser: Add TS1363 error code (#17609) (Sysix) - 6154c8c linter/eslint-plugin-vitest: Implemented vitest/warn-todo rule (#17228) (Said Atrahouch) - 0043cd6 linter/eslint-plugin-vitest: Implement consistent-vitest-vi rule (#17389) (Said Atrahouch) - a6d773d linter: Add full TS support to eslint/no-useless-constructor (#17592) (camc314) - f02c0e7 linter/eslint: Implement complexity (#17569) (Nguyen Tran) - bc7aae7 linter/no-unused-vars: Add fixer to remove unused catch bindings (#17567) (Don Isaac) - 9e8ec78 linter/only-throw-error rule: Add `allowRethrowing` option for (#17554) (camc314) - b67e819 linter: Add fixer for `unicorn/prefer-response-static-json` rule (#17559) (Mikhail Baev) - 44b0361 linter/vue: Implement no-this-in-before-route-enter (#17525) (yefan) - ee34716 linter/react: Implement no-will-update-set-state (#17530) (Kenzo Wada) - 3088e1d linter/react: Implement no-this-in-sfc (#17535) (Kenzo Wada) - 29a2868 linter/jsx-a11y: Implement no-static-element-interactions (#17538) (Kenzo Wada) - eadf057 linter: Enable tsconfig auto discovery by default (#17489) (Boshen) - 12a7d6e website_linter: Add a count of rules with fixes available to rules table. (#17476) (Connor Shea) ### 🐛 Bug Fixes - a702f13 oxlint/lsp: Correct position for "disable for this file" with shebang (#17613) (Sysix) - 19fdfb6 linter: Panic in `sort-keys` rule with Unicode numeric characters (#17629) (Adel Rodríguez) - 2e8f469 vscode: Search for `node_modules/.bin/oxlint.exe` too (bun setup) (#17597) (Sysix) - be39906 linter/aria-proptypes: Allow template literals with expressions for string-type ARIA props (#17460) (Jökull Sólberg Auðunsson) - 529901c linter: Include JS plugin rules when calculating total rule count (#17520) (connorshea) - 96ef2cc linter: Print total rule # when using a single nested config (#17517) (connorshea) - 9ad0f29 oxlint: Do not enable external plugin store when no external linter is passed (#17498) (Sysix) - 174375d oxfmt,oxlint: Disable mimalloc for 32-bit Arm targets (#17473) (Yaksh Bariya) - ff70fe9 linter/no-standalone-expect: Allows expect in wrapper functions passed to test blocks (#17427) (Copilot) - dab232f linter/catch-or-return: Handle arrow functions with implicit returns correctly (#17440) (Copilot) - a38892a linter: Update no-unnecessary-template-expression docs and test case (#17453) (camc314) ### ⚡ Performance - 605dbf1 vscode: Restrict searching for oxlint/oxfmt binaries only 3 levels deep + 10s timeout (#17345) (Sysix) ### 📚 Documentation - 884fb63 linter/react: Improve docs for jsx-curly-brace-presence (#17579) (connorshea) - 1d3ee07 linter: Improve rule explanation for `vue/no-this-in-before-route-enter`. (#17581) (connorshea) - 5f189f8 linter/arrow-body-style: Correctly document default mode option (#17566) (Rägnar O'ock) - bb2e8e4 linter: Add a note to the `typescript/no-var-requires` rule about the missing `allow` option (#17551) (connorshea) - 655afc1 linter: Improve docs for `import/extensions` and add a few more tests (#17539) (connorshea) - 7e5fc90 linter: Update list of plugins that are reserved. (#17516) (connorshea) # Oxfmt ### 💥 BREAKING CHANGES - f7da875 oxlint: [**BREAKING**] Remove oxc_language_server binary (#17457) (Boshen) ### 🚀 Features - 8fd4ea9 oxfmt: `options.embeddedLanguageFormatting` is now `"auto"` by default (#17649) (leaysgur) ### 🐛 Bug Fixes - c9b5d7d formatter/sort_imports: Handle alignable_comment correctly (#17646) (leaysgur) - 453222d formatter: Missing comment handling for end-of-line comments in member chains (#17659) (Dunqing) - 0805ff2 formatter: Incorrect inline comment placement in try-catch (#17657) (Dunqing) - 3a0c782 formatter: Don't move comments into optional call parentheses (#17582) (magic-akari) - 174375d oxfmt,oxlint: Disable mimalloc for 32-bit Arm targets (#17473) (Yaksh Bariya) ### ⚡ Performance - abb28dc oxfmt: Turn of pretty print from sort-package-json (#17452) (Boshen)
The
catch-or-returnrule incorrectly flagged arrow functions with implicit returns as missing catch handlers, even though implicit returns are semantically equivalent to explicit returns.Changes
is_in_returned_contexthelper: Detects when anExpressionStatementis the body of an arrow function withexpression = true, indicating an implicit returnTechnical Details
Arrow functions with expression bodies (
() => expr) setexpression = trueon the AST node. The body still contains aFunctionBodywith anExpressionStatement, but the expression flag indicates it's implicitly returned. The fix walks the AST parent chain to detect this pattern.Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.