-
Notifications
You must be signed in to change notification settings - Fork 12.5k
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
Control flow for constructor initialized properties #37920
Conversation
@ahejlsberg do we have a test for the declaration emit of a property like this? afaik none of the cases in |
@weswigham Best I can tell there are several classes in that test that now have property types computed by CFA with no changes in baselines. I wouldn't expect any either since declaration emit just uses |
@typescript-bot user test this |
Heya @ahejlsberg, I've started to run the parallelized community code test suite on this PR at df98d9c. You can monitor the build here. |
The user suite test run you requested has finished and failed. I've opened a PR with the baseline diff from master. |
@sandersn I'm looking at the user test suite baseline changes, and so far things seem reasonable. The increased precision of CFA causes more errors in places as expected, for example when CFA discovers that a property is conditionally (instead of definitely) initialized in the constructor or that a property has an auto-type array type. The chrome-devtools errors are insanely hard to verify because there's no indentation in the code, but best I can tell they're to be expected. |
I ran a before/after perf comparison of 10 runs of chrome-devtools-frontend, since it's a nice big code base with lots of functions. Here's the average of 10 runs: Before, time: 15.94 s Before, memory: 751.06 MB Not that much difference actually. (@ahejlsberg only one file in chrome-devtools-frontend is indentation-free, and it's a checked-in dependency. I always just skip that one.) |
@typescript-bot user test this |
Heya @ahejlsberg, I've started to run the parallelized community code test suite on this PR at 728d9cb. You can monitor the build here. |
@sandersn Fixed some over eager widening in auto-typed assignments. User test baselines now look good. More errors because we figure out more types, but the errors are to be expected and some of them actually reveal questionable logic. I tried to get some perf numbers by running |
@typescript-bot test this |
Heya @ahejlsberg, I've started to run the extended test suite on this PR at ab993c2. You can monitor the build here. |
Heya @ahejlsberg, I've started to run the parallelized Definitely Typed test suite on this PR at ab993c2. You can monitor the build here. |
Heya @ahejlsberg, I've started to run the parallelized community code test suite on this PR at ab993c2. You can monitor the build here. |
// Return the inherited type of the given property or undefined if property doesn't exist in a base class. | ||
function getTypeOfPropertyInBaseClass(property: Symbol) { | ||
const classType = getDeclaringClass(property); | ||
const baseClassType = classType && getBaseTypes(classType)[0]; |
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.
Thinking of mixins, shouldn't we iterate through the base types list and get the property from the first base type which has it, rather than only checking the first base type?
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.
No, classes never have more than one base class, mixins or not.
With this PR we use control flow analysis of
this.xxx
assignments in constructors to determine the types of properties that have no type annotations or initializers..ts
files we perform control flow analysis for properties declared with no type annotation or initializer when innoImplicitAny
mode..js
files we perform control flow analysis for properties declared with no JSDoc type annotation or initializer, and properties with no explicit declaration but at least onethis.xxx
assignment in the constructor.In the following example, control flow analysis determines the type of
x
to bestring | number
based on thethis.x
assignments in the constructor:In
.js
files we would previously determine the type of a property with no explicit declaration from local analysis of allthis.xxx
assignments seen in the constructor and methods of the class. This analysis is less precise than control flow analysis, but we still use it as a fallback. With the increased precision of control flow analysis we now correctly discover properties that are conditionally (as opposed to definitely) initialized in constructors. We're also able to handle assignments of values that depend on previous assignment to the same property, as well as other scenarios that previously were deemed circular.The baseline changes are mostly because constructor declared properties are now considered to have type
any
when they are assignment targets in the constructor body. This an effect of how CFA auto-typing works.Fixes #37900.