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

fix(eslint-plugin): [prefer-optional-chain] fix ThisExpression and PrivateIdentifier errors #6028

Conversation

omril1
Copy link
Contributor

@omril1 omril1 commented Nov 17, 2022

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

@typescript-eslint
Copy link
Contributor

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.

@nx-cloud
Copy link

nx-cloud bot commented Nov 17, 2022

☁️ Nx Cloud Report

CI is running/has finished running commands for commit 37716b2. As they complete they will appear below. Click to see the status, the terminal output, and the build insights.

📂 See all runs for this branch


✅ Successfully ran 47 targets

Sent with 💌 from NxCloud.

@netlify
Copy link

netlify bot commented Nov 17, 2022

Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit 37716b2
🔍 Latest deploy log https://app.netlify.com/sites/typescript-eslint/deploys/63d8a463626f820009c332ba
😎 Deploy Preview https://deploy-preview-6028--typescript-eslint.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site settings.

Comment on lines 197 to 203
// 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;',
Copy link
Member

@Josh-Cena Josh-Cena Nov 17, 2022

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.

Copy link
Contributor Author

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

Copy link
Contributor Author

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.

@Josh-Cena @JoshuaKGoldberg @bradzacher WDYT?

Copy link
Member

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.

Copy link
Contributor Author

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

Co-authored-by: Joshua Chen <sidachen2003@gmail.com>
@codecov
Copy link

codecov bot commented Nov 18, 2022

Codecov Report

Merging #6028 (37716b2) into main (202d9fb) will decrease coverage by 0.01%.
The diff coverage is 91.66%.

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     
Flag Coverage Δ
unittest 91.36% <91.66%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
...s/eslint-plugin/src/rules/prefer-optional-chain.ts 97.50% <91.66%> (-1.18%) ⬇️

@bradzacher bradzacher changed the title fix(eslint-plugin) [prefer-optional-chain] - Fix ThisExpression and PrivateIdentifier fix(eslint-plugin) [prefer-optional-chain] fix ThisExpression and PrivateIdentifier errors Nov 18, 2022
@bradzacher bradzacher added the bug Something isn't working label Nov 18, 2022
@JoshuaKGoldberg
Copy link
Member

Something funky is up with the Git history 🤔

@bradzacher bradzacher changed the title fix(eslint-plugin) [prefer-optional-chain] fix ThisExpression and PrivateIdentifier errors fix(eslint-plugin): [prefer-optional-chain] fix ThisExpression and PrivateIdentifier errors Nov 23, 2022
@bradzacher bradzacher added the awaiting response Issues waiting for a reply from the OP or another party label Nov 24, 2022
@bradzacher
Copy link
Member

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!
(feel free to force-push to fix this)

@omril1 omril1 force-pushed the fix/issue6024-fix-prefer-optional-chain-private-and-this-in-negated-or branch from e647994 to 7e2185e Compare November 24, 2022 04:36
Comment on lines 371 to 379
if (
[
AST_NODE_TYPES.TSAsExpression,
AST_NODE_TYPES.AwaitExpression,
AST_NODE_TYPES.NewExpression,
].includes(node.object.type)
) {
return '';
}
Copy link
Contributor Author

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

Copy link
Member

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

@omril1 omril1 requested review from JoshuaKGoldberg and removed request for bradzacher and JoshuaKGoldberg December 17, 2022 00:12
@omril1 omril1 requested review from JoshuaKGoldberg and removed request for bradzacher December 24, 2022 12:15
Copy link
Member

@JoshuaKGoldberg JoshuaKGoldberg left a 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 😇

@omril1 omril1 requested review from bradzacher and removed request for JoshuaKGoldberg December 24, 2022 18:36
@omril1 omril1 requested review from JoshuaKGoldberg and removed request for bradzacher January 13, 2023 21:37
@bradzacher bradzacher removed the awaiting response Issues waiting for a reply from the OP or another party label Jan 19, 2023
bradzacher
bradzacher previously approved these changes Jan 30, 2023
@bradzacher
Copy link
Member

fix the merge conflicts and we can get this in!
thanks for your work!

@bradzacher bradzacher added the awaiting response Issues waiting for a reply from the OP or another party label Jan 30, 2023
…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
@omril1
Copy link
Contributor Author

omril1 commented Jan 30, 2023

@bradzacher Thanks, fixed the conflict

@bradzacher bradzacher removed the awaiting response Issues waiting for a reply from the OP or another party label Jan 31, 2023
@bradzacher bradzacher merged commit 85e783c into typescript-eslint:main Jan 31, 2023
@omril1 omril1 deleted the fix/issue6024-fix-prefer-optional-chain-private-and-this-in-negated-or branch January 31, 2023 07:43
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Feb 2, 2023
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 (@&#8203;typescript-eslint/eslint-plugin)</summary>

### [`v5.50.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#&#8203;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` ([#&#8203;5704](typescript-eslint/typescript-eslint#5704)) ([09d57ce](typescript-eslint/typescript-eslint@09d57ce))
-   **eslint-plugin:** \[prefer-optional-chain] fix `ThisExpression` and `PrivateIdentifier` errors ([#&#8203;6028](typescript-eslint/typescript-eslint#6028)) ([85e783c](typescript-eslint/typescript-eslint@85e783c))
-   **eslint-plugin:** \[prefer-optional-chain] fixer produces wrong logic ([#&#8203;5919](typescript-eslint/typescript-eslint#5919)) ([b0f6c8e](typescript-eslint/typescript-eslint@b0f6c8e)), closes [#&#8203;1438](typescript-eslint/typescript-eslint#1438)

##### Features

-   **eslint-plugin:** add `key-spacing` rule extension for interface & type declarations ([#&#8203;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#&#8203;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 ([#&#8203;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 [@&#8203;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 [@&#8203;typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/eslint-plugin)

</details>

<details>
<summary>typescript-eslint/typescript-eslint (@&#8203;typescript-eslint/parser)</summary>

### [`v5.50.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#&#8203;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 [@&#8203;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#&#8203;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 [@&#8203;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 [@&#8203;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 [@&#8203;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>
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 8, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug: [prefer-optional-chain] Unexpected member property type: ThisExpression
4 participants