- Notifications
You must be signed in to change notification settings - Fork13.2k
Control flow for constructor initialized properties#37920
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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
weswigham commentedApr 13, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@ahejlsberg do we have a test for the declaration emit of a property like this? afaik none of the cases in |
ahejlsberg commentedApr 13, 2020
@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 |
ahejlsberg commentedApr 14, 2020
@typescript-bot user test this |
typescript-bot commentedApr 14, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Heya@ahejlsberg, I've started to run the parallelized community code test suite on this PR atdf98d9c. You can monitor the buildhere. |
typescript-bot commentedApr 14, 2020
The user suite test run you requested has finished andfailed. I've opened aPR with the baseline diff from master. |
ahejlsberg commentedApr 14, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@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. |
sandersn commentedApr 14, 2020
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.) |
ahejlsberg commentedApr 16, 2020
@typescript-bot user test this |
typescript-bot commentedApr 16, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Heya@ahejlsberg, I've started to run the parallelized community code test suite on this PR at728d9cb. You can monitor the buildhere. |
ahejlsberg commentedApr 16, 2020
@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 |
ahejlsberg commentedApr 21, 2020
@typescript-bot test this |
typescript-bot commentedApr 21, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Heya@ahejlsberg, I've started to run the extended test suite on this PR atab993c2. You can monitor the buildhere. |
typescript-bot commentedApr 21, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Heya@ahejlsberg, I've started to run the parallelized Definitely Typed test suite on this PR atab993c2. You can monitor the buildhere. |
typescript-bot commentedApr 21, 2020 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Heya@ahejlsberg, I've started to run the parallelized community code test suite on this PR atab993c2. You can monitor the buildhere. |
| // 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.
Uh oh!
There was an error while loading.Please reload this page.
With this PR we use control flow analysis of
this.xxxassignments in constructors to determine the types of properties that have no type annotations or initializers..tsfiles we perform control flow analysis for properties declared with no type annotation or initializer when innoImplicitAnymode..jsfiles 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.xxxassignment in the constructor.In the following example, control flow analysis determines the type of
xto bestring | numberbased on thethis.xassignments in the constructor:In
.jsfiles we would previously determine the type of a property with no explicit declaration from local analysis of allthis.xxxassignments 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
anywhen they are assignment targets in the constructor body. This an effect of how CFA auto-typing works.Fixes#37900.