Skip to content
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

Merged
merged 2 commits into from Jun 30, 2023

Conversation

ElianCordoba
Copy link
Contributor

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 the case 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 with npm link?

@ElianCordoba ElianCordoba requested a review from a team as a code owner June 27, 2023 21:35
@eslint-github-bot eslint-github-bot bot added the chore This change is not user-facing label Jun 27, 2023
@linux-foundation-easycla
Copy link

linux-foundation-easycla bot commented Jun 27, 2023

CLA Signed

The committers listed above are authorized under a signed CLA.

@fasttime fasttime added rule Relates to ESLint's core rules and removed chore This change is not user-facing labels Jun 28, 2023
@fasttime
Copy link
Member

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; }

DEMO

But it no longer does after this change. What kind of code are you expecting to be impacted by this optimization?

@ElianCordoba
Copy link
Contributor Author

Ah you are right, the current logic won't catch that example. So, this is the original case I was trying improve:

Screenshot 2023-06-28 at 17 39 39

If the case clause is empty or, if it has the brackes (having only one consequents being a Block statement), then we know that we can skip the check.

I updated my branch with a change that covers the example that @fasttime shared, I will also add it as a test case.

@ElianCordoba ElianCordoba force-pushed the fast-path-no-case-declarations branch from c1d8401 to 2ae4d4d Compare June 28, 2023 20:59
@eslint-github-bot
Copy link

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.

  • The commit message tag wasn't recognized. Did you mean "docs", "fix", or "feat"?
  • There should be a space following the initial tag and colon, for example 'feat: Message'.
  • The first letter of the tag should be in lowercase

To Fix: You can fix this problem by running git commit --amend, editing your commit message, and then running git push -f to update this pull request.

Read more about contributing to ESLint here

Copy link
Member

@BYK BYK left a 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:

  1. If node.consequent.length is 0, then the for loop will not be executed at all, so there should be no visible improvement for that case
  2. If node.consequent.length is 1, 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?

@@ -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
Copy link
Member

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

Suggested change
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

@mdjermanovic
Copy link
Member

  1. If node.consequent.length is 0, then the for loop will not be executed at all, so there should be no visible improvement for that case
  2. If node.consequent.length is 1, 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.

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.

@ElianCordoba ElianCordoba force-pushed the fast-path-no-case-declarations branch from 2ae4d4d to 6105a8d Compare June 30, 2023 15:35
@eslint-github-bot eslint-github-bot bot added the feature This change adds a new feature to ESLint label Jun 30, 2023
@netlify
Copy link

netlify bot commented Jun 30, 2023

Deploy Preview for docs-eslint canceled.

Name Link
🔨 Latest commit 909d3e7
🔍 Latest deploy log https://app.netlify.com/sites/docs-eslint/deploys/649f248c3e888400082e0ea2

@ElianCordoba
Copy link
Contributor Author

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!

@ElianCordoba ElianCordoba changed the title perf: add fast path to no-case-declarations feat: More test cases for to no-case-declarations Jun 30, 2023
@mdjermanovic mdjermanovic changed the title feat: More test cases for to no-case-declarations test: More test cases for to no-case-declarations Jun 30, 2023
Copy link
Member

@fasttime fasttime left a 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.

tests/lib/rules/no-case-declarations.js Outdated Show resolved Hide resolved
tests/lib/rules/no-case-declarations.js Outdated Show resolved Hide resolved
tests/lib/rules/no-case-declarations.js Outdated Show resolved Hide resolved
@fasttime fasttime added accepted There is consensus among the team that this change meets the criteria for inclusion and removed feature This change adds a new feature to ESLint labels Jun 30, 2023
@mdjermanovic mdjermanovic changed the title test: More test cases for to no-case-declarations test: More test cases for no-case-declarations Jun 30, 2023
@eslint-github-bot eslint-github-bot bot added the feature This change adds a new feature to ESLint label Jun 30, 2023
@mdjermanovic mdjermanovic added chore This change is not user-facing and removed feature This change adds a new feature to ESLint labels Jun 30, 2023
@ElianCordoba
Copy link
Contributor Author

Fixed @fasttime!

Copy link
Member

@mdjermanovic mdjermanovic left a comment

Choose a reason for hiding this comment

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

LGTM, thanks!

@mdjermanovic mdjermanovic merged commit 840a264 into eslint:main Jun 30, 2023
22 checks passed
@ElianCordoba ElianCordoba deleted the fast-path-no-case-declarations branch July 2, 2023 02:34
json-derulo added a commit to json-derulo/angular-ecmascript-intl that referenced this pull request Jul 4, 2023
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
(#&#8203;1[eslint/eslint#17328))
(Milos Djermanovic)
-
[`4c50400`](https://togithub.com/eslint/eslint/commit/4c5040022639ae804c15b366afc6e64982bd8ae3)
feat: add `ecmaVersion: 2024`, regexp `v` flag parsing
(#&#8203;1[eslint/eslint#17324))
(Milos Djermanovic)
-
[`4d411e4`](https://togithub.com/eslint/eslint/commit/4d411e4c7063274d6d346f1b7ee46f7575d0bbd2)
feat: add ternaryOperandBinaryExpressions option to no-extra-parens rule
(#&#8203;1[eslint/eslint#17270))
(Percy Ma)
-
[`c8b1f4d`](https://togithub.com/eslint/eslint/commit/c8b1f4d61a256727755d561bf53f889b6cd712e0)
feat: Move `parserServices` to `SourceCode`
(#&#8203;1[eslint/eslint#17311))
(Milos Djermanovic)
-
[`ef6e24e`](https://togithub.com/eslint/eslint/commit/ef6e24e42670f321d996948623846d9caaedac99)
feat: treat unknown nodes as having the lowest precedence
(#&#8203;1[eslint/eslint#17302))
(Brad Zacher)
-
[`1866e1d`](https://togithub.com/eslint/eslint/commit/1866e1df6175e4ba0ae4a0d88dc3c956bb310035)
feat: allow flat config files to export a Promise
(#&#8203;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
(#&#8203;1[eslint/eslint#17320))
(Gweesin Chan)
-
[`7620b89`](https://togithub.com/eslint/eslint/commit/7620b891e81c234f30f9dbcceb64a05fd0dde65e)
fix: Remove `no-unused-labels` autofix before potential directives
(#&#8203;1[eslint/eslint#17314))
(Francesco Trotta)
-
[`391ed38`](https://togithub.com/eslint/eslint/commit/391ed38b09bd1a3abe85db65b8fcda980ab3d6f4)
fix: Remove `no-extra-semi` autofix before potential directives
(#&#8203;1[eslint/eslint#17297))
(Francesco Trotta)

#### Documentation

-
[`526e911`](https://togithub.com/eslint/eslint/commit/526e91106e6fe101578e9478a9d7f4844d4f72ac)
docs: resubmit pr 17115 doc changes
(#&#8203;1[eslint/eslint#17291))
(唯然)
-
[`e1314bf`](https://togithub.com/eslint/eslint/commit/e1314bf85a52bb0d05b1c9ca3b4c1732bae22172)
docs: Integration section and tutorial
(#&#8203;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
[@&#8203;eslint/js](https://togithub.com/eslint/js)[@&#8203;8](https://togithub.com/8).44.0
(#&#8203;1[eslint/eslint#17329))
(Milos Djermanovic)
-
[`a1cb642`](https://togithub.com/eslint/eslint/commit/a1cb6421f9d185901cd99e5f696e912226ef6632)
chore: package.json update for
[@&#8203;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
(#&#8203;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
(#&#8203;1[eslint/eslint#17323))
(Ziyad El Abid)
-
[`cf88439`](https://togithub.com/eslint/eslint/commit/cf884390ad8071d88eae05df9321100f1770363d)
chore: upgrade optionator@0.9.3
(#&#8203;1[eslint/eslint#17319))
(Milos Djermanovic)
-
[`9718a97`](https://togithub.com/eslint/eslint/commit/9718a9781d69d2c40b68c631aed97700b32c0082)
refactor: remove unnecessary code in `flat-eslint.js`
(#&#8203;1[eslint/eslint#17308))
(Milos Djermanovic)
-
[`f82e56e`](https://togithub.com/eslint/eslint/commit/f82e56e9acfb9562ece76441472d5657d7d5e296)
perf: various performance improvements
(#&#8203;1[eslint/eslint#17135))
(moonlightaria)
-
[`da81e66`](https://togithub.com/eslint/eslint/commit/da81e66e22b4f3d3fe292cf70c388753304deaad)
chore: update eslint-plugin-jsdoc to 46.2.5
(#&#8203;1[eslint/eslint#17245))
(唯然)
-
[`b991640`](https://togithub.com/eslint/eslint/commit/b991640176d5dce4750f7cc71c56cd6f284c882f)
chore: switch eslint-config-eslint to the flat format
(#&#8203;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>
@eslint-github-bot eslint-github-bot bot locked and limited conversation to collaborators Dec 28, 2023
@eslint-github-bot eslint-github-bot bot added the archived due to age This issue has been archived; please open a new issue for any further discussion label Dec 28, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
accepted There is consensus among the team that this change meets the criteria for inclusion archived due to age This issue has been archived; please open a new issue for any further discussion chore This change is not user-facing rule Relates to ESLint's core rules
Projects
Status: Complete
Development

Successfully merging this pull request may close these issues.

None yet

4 participants