feat: report class evaluation TDZ errors in no-use-before-define #15134
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Prerequisites checklist
What is the purpose of this pull request? (put an "X" next to an item)
[ ] Documentation update
[x] Bug fix (template)
[ ] New rule (template)
[ ] Changes an existing rule (template)
[ ] Add autofixing to a rule
[ ] Add a CLI option
[ ] Add something to the core
[ ] Other, please explain:
This bug fix produces only more warnings.
Tell us about your environment
What parser (default,
@babel/eslint-parser
,@typescript-eslint/parser
, etc.) are you using?default
Please show your full configuration:
Configuration
What did you do? Please include the actual source code causing the issue.
What did you expect to happen?
no-use-before-define
to report all references marked as "TDZ error" in the above examples.What actually happened? Please include the actual, raw output from ESLint.
No errors.
What changes did you make? (Give an overview)
Fixed the
no-use-before-define
rule for ClassDefinitionEvaluation steps. Class heritage and computed properties are evaluated before initializing the class binding (A
andB
create classBinding in the class scope; they also create an outer variable but the references from the class definition are to the inner one, and the outer one is initialized even later). Static initializers are run after the class binding is initialized (if it exists), but still before initializingC
inconst C = class ...
and before declarations that appear after the class (const x
).Is there anything you'd like reviewers to focus on?
Examples that don't require new syntax are reproducible as false negatives in v7.32.0, too (demo link). This is a bug fix regarding
extends
and computed properties, and a sort of enhancement regarding static field initializers since they're implicit functions. This rule doesn't track function calls, but in this case we can know when they will be called.