-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
feat: treat this
in typeof this
as a ThisExpression
#4382
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
Conversation
Thanks for the PR, @Zzzen! 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. As a thank you, your profile/company logo will be added to our main README which receives thousands of unique visitors per day. |
✅ Deploy Preview for typescript-eslint ready!
To edit notification comments on pull requests, go to your Netlify site settings. |
Codecov Report
@@ Coverage Diff @@
## main #4382 +/- ##
==========================================
+ Coverage 91.33% 92.88% +1.55%
==========================================
Files 132 323 +191
Lines 1488 10241 +8753
Branches 224 2992 +2768
==========================================
+ Hits 1359 9512 +8153
- Misses 65 419 +354
- Partials 64 310 +246
Flags with carried forward coverage won't be shown. Click here to find out more.
|
@@ -787,6 +788,14 @@ export class Converter { | |||
} | |||
|
|||
case SyntaxKind.Identifier: { | |||
if (isThisInTypeQuery(node)) { |
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.
Changing the AST feels hacky and is gonna break some plugins. The no-undef
rule uses globalScope.through
to check undefined variables. Creating a variable called this
for functions should prevent eslint from reporting this.
https://github.com/eslint/eslint/blob/main/lib/rules/no-undef.js#L59L75
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 looks like an issue in typescript, we should either get SyntaxKind.ThisType
or SyntaxKind.ThisKeyword
playground 4.3.5
playground 4.5.4
class Test {
fn () {
const a: typeof this = this
a.fn()
const b: this = this
b.fn()
}
}
const b: this = this
- is correctly reported as ThisType
older versions of typescript (<4.4) reported typeof this
as error Cannot find name 'this'. (2304)
we should add test cases for parser and visitor
It's not hacky because it's the correct AST. Defining a global variable for |
Did not notice we have our own definition for all AST nodes... |
return id.originalKeywordKind === SyntaxKind.ThisKeyword; | ||
} | ||
|
||
export function isThisIdentifier(node: ts.Node | undefined): boolean { |
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.
you should use TSNode
from ts-estree
type and remove casts
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.
you should use a type predicate so that TS can understand the refinement you're making within the function
export function isThisIdentifier(node: ts.Node | undefined): boolean { | |
export function isThisIdentifier(node: ts.Node | undefined): node is ts.ThisKeyword { |
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.
ts
does not have nodes named ThisKeyword
. The most similar thing is ThisExpression
. Probably not what we want.
export interface ThisExpression extends PrimaryExpression {
readonly kind: SyntaxKind.ThisKeyword;
}
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.
please add a parser test for this as well.
you can add a fixture somewhere in here packages/shared-fixtures/fixtures/typescript/types
then run the test with
$ cd packages/typescript-estree
$ yarn jest ast-fixtures.test
It'll dump a snapshot to packages/typescript-estree/tests/snapshots/typescript/types
); | ||
} | ||
|
||
export function isThisInTypeQuery(node: ts.Node): boolean { |
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.
ditto above - use a predicate return type
👋 @Zzzen, this PR would be nice to have. Do you still have time to work on it? (no worries if not, just checking!) |
Oh, sure! I almost forgot it. |
We have converted the AST, so it doesn't align with babel. Should we update
|
@Zzzen yes |
@@ -295,6 +295,27 @@ export function preprocessBabylonAST(ast: File): any { | |||
delete node.loc.start.index; | |||
} | |||
}, | |||
TSTypeQuery(node: TSTypeQuery) { |
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 you add an comment with explanation why we need this and if there is babel ticket please link it here,
(this is necessary to ease maintenance of this file)
typeof this
this
in typeof this
as a ThisExpression
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 PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.29.0` -> `5.30.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/5.29.0/5.30.0) | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.29.0` -> `5.30.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/5.29.0/5.30.0) | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v5.30.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#​5300-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5290v5300-2022-06-27) [Compare Source](typescript-eslint/typescript-eslint@v5.29.0...v5.30.0) ##### Features - **eslint-plugin:** \[no-shadow] add shadowed variable location to the error message ([#​5183](typescript-eslint/typescript-eslint#5183)) ([8ca08e9](typescript-eslint/typescript-eslint@8ca08e9)) - treat `this` in `typeof this` as a `ThisExpression` ([#​4382](typescript-eslint/typescript-eslint#4382)) ([b04b2ce](typescript-eslint/typescript-eslint@b04b2ce)) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v5.30.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#​5300-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5290v5300-2022-06-27) [Compare Source](typescript-eslint/typescript-eslint@v5.29.0...v5.30.0) **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, click this checkbox. --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). Co-authored-by: cabr2-bot <cabr2.help@gmail.com> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1436 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
this
intypeof this
is reported as undefined incorrectly #4364Overview