Skip to content

More precise property-overwritten-by-spread errors #37192

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

Merged
merged 2 commits into from
Mar 3, 2020

Conversation

sandersn
Copy link
Member

@sandersn sandersn commented Mar 3, 2020

Trying to do this check in getSpreadType just doesn't have enough information, so I moved it to checkObjectLiteral, which is a better place for issuing errors anyway.

Unfortunately, the approach is kind of expensive in that it

  1. creates a new map for each property and
  2. iterates over all properties of the spread type, even if it's a union.

I have some ideas to improve (1) that might work out. I'm not sure how bad (2) is since we're going to iterate over all properties of all
constituents of a union.

Fixes #36779

Trying to do this check in getSpreadType just doesn't have enough
information, so I moved it to checkObjectLiteral, which is a better
place for issuing errors anyway.

Unfortunately, the approach is kind of expensive in that it

1. creates a new map for each property and
2. iterates over all properties of the spread type, even if it's a
union.

I have some ideas to improve (1) that might work out. I'm not sure how
bad (2) is since we're going to iterate over all properties of all
constituents of a union.

Fixes #36779
Copy link
Member

@weswigham weswigham left a comment

Choose a reason for hiding this comment

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

Small nit that should remove some casts, but overall I like this more than the awkward isParentTypeNullable flag on getSpreadType.

@@ -22560,6 +22548,7 @@ namespace ts {
let patternWithComputedProperties = false;
let hasComputedStringProperty = false;
let hasComputedNumberProperty = false;
const propertyDeclarations = createMap<Symbol>();
Copy link
Member

Choose a reason for hiding this comment

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

createSymbolTable or createUnderscoreEscapedMap tbh

@sandersn
Copy link
Member Author

sandersn commented Mar 3, 2020

@typescript-bot perf test this

@typescript-bot
Copy link
Collaborator

typescript-bot commented Mar 3, 2020

Heya @sandersn, I've started to run the perf test suite on this PR at 35bbfdc. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

@sandersn
The results of the perf run you requested are in!

Here they are:

Comparison Report - master..37192

Metric master 37192 Delta Best Worst
Angular - node (v10.16.3, x64)
Memory used 334,334k (± 0.05%) 333,825k (± 0.03%) -509k (- 0.15%) 333,634k 334,059k
Parse Time 1.62s (± 0.61%) 1.61s (± 0.69%) -0.01s (- 0.43%) 1.59s 1.64s
Bind Time 0.89s (± 0.82%) 0.89s (± 0.75%) +0.00s (+ 0.23%) 0.87s 0.90s
Check Time 4.70s (± 0.53%) 4.71s (± 0.52%) +0.01s (+ 0.15%) 4.64s 4.76s
Emit Time 5.30s (± 0.48%) 5.31s (± 0.82%) +0.02s (+ 0.32%) 5.22s 5.42s
Total Time 12.51s (± 0.28%) 12.53s (± 0.43%) +0.02s (+ 0.17%) 12.41s 12.65s
Monaco - node (v10.16.3, x64)
Memory used 335,259k (± 0.01%) 335,250k (± 0.02%) -9k (- 0.00%) 335,078k 335,348k
Parse Time 1.25s (± 0.82%) 1.26s (± 0.46%) +0.01s (+ 0.48%) 1.24s 1.27s
Bind Time 0.78s (± 0.94%) 0.78s (± 0.77%) -0.00s (- 0.26%) 0.76s 0.79s
Check Time 4.72s (± 0.64%) 4.73s (± 0.60%) +0.01s (+ 0.25%) 4.66s 4.79s
Emit Time 2.93s (± 0.71%) 2.92s (± 0.81%) -0.01s (- 0.24%) 2.87s 2.97s
Total Time 9.67s (± 0.33%) 9.68s (± 0.45%) +0.01s (+ 0.12%) 9.59s 9.75s
TFS - node (v10.16.3, x64)
Memory used 299,484k (± 0.02%) 299,440k (± 0.01%) -44k (- 0.01%) 299,381k 299,521k
Parse Time 0.94s (± 0.59%) 0.94s (± 0.39%) -0.01s (- 0.64%) 0.93s 0.94s
Bind Time 0.74s (± 0.49%) 0.74s (± 0.91%) +0.00s (+ 0.00%) 0.73s 0.76s
Check Time 4.27s (± 0.49%) 4.28s (± 0.41%) +0.01s (+ 0.28%) 4.25s 4.32s
Emit Time 3.03s (± 0.75%) 3.05s (± 0.70%) +0.02s (+ 0.63%) 3.00s 3.09s
Total Time 8.99s (± 0.37%) 9.01s (± 0.43%) +0.02s (+ 0.28%) 8.93s 9.10s
material-ui - node (v10.16.3, x64)
Memory used 488,881k (± 0.01%) 488,729k (± 0.02%) -152k (- 0.03%) 488,439k 488,871k
Parse Time 1.77s (± 0.34%) 1.77s (± 0.25%) -0.01s (- 0.39%) 1.76s 1.78s
Bind Time 0.68s (± 0.76%) 0.68s (± 0.59%) -0.00s (- 0.00%) 0.67s 0.69s
Check Time 13.62s (± 0.93%) 13.51s (± 0.65%) -0.11s (- 0.79%) 13.37s 13.80s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 16.08s (± 0.81%) 15.97s (± 0.56%) -0.11s (- 0.69%) 15.82s 16.25s
Angular - node (v12.1.0, x64)
Memory used 309,968k (± 0.14%) 309,566k (± 0.06%) -402k (- 0.13%) 308,897k 309,822k
Parse Time 1.58s (± 0.53%) 1.57s (± 0.69%) -0.01s (- 0.44%) 1.55s 1.60s
Bind Time 0.87s (± 0.87%) 0.87s (± 0.94%) +0.00s (+ 0.46%) 0.85s 0.89s
Check Time 4.62s (± 0.69%) 4.63s (± 0.62%) +0.01s (+ 0.22%) 4.55s 4.68s
Emit Time 5.48s (± 1.25%) 5.46s (± 1.20%) -0.02s (- 0.35%) 5.35s 5.67s
Total Time 12.54s (± 0.75%) 12.53s (± 0.72%) -0.01s (- 0.10%) 12.34s 12.80s
Monaco - node (v12.1.0, x64)
Memory used 315,184k (± 0.01%) 315,206k (± 0.02%) +22k (+ 0.01%) 315,079k 315,409k
Parse Time 1.20s (± 0.40%) 1.20s (± 0.79%) +0.00s (+ 0.17%) 1.18s 1.22s
Bind Time 0.74s (± 1.10%) 0.75s (± 0.91%) +0.00s (+ 0.40%) 0.74s 0.77s
Check Time 4.55s (± 0.26%) 4.56s (± 0.44%) +0.01s (+ 0.22%) 4.51s 4.60s
Emit Time 2.96s (± 0.72%) 2.95s (± 0.76%) -0.01s (- 0.30%) 2.90s 2.99s
Total Time 9.46s (± 0.28%) 9.46s (± 0.38%) +0.01s (+ 0.05%) 9.34s 9.53s
TFS - node (v12.1.0, x64)
Memory used 281,780k (± 0.02%) 281,756k (± 0.02%) -25k (- 0.01%) 281,646k 281,976k
Parse Time 0.92s (± 0.79%) 0.92s (± 0.81%) -0.00s (- 0.22%) 0.90s 0.93s
Bind Time 0.71s (± 0.97%) 0.71s (± 2.24%) +0.00s (+ 0.71%) 0.69s 0.77s
Check Time 4.18s (± 0.72%) 4.17s (± 0.44%) -0.01s (- 0.12%) 4.14s 4.22s
Emit Time 3.08s (± 1.35%) 3.08s (± 0.72%) -0.01s (- 0.23%) 3.04s 3.15s
Total Time 8.89s (± 0.57%) 8.88s (± 0.30%) -0.00s (- 0.05%) 8.82s 8.95s
material-ui - node (v12.1.0, x64)
Memory used 466,312k (± 0.02%) 466,177k (± 0.01%) -135k (- 0.03%) 466,079k 466,283k
Parse Time 1.74s (± 0.33%) 1.75s (± 0.42%) +0.01s (+ 0.40%) 1.74s 1.77s
Bind Time 0.62s (± 0.95%) 0.63s (± 0.58%) +0.00s (+ 0.32%) 0.62s 0.63s
Check Time 12.05s (± 0.54%) 12.11s (± 0.99%) +0.06s (+ 0.47%) 11.88s 12.38s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 14.41s (± 0.46%) 14.48s (± 0.84%) +0.07s (+ 0.46%) 14.26s 14.75s
Angular - node (v8.9.0, x64)
Memory used 329,366k (± 0.01%) 328,893k (± 0.01%) -472k (- 0.14%) 328,805k 329,020k
Parse Time 2.11s (± 0.32%) 2.10s (± 0.36%) -0.01s (- 0.52%) 2.08s 2.11s
Bind Time 0.92s (± 0.87%) 0.92s (± 0.76%) -0.00s (- 0.11%) 0.91s 0.94s
Check Time 5.51s (± 0.44%) 5.47s (± 0.53%) -0.04s (- 0.74%) 5.40s 5.54s
Emit Time 6.23s (± 0.90%) 6.20s (± 0.69%) -0.03s (- 0.55%) 6.08s 6.29s
Total Time 14.78s (± 0.43%) 14.69s (± 0.44%) -0.09s (- 0.60%) 14.49s 14.81s
Monaco - node (v8.9.0, x64)
Memory used 333,576k (± 0.02%) 333,516k (± 0.01%) -60k (- 0.02%) 333,417k 333,592k
Parse Time 1.54s (± 0.66%) 1.54s (± 0.38%) +0.00s (+ 0.07%) 1.53s 1.55s
Bind Time 0.90s (± 0.66%) 0.90s (± 1.19%) +0.00s (+ 0.56%) 0.88s 0.93s
Check Time 5.40s (± 0.60%) 5.44s (± 0.83%) +0.04s (+ 0.70%) 5.33s 5.52s
Emit Time 3.55s (± 0.56%) 3.51s (± 0.44%) -0.03s (- 0.96%) 3.47s 3.54s
Total Time 11.38s (± 0.36%) 11.39s (± 0.51%) +0.01s (+ 0.05%) 11.23s 11.51s
TFS - node (v8.9.0, x64)
Memory used 298,881k (± 0.02%) 298,905k (± 0.02%) +24k (+ 0.01%) 298,788k 299,011k
Parse Time 1.25s (± 0.53%) 1.25s (± 0.32%) -0.00s (- 0.32%) 1.24s 1.26s
Bind Time 0.75s (± 0.69%) 0.75s (± 0.74%) +0.00s (+ 0.13%) 0.74s 0.76s
Check Time 4.83s (± 1.44%) 4.79s (± 0.48%) -0.04s (- 0.79%) 4.75s 4.84s
Emit Time 3.34s (± 1.92%) 3.36s (± 0.77%) +0.02s (+ 0.69%) 3.31s 3.41s
Total Time 10.17s (± 0.32%) 10.15s (± 0.35%) -0.02s (- 0.19%) 10.08s 10.23s
material-ui - node (v8.9.0, x64)
Memory used 494,722k (± 0.01%) 494,501k (± 0.01%) -221k (- 0.04%) 494,380k 494,604k
Parse Time 2.11s (± 0.53%) 2.10s (± 0.67%) -0.00s (- 0.05%) 2.08s 2.14s
Bind Time 0.82s (± 1.35%) 0.81s (± 1.41%) -0.01s (- 1.10%) 0.78s 0.83s
Check Time 19.54s (± 0.47%) 19.58s (± 1.00%) +0.04s (+ 0.19%) 19.28s 20.07s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 22.46s (± 0.47%) 22.49s (± 0.92%) +0.03s (+ 0.14%) 22.18s 23.04s
Angular - node (v8.9.0, x86)
Memory used 188,954k (± 0.03%) 188,731k (± 0.03%) -224k (- 0.12%) 188,594k 188,917k
Parse Time 2.05s (± 0.77%) 2.05s (± 0.48%) -0.00s (- 0.00%) 2.03s 2.07s
Bind Time 1.07s (± 1.10%) 1.07s (± 0.60%) +0.00s (+ 0.28%) 1.06s 1.09s
Check Time 5.07s (± 0.95%) 5.04s (± 0.45%) -0.03s (- 0.61%) 4.99s 5.09s
Emit Time 6.19s (± 1.27%) 6.13s (± 0.44%) -0.06s (- 1.03%) 6.07s 6.19s
Total Time 14.38s (± 0.92%) 14.29s (± 0.23%) -0.10s (- 0.66%) 14.19s 14.33s
Monaco - node (v8.9.0, x86)
Memory used 189,214k (± 0.02%) 189,221k (± 0.02%) +7k (+ 0.00%) 189,138k 189,328k
Parse Time 1.58s (± 0.99%) 1.59s (± 0.65%) +0.00s (+ 0.25%) 1.56s 1.61s
Bind Time 0.77s (± 0.87%) 0.77s (± 0.91%) +0.00s (+ 0.26%) 0.76s 0.79s
Check Time 5.35s (± 1.51%) 5.30s (± 2.11%) -0.05s (- 0.93%) 5.14s 5.51s
Emit Time 3.01s (± 3.38%) 3.04s (± 3.83%) +0.03s (+ 1.06%) 2.83s 3.22s
Total Time 10.71s (± 0.33%) 10.70s (± 0.39%) -0.01s (- 0.12%) 10.62s 10.80s
TFS - node (v8.9.0, x86)
Memory used 170,430k (± 0.02%) 170,436k (± 0.03%) +6k (+ 0.00%) 170,354k 170,539k
Parse Time 1.28s (± 0.73%) 1.28s (± 0.75%) -0.00s (- 0.08%) 1.26s 1.30s
Bind Time 0.72s (± 0.77%) 0.72s (± 0.69%) -0.00s (- 0.28%) 0.71s 0.73s
Check Time 4.62s (± 1.13%) 4.61s (± 0.67%) -0.01s (- 0.13%) 4.54s 4.69s
Emit Time 2.99s (± 1.87%) 2.96s (± 0.91%) -0.03s (- 0.87%) 2.89s 3.02s
Total Time 9.61s (± 0.58%) 9.57s (± 0.44%) -0.03s (- 0.35%) 9.48s 9.64s
material-ui - node (v8.9.0, x86)
Memory used 277,168k (± 0.02%) 277,114k (± 0.01%) -54k (- 0.02%) 277,023k 277,157k
Parse Time 2.17s (± 0.38%) 2.17s (± 0.58%) -0.00s (- 0.18%) 2.15s 2.20s
Bind Time 0.69s (± 1.16%) 0.69s (± 1.88%) -0.00s (- 0.15%) 0.67s 0.73s
Check Time 17.72s (± 0.80%) 17.63s (± 0.84%) -0.09s (- 0.52%) 17.24s 17.97s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 20.58s (± 0.69%) 20.49s (± 0.70%) -0.10s (- 0.48%) 20.13s 20.82s
System
Machine Namets-ci-ubuntu
Platformlinux 4.4.0-166-generic
Architecturex64
Available Memory16 GB
Available Memory1 GB
CPUs4 × Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Hosts
  • node (v10.16.3, x64)
  • node (v12.1.0, x64)
  • node (v8.9.0, x64)
  • node (v8.9.0, x86)
Scenarios
  • Angular - node (v10.16.3, x64)
  • Angular - node (v12.1.0, x64)
  • Angular - node (v8.9.0, x64)
  • Angular - node (v8.9.0, x86)
  • Monaco - node (v10.16.3, x64)
  • Monaco - node (v12.1.0, x64)
  • Monaco - node (v8.9.0, x64)
  • Monaco - node (v8.9.0, x86)
  • TFS - node (v10.16.3, x64)
  • TFS - node (v12.1.0, x64)
  • TFS - node (v8.9.0, x64)
  • TFS - node (v8.9.0, x86)
  • material-ui - node (v10.16.3, x64)
  • material-ui - node (v12.1.0, x64)
  • material-ui - node (v8.9.0, x64)
  • material-ui - node (v8.9.0, x86)
Benchmark Name Iterations
Current 37192 10
Baseline master 10

@sandersn
Copy link
Member Author

sandersn commented Mar 3, 2020

Perf seems OK as-is, so I'm going to skip any fanciness and just change the name and constructor of propertyDeclarations.

(I was going to try to spill from propertiesTable to propertyDeclarations, not creating propertyDeclarations in object literals with no spreads. Fancy, but takes more code and harder to read.)

@sandersn sandersn merged commit b481dd4 into master Mar 3, 2020
@sandersn sandersn deleted the more-precise-property-overwritten-by-spread branch March 3, 2020 23:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3.9 regression: bogus property-will-be-overwritten-by-spread errors
3 participants