-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
fix(eslint-plugin): [prefer-optional-chain] fix ThisExpression
and PrivateIdentifier
errors
#6028
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
fix(eslint-plugin): [prefer-optional-chain] fix ThisExpression
and PrivateIdentifier
errors
#6028
Conversation
This reverts commit 5acc1af.
Thanks for the PR, @omril1! typescript-eslint is a 100% community driven project, and we are incredibly grateful that you are contributing to that community. The core maintainers work on this in their personal time, so please understand that it may not be possible for them to review your work immediately. Thanks again! 🙏 Please, if you or your company is finding typescript-eslint valuable, help us sustain the project by sponsoring it transparently on https://opencollective.com/typescript-eslint. |
✅ Deploy Preview for typescript-eslint ready!
To edit notification comments on pull requests, go to your Netlify site settings. |
// private properties | ||
'this.#a && this.#b;', | ||
'!this.#a || !this.#b;', | ||
'a.#foo && a.#foo.bar;', | ||
'!a.#foo || !a.#foo.bar;', | ||
'a.#foo?.bar;', | ||
'!a.#foo?.bar;', |
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.
More test cases to consider:
foo().#a
a.b.#a
new A().#b
(await a).#b
I have no idea why this rule is so strict about what expressions it can lint, but you can in fact use private properties on all expressions, just that some may have nonsensical behaviors (e.g. (typeof a).#a
). It shouldn't crash the linter anyway.
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.
Can I fix the rule to not intentionally throw? this seems irrational to me.
It's better to not show a suggestion than to just break and do nothing
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 would love to change this rule to not intentionally throw, or at least catch the error.
The rule logic now has many combinations that could be missed and better be gracefully ignored.
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.
Yeah as Brad said in #6028 (comment), I think the rule should no longer throw. Throwing is useful for us finding missing combinations but is inconvenient for users.
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.
Oh, so I misunderstood his comment
packages/eslint-plugin/tests/rules/prefer-optional-chain.test.ts
Outdated
Show resolved
Hide resolved
Co-authored-by: Joshua Chen <sidachen2003@gmail.com>
Codecov Report
Additional details and impacted files@@ Coverage Diff @@
## main #6028 +/- ##
==========================================
- Coverage 91.37% 91.36% -0.01%
==========================================
Files 368 368
Lines 12596 12605 +9
Branches 3709 3713 +4
==========================================
+ Hits 11509 11516 +7
- Misses 772 773 +1
- Partials 315 316 +1
Flags with carried forward coverage won't be shown. Click here to find out more.
|
ThisExpression
and PrivateIdentifier
ThisExpression
and PrivateIdentifier
errors
Something funky is up with the Git history 🤔 |
ThisExpression
and PrivateIdentifier
errorsThisExpression
and PrivateIdentifier
errors
it looks like you might have rebased weirdly or something? it's borked the PR contents! could you please update your branch so it just contains your commits - thanks! |
e647994
to
7e2185e
Compare
…refer-optional-chain-private-and-this-in-negated-or
…refer-optional-chain-private-and-this-in-negated-or
if ( | ||
[ | ||
AST_NODE_TYPES.TSAsExpression, | ||
AST_NODE_TYPES.AwaitExpression, | ||
AST_NODE_TYPES.NewExpression, | ||
].includes(node.object.type) | ||
) { | ||
return ''; | ||
} |
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.
This feels a bit like a hack since typescript doesn't seem to think they are assignable to MemberExpression
if (node.object.type === AST_NODE_TYPES.TSAsExpression) {}
shows a typescript error, but with Array#includes it does not
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.
It is a bit of a hack 😄 but the root cause is a bug in our typings, I think. A node's member can be an await
or new
. [typescript-eslint playground]
const example = {} as any;
(await example).prop;
(await new example).prop;
For now, you can use a // @ts-expect-error
and link to #6239 #6192
…ate-and-this-in-negated-or
…ate-and-this-in-negated-or
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.
Still a few comments please 😇
…ate-and-this-in-negated-or
…ate-and-this-in-negated-or
…ate-and-this-in-negated-or
fix the merge conflicts and we can get this in! |
…refer-optional-chain-private-and-this-in-negated-or # Conflicts: # packages/eslint-plugin/src/rules/prefer-optional-chain.ts # packages/eslint-plugin/tests/rules/prefer-optional-chain/prefer-optional-chain.test.ts
@bradzacher Thanks, fixed the conflict |
…ate-and-this-in-negated-or
…ate-and-this-in-negated-or
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.48.2` -> `5.50.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/5.48.2/5.50.0) | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.48.2` -> `5.50.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/5.48.2/5.50.0) | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v5.50.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#​5500-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5490v5500-2023-01-31) [Compare Source](typescript-eslint/typescript-eslint@v5.49.0...v5.50.0) ##### Bug Fixes - **eslint-plugin:** \[ban-ts-comment] counts graphemes instead of `String.prototype.length` ([#​5704](typescript-eslint/typescript-eslint#5704)) ([09d57ce](typescript-eslint/typescript-eslint@09d57ce)) - **eslint-plugin:** \[prefer-optional-chain] fix `ThisExpression` and `PrivateIdentifier` errors ([#​6028](typescript-eslint/typescript-eslint#6028)) ([85e783c](typescript-eslint/typescript-eslint@85e783c)) - **eslint-plugin:** \[prefer-optional-chain] fixer produces wrong logic ([#​5919](typescript-eslint/typescript-eslint#5919)) ([b0f6c8e](typescript-eslint/typescript-eslint@b0f6c8e)), closes [#​1438](typescript-eslint/typescript-eslint#1438) ##### Features - **eslint-plugin:** add `key-spacing` rule extension for interface & type declarations ([#​6211](typescript-eslint/typescript-eslint#6211)) ([67706e7](typescript-eslint/typescript-eslint@67706e7)) ### [`v5.49.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#​5490-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5482v5490-2023-01-23) [Compare Source](typescript-eslint/typescript-eslint@v5.48.2...v5.49.0) ##### Features - **eslint-plugin:** \[naming-convention] add support for `#private` modifier on class members ([#​6259](typescript-eslint/typescript-eslint#6259)) ([c8a6d80](typescript-eslint/typescript-eslint@c8a6d80)) #### [5.48.2](typescript-eslint/typescript-eslint@v5.48.1...v5.48.2) (2023-01-16) **Note:** Version bump only for package [@​typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin) #### [5.48.1](typescript-eslint/typescript-eslint@v5.48.0...v5.48.1) (2023-01-09) **Note:** Version bump only for package [@​typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v5.50.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#​5500-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5490v5500-2023-01-31) [Compare Source](typescript-eslint/typescript-eslint@v5.49.0...v5.50.0) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) ### [`v5.49.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#​5490-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5482v5490-2023-01-23) [Compare Source](typescript-eslint/typescript-eslint@v5.48.2...v5.49.0) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.48.2](typescript-eslint/typescript-eslint@v5.48.1...v5.48.2) (2023-01-16) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.48.1](typescript-eslint/typescript-eslint@v5.48.0...v5.48.1) (2023-01-09) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) </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 these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4xMTQuMSIsInVwZGF0ZWRJblZlciI6IjM0LjExOS4yIn0=--> Co-authored-by: cabr2-bot <cabr2.help@gmail.com> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1757 Reviewed-by: Epsilon_02 <epsilon_02@noreply.codeberg.org> Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org> Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
PR Checklist
Overview
This only prevents the plugin from crashing, I tried to support the syntax as well but got into a weird behavior from the fixer reverting the fix