@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +2 -7
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +269 -432
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/calls.js +279 -43
  12. package/dist/src/commands/held.js +499 -0
  13. package/dist/src/commands/read.js +161 -0
  14. package/dist/src/commands/shell.js +169 -0
  15. package/dist/src/commands/tools.js +1847 -0
  16. package/dist/src/component-files.js +3 -2
  17. package/dist/src/component-layer.js +4 -2
  18. package/dist/src/config.js +6 -82
  19. package/dist/src/conformance-record.js +1 -1
  20. package/dist/src/consumers.js +10 -38
  21. package/dist/src/contextual-uses.js +57 -26
  22. package/dist/src/contract/config.generated.js +561 -0
  23. package/dist/src/contract/contract.generated.js +1369 -0
  24. package/dist/src/contract/report.generated.js +866 -0
  25. package/dist/src/dependencies.js +164 -121
  26. package/dist/src/destructuring.js +1 -19
  27. package/dist/src/edges.js +38 -122
  28. package/dist/src/element-access.js +181 -168
  29. package/dist/src/entries/build-scripts.js +222 -0
  30. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  31. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  32. package/dist/src/entries/conventions.js +740 -0
  33. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  34. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  35. package/dist/src/entries/run-directories.js +77 -0
  36. package/dist/src/entries/sources.js +144 -0
  37. package/dist/src/entries/static-module.js +670 -0
  38. package/dist/src/entries/test-runners.js +650 -0
  39. package/dist/src/entries/workflow-steps.js +345 -0
  40. package/dist/src/enum-group.js +3 -10
  41. package/dist/src/erased-stores.js +4 -6
  42. package/dist/src/exempt-classes.js +1 -63
  43. package/dist/src/exempt.js +21 -66
  44. package/dist/src/exposure.js +400 -0
  45. package/dist/src/extensions.js +37 -0
  46. package/dist/src/facts.js +38 -0
  47. package/dist/src/failure.js +36 -0
  48. package/dist/src/file-facts.js +3 -26
  49. package/dist/src/findings/completion.js +109 -56
  50. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  51. package/dist/src/findings/emitters.js +27 -41
  52. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  53. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  54. package/dist/src/findings/interfaces.js +4 -5
  55. package/dist/src/findings/intra-function.js +16 -13
  56. package/dist/src/findings/non-code-artifacts.js +17 -12
  57. package/dist/src/findings/reads-and-writes.js +86 -27
  58. package/dist/src/findings/self-check.js +44 -30
  59. package/dist/src/findings/unused-declarations.js +29 -45
  60. package/dist/src/findings/visibility-narrowing.js +23 -31
  61. package/dist/src/findings-pass.js +13 -21
  62. package/dist/src/framework-lifecycle.js +46 -19
  63. package/dist/src/fs/document.js +52 -0
  64. package/dist/src/fs/manifest.js +67 -0
  65. package/dist/src/fs/tree.js +88 -0
  66. package/dist/src/generated-file.js +174 -28
  67. package/dist/src/git-ignore.js +39 -26
  68. package/dist/src/import-bindings.js +73 -28
  69. package/dist/src/index/sites.js +557 -0
  70. package/dist/src/index.js +2 -2
  71. package/dist/src/indexed-access.js +523 -478
  72. package/dist/src/injection-container.js +2 -2
  73. package/dist/src/interface-satisfaction.js +1 -1
  74. package/dist/src/intra-function-parts.js +63 -43
  75. package/dist/src/inventory/commonjs.js +507 -0
  76. package/dist/src/inventory/enumerate.js +167 -0
  77. package/dist/src/inventory/syntax.js +236 -0
  78. package/dist/src/inventory.js +323 -724
  79. package/dist/src/javascript-file.js +48 -0
  80. package/dist/src/json-document.js +198 -67
  81. package/dist/src/keyof-comparisons.js +126 -107
  82. package/dist/src/kinds.js +3 -366
  83. package/dist/src/{components.js → liveness/components.js} +2 -3
  84. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  85. package/dist/src/liveness/matrix.js +99 -0
  86. package/dist/src/liveness/sweep.js +558 -0
  87. package/dist/src/load/classify.js +289 -0
  88. package/dist/src/load/diagnostics.js +87 -0
  89. package/dist/src/load/discover.js +285 -0
  90. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  91. package/dist/src/load/expected-module.js +136 -0
  92. package/dist/src/load/load.js +27 -0
  93. package/dist/src/load/module-lookup.js +37 -0
  94. package/dist/src/load/package-scope.js +56 -0
  95. package/dist/src/load/plan.js +313 -0
  96. package/dist/src/load/specifiers.js +113 -0
  97. package/dist/src/load/synthesize.js +152 -0
  98. package/dist/src/load/test-globals.js +207 -0
  99. package/dist/src/load/test-joins.js +82 -0
  100. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  101. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  102. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  103. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  104. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  105. package/dist/src/module-declarations.js +70 -85
  106. package/dist/src/overrides.js +134 -112
  107. package/dist/src/partial.js +2 -1
  108. package/dist/src/paths.js +82 -16
  109. package/dist/src/platform-calls.js +78 -0
  110. package/dist/src/platform-symbols.js +134 -0
  111. package/dist/src/position.js +43 -1
  112. package/dist/src/print.js +11 -79
  113. package/dist/src/product.js +13 -0
  114. package/dist/src/query.js +47 -0
  115. package/dist/src/ref.js +12 -20
  116. package/dist/src/references/read-rule.js +1 -0
  117. package/dist/src/references/read-rules.js +48 -0
  118. package/dist/src/references/sink.js +237 -0
  119. package/dist/src/references/sources.js +450 -0
  120. package/dist/src/references.js +117 -1074
  121. package/dist/src/report-schema.js +51 -0
  122. package/dist/src/report.js +57 -41
  123. package/dist/src/reporters/annotations.js +15 -8
  124. package/dist/src/reporters/sarif.js +16 -10
  125. package/dist/src/reporters/template.js +4 -19
  126. package/dist/src/resolve.js +246 -730
  127. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  128. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  129. package/dist/src/roots/manifest.js +216 -0
  130. package/dist/src/roots/published-reach.js +412 -0
  131. package/dist/src/roots/root-set.js +487 -0
  132. package/dist/src/roots/unseen-loads.js +236 -0
  133. package/dist/src/run.js +66 -77
  134. package/dist/src/schema.js +320 -343
  135. package/dist/src/scope.js +38 -115
  136. package/dist/src/serialization-contract.js +601 -22
  137. package/dist/src/session.js +37 -29
  138. package/dist/src/source-files.js +6 -10
  139. package/dist/src/stores.js +4 -2
  140. package/dist/src/suppress-file.js +25 -28
  141. package/dist/src/suppress-inline.js +36 -83
  142. package/dist/src/suppress.js +50 -71
  143. package/dist/src/symbol-keys.js +92 -88
  144. package/dist/src/template-field.js +9 -19
  145. package/dist/src/tests/file-class.js +76 -0
  146. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  147. package/dist/src/{test-support.js → tests/support.js} +5 -12
  148. package/dist/src/text/compare.js +26 -0
  149. package/dist/src/text/glob.js +194 -0
  150. package/dist/src/text/named-files.js +298 -0
  151. package/dist/src/text/yaml.js +684 -0
  152. package/dist/src/type-errors.js +11 -232
  153. package/dist/src/type-parameter-reads.js +178 -139
  154. package/dist/src/unimplemented-callees.js +262 -242
  155. package/dist/src/unwrap.js +23 -0
  156. package/dist/src/usage.js +10 -0
  157. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  158. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  159. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  160. package/dist/src/vendor/unbash/assignment.js +131 -0
  161. package/dist/src/vendor/unbash/chars.js +48 -0
  162. package/dist/src/vendor/unbash/command.js +41 -0
  163. package/dist/src/vendor/unbash/expansion.js +80 -0
  164. package/dist/src/vendor/unbash/glob.js +268 -0
  165. package/dist/src/vendor/unbash/heredoc.js +27 -0
  166. package/dist/src/vendor/unbash/internal-types.js +1 -0
  167. package/dist/src/vendor/unbash/lexer.js +4274 -0
  168. package/dist/src/vendor/unbash/limits.js +3 -0
  169. package/dist/src/vendor/unbash/parser.js +1366 -0
  170. package/dist/src/vendor/unbash/parts.js +57 -0
  171. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  172. package/dist/src/vendor/unbash/traversal.js +212 -0
  173. package/dist/src/vendor/unbash/types.js +1 -0
  174. package/dist/src/vendor/unbash/word-value.js +61 -0
  175. package/dist/src/vendor/unbash/word.js +40 -0
  176. package/dist/src/verbs/analyze.js +194 -127
  177. package/dist/src/verbs/describe.js +13 -18
  178. package/dist/src/verbs/explain.js +85 -139
  179. package/dist/src/verbs/print-config.js +2 -1
  180. package/dist/src/verbs/print-projects.js +6 -4
  181. package/dist/src/verbs/print-retained.js +7 -5
  182. package/dist/src/verbs/print-roots.js +4 -2
  183. package/dist/src/verbs/verb.js +1 -5
  184. package/dist/src/verbs/version.js +14 -3
  185. package/jsr.json +2 -1
  186. package/package.json +14 -8
  187. package/src/alias-chain.ts +2 -9
  188. package/src/amd.ts +130 -0
  189. package/src/analysis.ts +424 -650
  190. package/src/augmentations.ts +93 -4
  191. package/src/automatic-types.ts +12 -30
  192. package/src/bindings.ts +460 -0
  193. package/src/calls.ts +338 -46
  194. package/src/commands/held.ts +632 -0
  195. package/src/commands/read.ts +242 -0
  196. package/src/commands/shell.ts +228 -0
  197. package/src/commands/tools.ts +2382 -0
  198. package/src/component-files.ts +4 -2
  199. package/src/component-layer.ts +4 -2
  200. package/src/config.ts +31 -302
  201. package/src/conformance-record.ts +1 -1
  202. package/src/consumers.ts +16 -66
  203. package/src/contextual-uses.ts +66 -34
  204. package/src/contract/config.generated.ts +821 -0
  205. package/src/contract/contract.generated.ts +1452 -0
  206. package/src/contract/report.generated.ts +1241 -0
  207. package/src/dependencies.ts +222 -127
  208. package/src/destructuring.ts +1 -31
  209. package/src/edges.ts +41 -140
  210. package/src/element-access.ts +190 -187
  211. package/src/entries/build-scripts.ts +292 -0
  212. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  213. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  214. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  215. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  216. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  217. package/src/entries/run-directories.ts +108 -0
  218. package/src/entries/sources.ts +266 -0
  219. package/src/entries/static-module.ts +858 -0
  220. package/src/entries/test-runners.ts +835 -0
  221. package/src/entries/workflow-steps.ts +432 -0
  222. package/src/enum-group.ts +2 -11
  223. package/src/erased-stores.ts +3 -7
  224. package/src/exempt-classes.ts +1 -75
  225. package/src/exempt.ts +70 -98
  226. package/src/exposure.ts +492 -0
  227. package/src/extensions.ts +45 -0
  228. package/src/facts.ts +46 -0
  229. package/src/failure.ts +63 -0
  230. package/src/file-facts.ts +15 -25
  231. package/src/finding.ts +10 -10
  232. package/src/findings/boundary.ts +11 -0
  233. package/src/findings/completion.ts +133 -64
  234. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  235. package/src/findings/emitter.ts +9 -10
  236. package/src/findings/emitters.ts +38 -52
  237. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  238. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  239. package/src/findings/interfaces.ts +7 -9
  240. package/src/findings/intra-function.ts +16 -14
  241. package/src/findings/non-code-artifacts.ts +24 -15
  242. package/src/findings/reads-and-writes.ts +118 -41
  243. package/src/findings/self-check.ts +51 -38
  244. package/src/findings/unused-declarations.ts +31 -49
  245. package/src/findings/visibility-narrowing.ts +36 -40
  246. package/src/findings-pass.ts +15 -31
  247. package/src/framework-lifecycle.ts +47 -19
  248. package/src/fs/document.ts +70 -0
  249. package/src/fs/manifest.ts +96 -0
  250. package/src/fs/tree.ts +110 -0
  251. package/src/generated-file.ts +242 -35
  252. package/src/git-ignore.ts +50 -26
  253. package/src/host.ts +12 -5
  254. package/src/import-bindings.ts +98 -29
  255. package/src/index/sites.ts +781 -0
  256. package/src/index.ts +2 -2
  257. package/src/indexed-access.ts +570 -527
  258. package/src/injection-container.ts +2 -2
  259. package/src/interface-satisfaction.ts +2 -2
  260. package/src/intra-function-parts.ts +73 -44
  261. package/src/inventory/commonjs.ts +696 -0
  262. package/src/inventory/enumerate.ts +203 -0
  263. package/src/inventory/syntax.ts +311 -0
  264. package/src/inventory.ts +442 -895
  265. package/src/javascript-file.ts +54 -0
  266. package/src/json-document.ts +241 -76
  267. package/src/keyof-comparisons.ts +133 -122
  268. package/src/kinds.ts +5 -413
  269. package/src/{components.ts → liveness/components.ts} +4 -6
  270. package/src/{graph.ts → liveness/graph.ts} +100 -35
  271. package/src/liveness/matrix.ts +162 -0
  272. package/src/liveness/sweep.ts +855 -0
  273. package/src/load/classify.ts +433 -0
  274. package/src/load/diagnostics.ts +154 -0
  275. package/src/load/discover.ts +471 -0
  276. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  277. package/src/load/expected-module.ts +194 -0
  278. package/src/load/load.ts +73 -0
  279. package/src/load/module-lookup.ts +50 -0
  280. package/src/load/package-scope.ts +74 -0
  281. package/src/load/plan.ts +513 -0
  282. package/src/load/specifiers.ts +171 -0
  283. package/src/load/synthesize.ts +230 -0
  284. package/src/load/test-globals.ts +251 -0
  285. package/src/load/test-joins.ts +98 -0
  286. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  287. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  288. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  289. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  290. package/src/{workspace.ts → load/workspace.ts} +90 -134
  291. package/src/module-declarations.ts +74 -98
  292. package/src/overrides.ts +162 -134
  293. package/src/partial.ts +3 -2
  294. package/src/paths.ts +92 -16
  295. package/src/platform-calls.ts +119 -0
  296. package/src/platform-symbols.ts +189 -0
  297. package/src/position.ts +44 -1
  298. package/src/print.ts +12 -92
  299. package/src/product.ts +18 -0
  300. package/src/query.ts +92 -0
  301. package/src/ref.ts +12 -20
  302. package/src/references/read-rule.ts +60 -0
  303. package/src/references/read-rules.ts +55 -0
  304. package/src/references/sink.ts +314 -0
  305. package/src/references/sources.ts +632 -0
  306. package/src/references.ts +187 -1450
  307. package/src/report-schema.ts +68 -0
  308. package/src/report.ts +103 -226
  309. package/src/reporters/annotations.ts +22 -11
  310. package/src/reporters/json.ts +1 -1
  311. package/src/reporters/reporter.ts +2 -4
  312. package/src/reporters/reporters.ts +1 -1
  313. package/src/reporters/sarif.ts +29 -16
  314. package/src/reporters/template.ts +4 -20
  315. package/src/reporters/text.ts +3 -3
  316. package/src/resolve.ts +284 -1115
  317. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
  318. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  319. package/src/roots/manifest.ts +303 -0
  320. package/src/roots/published-reach.ts +486 -0
  321. package/src/{roots.ts → roots/root-set.ts} +286 -469
  322. package/src/roots/unseen-loads.ts +345 -0
  323. package/src/run.ts +75 -91
  324. package/src/schema.ts +391 -388
  325. package/src/scope.ts +46 -138
  326. package/src/serialization-contract.ts +769 -23
  327. package/src/session.ts +87 -55
  328. package/src/source-files.ts +6 -11
  329. package/src/stores.ts +15 -3
  330. package/src/suppress-file.ts +24 -33
  331. package/src/suppress-inline.ts +55 -91
  332. package/src/suppress.ts +78 -79
  333. package/src/symbol-keys.ts +104 -107
  334. package/src/template-field.ts +15 -25
  335. package/src/tests/file-class.ts +135 -0
  336. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  337. package/src/{test-support.ts → tests/support.ts} +15 -21
  338. package/src/text/compare.ts +27 -0
  339. package/src/text/glob.ts +210 -0
  340. package/src/text/named-files.ts +388 -0
  341. package/src/text/yaml.ts +747 -0
  342. package/src/type-errors.ts +18 -288
  343. package/src/type-parameter-reads.ts +187 -158
  344. package/src/unimplemented-callees.ts +297 -280
  345. package/src/unwrap.ts +34 -0
  346. package/src/usage.ts +10 -0
  347. package/src/vendor/unbash/LICENSE +15 -0
  348. package/src/vendor/unbash/VENDORED.md +16 -0
  349. package/src/vendor/unbash/ansi-c.ts +132 -0
  350. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  351. package/src/vendor/unbash/arithmetic.ts +641 -0
  352. package/src/vendor/unbash/assignment.ts +163 -0
  353. package/src/vendor/unbash/chars.ts +48 -0
  354. package/src/vendor/unbash/command.ts +47 -0
  355. package/src/vendor/unbash/expansion.ts +144 -0
  356. package/src/vendor/unbash/glob.ts +284 -0
  357. package/src/vendor/unbash/heredoc.ts +34 -0
  358. package/src/vendor/unbash/internal-types.ts +94 -0
  359. package/src/vendor/unbash/lexer.ts +4352 -0
  360. package/src/vendor/unbash/limits.ts +3 -0
  361. package/src/vendor/unbash/parser.ts +1612 -0
  362. package/src/vendor/unbash/parts.ts +96 -0
  363. package/src/vendor/unbash/substitution-context.ts +20 -0
  364. package/src/vendor/unbash/traversal.ts +182 -0
  365. package/src/vendor/unbash/types.ts +660 -0
  366. package/src/vendor/unbash/word-value.ts +64 -0
  367. package/src/vendor/unbash/word.ts +50 -0
  368. package/src/verbs/analyze.ts +255 -164
  369. package/src/verbs/describe.ts +19 -17
  370. package/src/verbs/explain.ts +93 -169
  371. package/src/verbs/print-config.ts +2 -1
  372. package/src/verbs/print-projects.ts +6 -4
  373. package/src/verbs/print-retained.ts +7 -5
  374. package/src/verbs/print-roots.ts +4 -2
  375. package/src/verbs/verb.ts +2 -8
  376. package/src/verbs/version.ts +15 -3
  377. package/dist/src/base-url.js +0 -18
  378. package/dist/src/conventions.js +0 -937
  379. package/dist/src/discover.js +0 -468
  380. package/dist/src/entry-points.js +0 -529
  381. package/dist/src/glob.js +0 -65
  382. package/dist/src/manifest.js +0 -165
  383. package/dist/src/matrix.js +0 -246
  384. package/dist/src/pnpm-workspace.js +0 -120
  385. package/dist/src/roots.js +0 -672
  386. package/dist/src/setup-failure.js +0 -23
  387. package/dist/src/sweep.js +0 -224
  388. package/dist/src/test-joins.js +0 -101
  389. package/dist/src/version.js +0 -7
  390. package/dist/src/workflow-steps.js +0 -185
  391. package/src/base-url.ts +0 -24
  392. package/src/discover.ts +0 -653
  393. package/src/entry-points.ts +0 -687
  394. package/src/glob.ts +0 -67
  395. package/src/manifest.ts +0 -234
  396. package/src/matrix.ts +0 -423
  397. package/src/pnpm-workspace.ts +0 -135
  398. package/src/setup-failure.ts +0 -39
  399. package/src/sweep.ts +0 -347
  400. package/src/test-joins.ts +0 -120
  401. package/src/version.ts +0 -7
  402. package/src/workflow-steps.ts +0 -216
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * The uses contextual types make of the target's members, which no name node resolves to.
3
3
  * An object-literal property writes the member of its name on each constituent of the
4
- * literal's contextual type that declares one. A value reaching a position typed by another
5
- * object type reads each of its members that type declares, through array elements and
6
- * the parameters and results of functions and constructors too; a class instance there is
7
- * the interface-satisfaction class's evidence instead.
4
+ * literal's contextual type that declares one, and so does a property of a literal whose
5
+ * type is inferred, where a value of that type reaches such a position. A value reaching a
6
+ * position typed by another object type reads each of its members that type declares,
7
+ * through array elements and the parameters and results of functions and constructors
8
+ * too; a class instance there is the interface-satisfaction class's evidence instead.
8
9
  */
9
10
 
10
11
  import {
@@ -55,16 +56,12 @@ interface ContextualUse {
55
56
  readonly ids: readonly string[];
56
57
  }
57
58
 
58
- /** What the contextual types of one project's literals and values use, and what asking cost. */
59
+ /** What the contextual types of one project's literals and values use. */
59
60
  interface ContextualUses {
60
61
  /** Each literal property that writes a member, by the property's node. */
61
62
  readonly writes: readonly ContextualUse[];
62
63
  /** Each value whose members a position typed by another object type reads. */
63
64
  readonly reads: readonly ContextualUse[];
64
- /** The batched lookups: contextual types and value types, one per capped run. */
65
- readonly batches: number;
66
- /** The per-type lookups: each distinct type's constituents, properties and declaring symbol. */
67
- readonly lookups: number;
68
65
  }
69
66
 
70
67
  /**
@@ -109,10 +106,12 @@ interface Checked {
109
106
  readonly source: Type;
110
107
  readonly targets: readonly Type[];
111
108
  /**
112
- * Whether the source is declared outside the target, so code the analysis does not
113
- * hold reads the members of the target's types it declares.
109
+ * What the source is: a type whose members the target declares, which the position
110
+ * reads; one declared outside the target, so code the analysis does not hold reads the
111
+ * members of the target's types it declares; or an object literal's own type, whose
112
+ * properties write the position's members of their names.
114
113
  */
115
- readonly outside: boolean;
114
+ readonly sourceKind: "members" | "outside" | "literal";
116
115
  }
117
116
 
118
117
  /** One member of an object type, by the inventory's declarations and the checker's declaration handles. */
@@ -166,9 +165,6 @@ export function contextualUses<Brand>(
166
165
  .filter((symbol) => symbol.visibility === "private-name")
167
166
  .map((symbol) => symbol.id),
168
167
  );
169
- let batches = 0;
170
- let lookups = 0;
171
- const batchesOf = (count: number): number => Math.ceil(count / cap);
172
168
 
173
169
  const parts = new Map<number, readonly Type[]>();
174
170
  /** The object types one type is: itself, or its constituents at any depth. */
@@ -179,7 +175,6 @@ export function contextualUses<Brand>(
179
175
  }
180
176
  let found: readonly Type[] = [];
181
177
  if (type.isUnionType() || type.isIntersectionType()) {
182
- lookups += 1;
183
178
  const constituents = queries.constituents(type);
184
179
  found = isAnswered(constituents) ? constituents.flatMap(partsOf) : [];
185
180
  } else if (type.isObjectType()) {
@@ -198,7 +193,6 @@ export function contextualUses<Brand>(
198
193
  }
199
194
  const table = new Map<string, Member>();
200
195
  const read = properties.of(type);
201
- lookups += read.asked ? 1 : 0;
202
196
  for (const property of isAnswered(read.properties) ? read.properties : []) {
203
197
  table.set(property.name, {
204
198
  ids: chains
@@ -219,7 +213,6 @@ export function contextualUses<Brand>(
219
213
  };
220
214
 
221
215
  const writes: ContextualUse[] = [];
222
- batches += batchesOf(literals.length);
223
216
  const contexts = queries.contextualTypes(
224
217
  literals.map((one) => one.literal),
225
218
  cap,
@@ -235,7 +228,6 @@ export function contextualUses<Brand>(
235
228
  return name !== undefined && name.text === undefined ? [name.node] : [];
236
229
  }),
237
230
  );
238
- batches += batchesOf(computed.length);
239
231
  const keys = new Map<Node, string>();
240
232
  (computed.length === 0
241
233
  ? []
@@ -269,7 +261,6 @@ export function contextualUses<Brand>(
269
261
  });
270
262
 
271
263
  const carried = flows.filter((flow) => !isObjectLiteralExpression(flow.value));
272
- batches += batchesOf(carried.length);
273
264
  const types = queries.typesAt(
274
265
  carried.map((flow) => flow.value),
275
266
  cap,
@@ -287,17 +278,46 @@ export function contextualUses<Brand>(
287
278
  return members.length > 0 && members.every((member) => !member.own);
288
279
  };
289
280
 
281
+ const literalTypes = new Map<number, boolean>();
282
+ /**
283
+ * Whether an object type is an object literal's own, inferred where no contextual type
284
+ * names it: every member a property an object literal of the target writes.
285
+ */
286
+ const literalTyped = (part: Type): boolean => {
287
+ let known = literalTypes.get(part.id);
288
+ if (known === undefined) {
289
+ const members = [...membersOf(part).values()];
290
+ known =
291
+ members.length > 0 &&
292
+ members.every(
293
+ (member) =>
294
+ member.ids.length === 0 &&
295
+ member.declarations.length > 0 &&
296
+ member.declarations.every((handle) => literalProperty(handle) !== undefined),
297
+ );
298
+ literalTypes.set(part.id, known);
299
+ }
300
+ return known;
301
+ };
302
+ /** The name node of the object literal property one declaration handle names, if it is one. */
303
+ const literalProperty = (handle: NodeHandle): Node | undefined => {
304
+ const node = project.declarationAt(handle)?.node;
305
+ return node !== undefined &&
306
+ (isPropertyAssignment(node) || isShorthandPropertyAssignment(node)) &&
307
+ isObjectLiteralExpression(node.parent)
308
+ ? node.name
309
+ : undefined;
310
+ };
311
+
290
312
  const elements = new Map<number, Type | undefined>();
291
313
  /** The element type of an array type, read once per type. */
292
314
  const elementOf = (type: Type): Type | undefined => {
293
315
  if (elements.has(type.id)) {
294
316
  return elements.get(type.id);
295
317
  }
296
- lookups += 1;
297
318
  const isArray = queries.isArray(type);
298
319
  let element: Type | undefined;
299
320
  if (isAnswered(isArray) && isArray) {
300
- lookups += 1;
301
321
  const held = queries.typeArguments(type);
302
322
  element = isAnswered(held) ? held[0] : undefined;
303
323
  }
@@ -312,7 +332,6 @@ export function contextualUses<Brand>(
312
332
  if (known !== undefined) {
313
333
  return known;
314
334
  }
315
- lookups += type.isTypeReference() ? 1 : 0;
316
335
  const held = queries.typeArguments(type);
317
336
  const found = isAnswered(held) ? held : [];
318
337
  argumentsOf.set(type.id, found);
@@ -329,11 +348,9 @@ export function contextualUses<Brand>(
329
348
  if (known !== undefined) {
330
349
  return known;
331
350
  }
332
- lookups += 1;
333
351
  let kind = SignatureKind.Call;
334
352
  let signatures = queries.signaturesOf(type, kind);
335
353
  if (isAnswered(signatures) && signatures.length === 0) {
336
- lookups += 1;
337
354
  kind = SignatureKind.Construct;
338
355
  signatures = queries.signaturesOf(type, kind);
339
356
  }
@@ -342,7 +359,6 @@ export function contextualUses<Brand>(
342
359
  queries.parameterType(signature, index),
343
360
  );
344
361
  const result = queries.returnTypeOf(signature);
345
- lookups += parameters.length + 1;
346
362
  return {
347
363
  kind,
348
364
  parameters: parameters.map((one) => (isAnswered(one) ? one : undefined)),
@@ -379,9 +395,11 @@ export function contextualUses<Brand>(
379
395
  const sources = partsOf(source).filter((one) => !targets.some((part) => part.id === one.id));
380
396
  for (const one of sources) {
381
397
  if (carries(one)) {
382
- into.push({ source: one, targets, outside: false });
398
+ into.push({ source: one, targets, sourceKind: "members" });
383
399
  } else if (outside(one)) {
384
- into.push({ source: one, targets, outside: true });
400
+ into.push({ source: one, targets, sourceKind: "outside" });
401
+ } else if (literalTyped(one)) {
402
+ into.push({ source: one, targets, sourceKind: "literal" });
385
403
  }
386
404
  const element = elementOf(one);
387
405
  const called = element === undefined ? callsOf(one) : [];
@@ -423,7 +441,7 @@ export function contextualUses<Brand>(
423
441
  }
424
442
  seen.add(type.id);
425
443
  return partsOf(type).some((part) => {
426
- if (carries(part) || outside(part)) {
444
+ if (carries(part) || outside(part) || literalTyped(part)) {
427
445
  return true;
428
446
  }
429
447
  const element = elementOf(part);
@@ -438,12 +456,13 @@ export function contextualUses<Brand>(
438
456
  const type = types[index];
439
457
  return type === undefined || !isAnswered(type) || !mayCarry(type) ? [] : [{ flow, type }];
440
458
  });
441
- batches += batchesOf(sourced.length);
442
459
  const positions = queries.contextualTypes(
443
460
  sourced.map((one) => one.flow.value),
444
461
  cap,
445
462
  );
446
463
  const reads: ContextualUse[] = [];
464
+ // A literal property writes a position's members once, however many values carry it there.
465
+ const carriedWrites = new Set<string>();
447
466
  sourced.forEach(({ flow, type }, index) => {
448
467
  const position = positions[index];
449
468
  if (position === undefined || !isAnswered(position)) {
@@ -452,10 +471,24 @@ export function contextualUses<Brand>(
452
471
  const checked: Checked[] = [];
453
472
  compared(type, position, checked, new Set());
454
473
  const ids = new Set<string>();
455
- for (const { source, targets, outside: held } of checked) {
474
+ for (const { source, targets, sourceKind } of checked) {
456
475
  const tables = targets.map(membersOf);
457
476
  const sourceMembers = membersOf(source);
458
- if (held) {
477
+ if (sourceKind === "literal") {
478
+ for (const [name, member] of sourceMembers) {
479
+ const written = [...new Set(tables.flatMap((table) => table.get(name)?.ids ?? []))];
480
+ for (const at of written.length === 0 ? [] : member.declarations) {
481
+ const node = literalProperty(at);
482
+ const key = `${at.path}#${String(at.index)}>${written.join(",")}`;
483
+ if (node !== undefined && !carriedWrites.has(key)) {
484
+ carriedWrites.add(key);
485
+ writes.push({ at: node, from: flow.from, ids: written });
486
+ }
487
+ }
488
+ }
489
+ continue;
490
+ }
491
+ if (sourceKind === "outside") {
459
492
  for (const table of tables) {
460
493
  for (const [name, member] of table) {
461
494
  if (sourceMembers.has(name)) {
@@ -504,7 +537,6 @@ export function contextualUses<Brand>(
504
537
  isSpreadAssignment(property) ? [{ value: property.expression, from }] : [],
505
538
  ),
506
539
  );
507
- batches += batchesOf(spreads.length);
508
540
  const spreadTypes = queries.typesAt(
509
541
  spreads.map((one) => one.value),
510
542
  cap,
@@ -531,5 +563,5 @@ export function contextualUses<Brand>(
531
563
  reads.push({ at: value, from, ids });
532
564
  }
533
565
  });
534
- return { writes, reads, batches, lookups };
566
+ return { writes, reads };
535
567
  }