Skip to content

Allowed non-this, non-super code before super call in derived classes with property initializers #29374

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 61 commits into from
Jan 14, 2022

Conversation

JoshuaKGoldberg
Copy link
Contributor

@JoshuaKGoldberg JoshuaKGoldberg commented Jan 11, 2019

Starts on #8277 by allowing the non-this, non-super code to be root-level statements in the constructor. This will now be allowed:

class Base { }
class Derived extends Base {
    public prop = true;
    constructor(public paramProp = true) {
        console.log("Hello, world!");
        super();
    }
}

It feels wrong to put a new forEachChild loop in the checker, though in the vast majority of user files this will be a very quick one. Is there a better way to check for a reference to super or this?

Edit 2/28/2020: I've mostly resolved the merge conflicts introduced by both # private fields & useDefineForClassFields , but I'm not confident my approach is still a valid one. I'd greatly appreciate it if someone could confirm I'm on the right track!
Oh, and gulp runtests passes locally (on Windows). I'll try a Mac to see if there's some odd encoding/whitespace behavior with the failing test... ✔️

Edit 3/11/2021: It seems this is fairly close to merging.

Edit 1/13/2022: I bought this PR a birthday cake for its third birthday. https://twitter.com/JoshuaKGoldberg/status/1481654056422567944

Blue and white cake with text 'Happy 3rd birthday, #29374 Bump for PR review please!' and the TypeScript logo. A tall slice is removed.

Fixes microsoft#8277.

It feels wrong to put a new `forEachChild` loop in the checker, though in the vast majority of user files this will be a very quick one. Is there a better way to check for a reference to `super` or `this`?
@weswigham
Copy link
Member

It feels wrong to put a new forEachChild loop in the checker, though in the vast majority of user files this will be a very quick one. Is there a better way to check for a reference to super or this?

TransformFlags.Super | TransformFlags.ContainsSuper for super at least.

…boundaries

```ts
function () {
    return this;
}
```

It was immediately going to `ts.forEachChild` so the statement itself wasn't being counted as a new `this` scope.
Copy link
Contributor

@ajafff ajafff left a comment

Choose a reason for hiding this comment

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

This is getting very complex very fast. I wonder if there's an easier way using the control flow graph?

Josh Goldberg added 3 commits January 15, 2019 14:40
As per discussion in the issue, it would be ideal to consider any block that always ends up calling to super() the equivalent of a root-level super() statement. This would be valid:

```ts
foo = 1;
constructor() {
    condition() ? super(1) : super(0);
    this.foo;
}
```

...as it would compile to the equivalent of:
```ts
function () {
    condition() ? super(1) : super(0);
    this.foo = 1;
    this.foo;
}

That change would a bit more intense and I'm very timid, so leaving it out of this PR. In the meantime the requirement is that the super() statement must itself be root-level.
@RyanCavanaugh
Copy link
Member

cc @ahejlsberg for review

@JoshuaKGoldberg
Copy link
Contributor Author

Ping @ahejlsberg - is there anything that needs to be done here? It'd be nice to have this in 😄

@RyanCavanaugh RyanCavanaugh added this to the TypeScript 3.6.0 milestone Jul 12, 2019
@JoshuaKGoldberg
Copy link
Contributor Author

Correction: ping, @weswigham?

@pkoch
Copy link

pkoch commented Jan 14, 2022

@rbuckton Is there anything else that @JoshuaKGoldberg can do to move this forward?

@rbuckton
Copy link
Member

@typescript-bot user test this inline

@typescript-bot
Copy link
Collaborator

Heya @rbuckton, I'm starting to run the inline community code test suite on this PR at 1b3dd6d. Hold tight - I'll update this comment with the log link once the build has been queued.

@rbuckton
Copy link
Member

@rbuckton Is there anything else that @JoshuaKGoldberg can do to move this forward?

Nope, it looks ready to go actually, and just in time for 4.6 beta.

@rbuckton rbuckton merged commit b7fee7f into microsoft:main Jan 14, 2022
@JoshuaKGoldberg JoshuaKGoldberg deleted the non-this-super-before-super branch January 14, 2022 14:31
@JoshuaKGoldberg
Copy link
Contributor Author

Fantastic, thanks so much for the reviews & merge @rbuckton!

If any issues come out of this change I'm available to try to fix, if that's helpful.

@NaveedAhmadHematmal
Copy link

The longest-living PR I have ever seen. 😳

@lukescott
Copy link

lukescott commented Jan 20, 2022

YES!!! Thank you!🎉 🎉 🎉

@callumok2004
Copy link

🥳🎉🎉

@iJungleboy
Copy link

Amazing work and perseverance. Awesome!

@EstopaceMA
Copy link

Man! Awesome. The perseverance! 🎉

@vladboss61
Copy link

Does it mean that now super is going to be invoked the first time never mind where he is located in the constructor?

eemeli added a commit to messageformat/messageformat that referenced this pull request Jul 16, 2022
@jfortier-haptiq
Copy link

Congrats, apparently the cake did it's job! 🎉

@gbersac
Copy link

gbersac commented Jul 28, 2022

Guy you've made it reddit programmer humor front page! https://www.reddit.com/r/ProgrammerHumor/comments/waa0lz/if_youre_ever_frustrated_that_your_github_prs/

@taylus
Copy link

taylus commented Jul 28, 2022

grats on the PR

@upq
Copy link

upq commented Jul 28, 2022

Congrats !! Happy for you!
Might as well be the most famous PR yet ... from branding perspective I recommend you naming the PR
Suggestion: Des Supa

@microsoft microsoft locked as resolved and limited conversation to collaborators Jul 28, 2022
# for free to subscribe to this conversation on GitHub. Already have an account? #.
Labels
For Uncommitted Bug PR for untriaged, rejected, closed or missing bug
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.