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

feat: treat this in typeof this as a ThisExpression #4382

Merged
merged 19 commits into from Jun 27, 2022

Conversation

Zzzen
Copy link
Contributor

@Zzzen Zzzen commented Jan 1, 2022

PR Checklist

Overview

@nx-cloud
Copy link

nx-cloud bot commented Jan 1, 2022

☁️ Nx Cloud Report

CI is running/has finished running commands for commit 042c6f2. 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.

@typescript-eslint
Copy link
Contributor

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.

@netlify
Copy link

netlify bot commented Jan 1, 2022

Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit 042c6f2
🔍 Latest deploy log https://app.netlify.com/sites/typescript-eslint/deploys/62b8c0c73eac3f00097efc73
😎 Deploy Preview https://deploy-preview-4382--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.

@codecov
Copy link

codecov bot commented Jan 1, 2022

Codecov Report

Merging #4382 (042c6f2) into main (2600f7f) will increase coverage by 1.55%.
The diff coverage is 100.00%.

@@            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     
Flag Coverage Δ
unittest 92.88% <100.00%> (+1.55%) ⬆️

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

Impacted Files Coverage Δ
...kages/scope-manager/src/referencer/ClassVisitor.ts 94.01% <100.00%> (+0.05%) ⬆️
...ckages/scope-manager/src/referencer/TypeVisitor.ts 97.93% <100.00%> (+0.04%) ⬆️
...kages/eslint-plugin/src/rules/no-dynamic-delete.ts 100.00% <0.00%> (ø)
...ackages/eslint-plugin/src/rules/no-for-in-array.ts 100.00% <0.00%> (ø)
packages/eslint-plugin/src/rules/no-shadow.ts 78.48% <0.00%> (ø)
...ackages/eslint-plugin/src/rules/no-extra-parens.ts 90.41% <0.00%> (ø)
...es/eslint-plugin/src/rules/no-floating-promises.ts 100.00% <0.00%> (ø)
packages/eslint-plugin/src/configs/base.ts 100.00% <0.00%> (ø)
...s/eslint-plugin/src/rules/no-unused-expressions.ts 89.47% <0.00%> (ø)
...ages/eslint-plugin/src/rules/no-require-imports.ts 100.00% <0.00%> (ø)
... and 183 more

@@ -787,6 +788,14 @@ export class Converter {
}

case SyntaxKind.Identifier: {
if (isThisInTypeQuery(node)) {
Copy link
Contributor Author

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

Copy link
Member

@armano2 armano2 Jan 6, 2022

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

@bradzacher bradzacher added awaiting response Issues waiting for a reply from the OP or another party bug Something isn't working labels Jan 3, 2022
@bradzacher
Copy link
Member

bradzacher commented Jan 3, 2022

Changing the AST feels hacky

It's not hacky because it's the correct AST.
this is not a random Identifier - it's a ThisExpression.
The change could break some plugins, but the number of rules that specifically inspect TSQualifiedName are going to be few (it's not a common thing to lint against). So breakages should be really sparse.
Those that do break will be easily fixed as the updated types will highlight the exact breakage.

Defining a global variable for this is a hacky workaround which could cause other problems.
For example - I'd guess that in script mode you'll now find that function foo(this: string) {} will cause a no-shadow error because you're shadowing the global variable this.

@Zzzen
Copy link
Contributor Author

Zzzen commented Jan 4, 2022

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

@armano2 armano2 Jan 7, 2022

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

Copy link
Member

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

Suggested change
export function isThisIdentifier(node: ts.Node | undefined): boolean {
export function isThisIdentifier(node: ts.Node | undefined): node is ts.ThisKeyword {

Copy link
Contributor Author

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

Copy link
Member

@bradzacher bradzacher left a 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 {
Copy link
Member

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

@JoshuaKGoldberg
Copy link
Member

👋 @Zzzen, this PR would be nice to have. Do you still have time to work on it? (no worries if not, just checking!)

@Zzzen
Copy link
Contributor Author

Zzzen commented Apr 25, 2022

Oh, sure! I almost forgot it.

@bradzacher bradzacher removed the awaiting response Issues waiting for a reply from the OP or another party label Apr 25, 2022
@Zzzen
Copy link
Contributor Author

Zzzen commented Apr 27, 2022

We have converted the AST, so it doesn't align with babel. Should we update preprocessBabylonAST too?

FAIL  tests/ast-alignment/spec.ts
  ● /home/runner/work/typescript-eslint/typescript-eslint/packages/shared-fixtures/fixtures/typescript/types/typeof-this.src.ts

    expect(received).toEqual(expected) // deep equality

    - Expected  - 2
    + Received  + 4

    @@ -46,15 +46,16 @@
                          "start": Object {
                            "column": 17,
                            "line": 1,
                          },
                        },
    +                   "name": "this",
                        "range": Array [
                          17,
                          21,
                        ],
    -                   "type": "ThisExpression",
    +                   "type": "Identifier",
                      },
                      "loc": Object {
                        "end": Object {
                          "column": 21,
                          "line": 1,
    @@ -154,15 +155,16 @@
                            "start": Object {
                              "column": 16,
                              "line": 2,
                            },
                          },
    +                     "name": "this",
                          "range": Array [
                            39,
                            43,
                          ],
    -                     "type": "ThisExpression",
    +                     "type": "Identifier",
                        },
                        "loc": Object {
                          "end": Object {
                            "column": [24](https://github.com/typescript-eslint/typescript-eslint/runs/6177792710?check_suite_focus=true#step:10:24),
                            "line": 2,

      82 |         fixture.ignoreSourceType,
      83 |       ),
    > 84 |     ).toEqual(
         |       ^
      85 |       removeLocationDataAndSourceTypeFromProgramNode(
      86 |         preprocessTypescriptAST(typeScriptESTreeResult.ast),
      87 |         fixture.ignoreSourceType,

      at Object.<anonymous> (tests/ast-alignment/spec.ts:84:7)

@armano2
Copy link
Member

armano2 commented May 14, 2022

We have converted the AST, so it doesn't align with babel. Should we update preprocessBabylonAST too?

@Zzzen yes

@armano2 armano2 modified the milestone: 6.0.0 May 15, 2022
@bradzacher bradzacher added the awaiting response Issues waiting for a reply from the OP or another party label May 16, 2022
@@ -295,6 +295,27 @@ export function preprocessBabylonAST(ast: File): any {
delete node.loc.start.index;
}
},
TSTypeQuery(node: TSTypeQuery) {
Copy link
Member

@armano2 armano2 May 28, 2022

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)

@bradzacher bradzacher removed the awaiting response Issues waiting for a reply from the OP or another party label Jun 13, 2022
@bradzacher bradzacher changed the title fix: support typeof this feat: treat this in typeof this as a ThisExpression Jun 26, 2022
@bradzacher bradzacher added enhancement New feature or request and removed bug Something isn't working labels Jun 26, 2022
Copy link
Member

@bradzacher bradzacher 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 for all your work on this!

image

@bradzacher bradzacher merged commit b04b2ce into typescript-eslint:main Jun 27, 2022
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Jun 28, 2022
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 (@&#8203;typescript-eslint/eslint-plugin)</summary>

### [`v5.30.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#&#8203;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 ([#&#8203;5183](typescript-eslint/typescript-eslint#5183)) ([8ca08e9](typescript-eslint/typescript-eslint@8ca08e9))
-   treat `this` in `typeof this` as a `ThisExpression` ([#&#8203;4382](typescript-eslint/typescript-eslint#4382)) ([b04b2ce](typescript-eslint/typescript-eslint@b04b2ce))

</details>

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

### [`v5.30.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#&#8203;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 [@&#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, 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>
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jul 28, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[no-undef] this in typeof this is reported as undefined incorrectly
4 participants