New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test: More test cases for no-case-declarations #17315
test: More test cases for no-case-declarations #17315
Conversation
Thanks for your interest in contributing to ESLint @ElianCordoba. I think this change does not preserve the current behavior. For example, a code like this should report an error: /* eslint no-case-declarations: 2 */
switch (a) { case 1: {} function f() {} break; } But it no longer does after this change. What kind of code are you expecting to be impacted by this optimization? |
Ah you are right, the current logic won't catch that example. So, this is the original case I was trying improve: If the I updated my branch with a change that covers the example that @fasttime shared, I will also add it as a test case. |
c1d8401
to
2ae4d4d
Compare
Hi @ElianCordoba!, thanks for the Pull Request The first commit message isn't properly formatted. We ask that you update the message to match this format, as we use it to generate changelogs and automate releases.
To Fix: You can fix this problem by running Read more about contributing to ESLint here |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I appreciate the new test cases that said the scenario this is optimizing for does not seem worth optimizing to me:
- If
node.consequent.length
is0
, then the for loop will not be executed at all, so there should be no visible improvement for that case - If
node.consequent.length
is1
, then the for loop will only be run once which does almost exactly the same thing you are doing in the if statement -- take the first element, compare one of its attributes with a string.
So my inclination is to reject this change as it does add more code and logic but the return on investment on that seems 0 or very close to 0.
What do you think?
lib/rules/no-case-declarations.js
Outdated
@@ -47,6 +47,13 @@ module.exports = { | |||
|
|||
return { | |||
SwitchCase(node) { | |||
if ( | |||
node.consequent.length === 0 || // Empty clause | |||
node.consequent[0].type === "BlockStatement" && node.consequent.length === 1 // Clause has {} around child expressions |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better to check "the only element" part earlier
node.consequent[0].type === "BlockStatement" && node.consequent.length === 1 // Clause has {} around child expressions | |
node.consequent.length === 1 && node.consequent[0].type === "BlockStatement" // Clause has {} around child expressions |
I agree with @BYK, it doesn't seem that the added code would really improve the performance. Test cases look useful. @ElianCordoba if you want, you can undo the code changes and we'll merge the tests. |
2ae4d4d
to
6105a8d
Compare
✅ Deploy Preview for docs-eslint canceled.
|
Hi @BYK and @mdjermanovic! I agree, it's not worth the extra complexity, I took the suggestion and undid the logic changes and left the new tests. Thanks for the guidance! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. I just left some notes.
Fixed @fasttime! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [eslint](https://eslint.org) ([source](https://togithub.com/eslint/eslint)) | devDependencies | minor | [`8.43.0` -> `8.44.0`](https://renovatebot.com/diffs/npm/eslint/8.43.0/8.44.0) | --- ### Release Notes <details> <summary>eslint/eslint (eslint)</summary> ### [`v8.44.0`](https://togithub.com/eslint/eslint/releases/tag/v8.44.0) [Compare Source](https://togithub.com/eslint/eslint/compare/v8.43.0...v8.44.0) #### Features - [`1766771`](https://togithub.com/eslint/eslint/commit/176677180a4a1209fc192771521c9192e1f67578) feat: add `es2023` and `es2024` environments (#​1[eslint/eslint#17328)) (Milos Djermanovic) - [`4c50400`](https://togithub.com/eslint/eslint/commit/4c5040022639ae804c15b366afc6e64982bd8ae3) feat: add `ecmaVersion: 2024`, regexp `v` flag parsing (#​1[eslint/eslint#17324)) (Milos Djermanovic) - [`4d411e4`](https://togithub.com/eslint/eslint/commit/4d411e4c7063274d6d346f1b7ee46f7575d0bbd2) feat: add ternaryOperandBinaryExpressions option to no-extra-parens rule (#​1[eslint/eslint#17270)) (Percy Ma) - [`c8b1f4d`](https://togithub.com/eslint/eslint/commit/c8b1f4d61a256727755d561bf53f889b6cd712e0) feat: Move `parserServices` to `SourceCode` (#​1[eslint/eslint#17311)) (Milos Djermanovic) - [`ef6e24e`](https://togithub.com/eslint/eslint/commit/ef6e24e42670f321d996948623846d9caaedac99) feat: treat unknown nodes as having the lowest precedence (#​1[eslint/eslint#17302)) (Brad Zacher) - [`1866e1d`](https://togithub.com/eslint/eslint/commit/1866e1df6175e4ba0ae4a0d88dc3c956bb310035) feat: allow flat config files to export a Promise (#​1[eslint/eslint#17301)) (Milos Djermanovic) #### Bug Fixes - [`a36bcb6`](https://togithub.com/eslint/eslint/commit/a36bcb67f26be42c794797d0cc9948b9cfd4ff71) fix: no-unused-vars false positive with logical assignment operators (#​1[eslint/eslint#17320)) (Gweesin Chan) - [`7620b89`](https://togithub.com/eslint/eslint/commit/7620b891e81c234f30f9dbcceb64a05fd0dde65e) fix: Remove `no-unused-labels` autofix before potential directives (#​1[eslint/eslint#17314)) (Francesco Trotta) - [`391ed38`](https://togithub.com/eslint/eslint/commit/391ed38b09bd1a3abe85db65b8fcda980ab3d6f4) fix: Remove `no-extra-semi` autofix before potential directives (#​1[eslint/eslint#17297)) (Francesco Trotta) #### Documentation - [`526e911`](https://togithub.com/eslint/eslint/commit/526e91106e6fe101578e9478a9d7f4844d4f72ac) docs: resubmit pr 17115 doc changes (#​1[eslint/eslint#17291)) (唯然) - [`e1314bf`](https://togithub.com/eslint/eslint/commit/e1314bf85a52bb0d05b1c9ca3b4c1732bae22172) docs: Integration section and tutorial (#​1[eslint/eslint#17132)) (Ben Perlmutter) - [`19a8c5d`](https://togithub.com/eslint/eslint/commit/19a8c5d84596a9f7f2aa428c1696ba86daf854e6) docs: Update README (GitHub Actions Bot) #### Chores - [`49e46ed`](https://togithub.com/eslint/eslint/commit/49e46edf3c8dc71d691a97fc33b63ed80ae0db0c) chore: upgrade [@​eslint/js](https://togithub.com/eslint/js)[@​8](https://togithub.com/8).44.0 (#​1[eslint/eslint#17329)) (Milos Djermanovic) - [`a1cb642`](https://togithub.com/eslint/eslint/commit/a1cb6421f9d185901cd99e5f696e912226ef6632) chore: package.json update for [@​eslint/js](https://togithub.com/eslint/js) release (ESLint Jenkins) - [`840a264`](https://togithub.com/eslint/eslint/commit/840a26462bbf6c27c52c01b85ee2018062157951) test: More test cases for no-case-declarations (#​1[eslint/eslint#17315)) (Elian Cordoba) - [`e6e74f9`](https://togithub.com/eslint/eslint/commit/e6e74f9eef0448129dd4775628aba554a2d8c8c9) chore: package.json update for eslint-config-eslint release (ESLint Jenkins) - [`eb3d794`](https://togithub.com/eslint/eslint/commit/eb3d7946e1e9f70254008744dba2397aaa730114) chore: upgrade semver@7.5.3 (#​1[eslint/eslint#17323)) (Ziyad El Abid) - [`cf88439`](https://togithub.com/eslint/eslint/commit/cf884390ad8071d88eae05df9321100f1770363d) chore: upgrade optionator@0.9.3 (#​1[eslint/eslint#17319)) (Milos Djermanovic) - [`9718a97`](https://togithub.com/eslint/eslint/commit/9718a9781d69d2c40b68c631aed97700b32c0082) refactor: remove unnecessary code in `flat-eslint.js` (#​1[eslint/eslint#17308)) (Milos Djermanovic) - [`f82e56e`](https://togithub.com/eslint/eslint/commit/f82e56e9acfb9562ece76441472d5657d7d5e296) perf: various performance improvements (#​1[eslint/eslint#17135)) (moonlightaria) - [`da81e66`](https://togithub.com/eslint/eslint/commit/da81e66e22b4f3d3fe292cf70c388753304deaad) chore: update eslint-plugin-jsdoc to 46.2.5 (#​1[eslint/eslint#17245)) (唯然) - [`b991640`](https://togithub.com/eslint/eslint/commit/b991640176d5dce4750f7cc71c56cd6f284c882f) chore: switch eslint-config-eslint to the flat format (#​1[eslint/eslint#17247)) (唯然) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xNTUuMCIsInVwZGF0ZWRJblZlciI6IjM1LjE1OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> Co-authored-by: Renovate Bot <bot@renovateapp.com>
Prerequisites checklist
What is the purpose of this pull request? (put an "X" next to an item)
[ ] Documentation update
[ ] Bug fix (template)
[ ] New rule (template)
[ ] Changes an existing rule (template)
[ ] Add autofix to a rule
[ ] Add a CLI option
[ ] Add something to the core
[x] Other, please explain:
A (minor) perf improvement
What changes did you make? (Give an overview)
Improved heuristic for the rule, if there are no
consequents
or if thecase
block contains a block statement, then we can determine that the rule does not need to be executed.Is there anything you'd like reviewers to focus on?
I benchmarked this with the
TIMING
env variable but sadly I didn't see any improvements, leaving this up to the maintainers if you want to merge it or not. I didn't know how to bench this in a larger codebase, maybe withnpm link
?