denoland / deno_lint

Blazing fast linter for JavaScript and TypeScript written in Rust
https://lint.deno.land/
MIT License
1.51k stars 163 forks source link

Rule against `await await` #1168

Open not-my-profile opened 1 year ago

not-my-profile commented 1 year ago

While the number of await keywords can affect which promise job is executed first (because promise jobs have to be enqued even if the promise is fulfilled), in sane code you usually only ever want one await keyword for one expression. And multiple await keywords are usually just an accident, so it would be nice to have a rule to detect this.

E.g. Invalid:

await await fetch('/test');

Valid:

await fetch('/test');
bartlomieju commented 1 year ago

Sounds reasonable, PRs are welcome

dsherret commented 11 months ago

Has anyone ever written this kind of code though? Is a rule worth it considering the extra time necessary to check for this condition? Perhaps there is precedence in other linters?

dsherret commented 11 months ago

It seems people write this kind of code: https://github.com/search?type=code&q=%22await+await+%22+language%3AJavaScript&l=JavaScript (maybe when coming from other languages like c# where this is necessary)

not-my-profile commented 11 months ago

I have written this code by accident ... you can easily end up with await await when copy'n'pasting code.

dsherret commented 11 months ago

Maybe deno fmt should just remove multiple awaits.

not-my-profile commented 11 months ago

As I explained in the issue description await await can result in different behavior than just await, so I think this change would be too dangerous for deno fmt, which I'd expect to never change the semantics of code.

nayeemrmn commented 11 months ago

I'm surprised the tsc warning isn't shown in this case

'await' has no effect on the type of this expression. deno-ts(80007)

While the number of await keywords can affect which promise job is executed first

Does that really happen when awaiting a non-promise?

not-my-profile commented 11 months ago

I'm surprised the tsc warning isn't shown in this case

Oh, ... yeah me too. In case we get that warning to work then this lint is probably redundant.

Does that really happen when awaiting a non-promise?

Yes, according to the ECMAScript standard it even must happen.

dsherret commented 11 months ago

It does affect it, but I wouldn't consider it too dangerous. That said, considering it does change execution that's reasonable to not do it for formatting.

I'm surprised the tsc warning isn't shown in this case

image

Considering this is already handled by tsc, I think we should not add this to deno_lint. I'm going to close this issue.

not-my-profile commented 11 months ago

I guess we should open a new issue at denoland/deno about that tsc warning not being reported for await await fetch('/test');?

dsherret commented 11 months ago

I guess we should open a new issue at denoland/deno about that tsc warning not being reported for await await fetch('/test');?

It is reported as a warning in the editor.

image

not-my-profile commented 11 months ago

But not by deno check?

nayeemrmn commented 11 months ago

image

Ah, seems to work inconsistently: image

dsherret commented 11 months ago

Oh yeah. Looks like typescript is only reporting this as a suggestion diagnostic, which we don't surface except in the editor. Perhaps it being reported via deno lint would still be good. I'm going to reopen.

not-my-profile commented 11 months ago

Slightly getting off-topic but would it make sense to add a deno check flag to also report suggestion diagnostics? Although it seems like the tsc CLI doesn't have such a flag.