@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
package/dist/src/calls.js CHANGED
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * The calls and decorators of one project that the configured classes read: what each
3
3
  * callee resolves to, and which of the target's classes a call passes or a decorator
4
- * is attached to. A class is passed as an argument, or as an element of an array
5
- * literal or a property value of an object literal written as one, at any depth, and a
4
+ * is attached to. A class is passed by each value an argument can be, at any depth inside
5
+ * the array and object literals it writes, named directly or through variables, and a
6
6
  * decorator written as a call is a call.
7
7
  */
8
- import { isArrayLiteralExpression, isCallExpression, isClassDeclaration, isDecorator, isIdentifier, isObjectLiteralExpression, isParenthesizedExpression, isPropertyAccessExpression, isPropertyAssignment, isShorthandPropertyAssignment, isSpreadElement, } from "@typescript/native/ast";
9
- import { SymbolFlags } from "@typescript/native/sync";
8
+ import { isArrayLiteralExpression, isArrowFunction, isBinaryExpression, isBindingElement, isCallExpression, isClassDeclaration, isConditionalExpression, isDecorator, isFunctionDeclaration, isFunctionExpression, isIdentifier, isMethodDeclaration, isObjectLiteralExpression, isParameterDeclaration, isParenthesizedExpression, isPropertyAccessExpression, isPropertyAssignment, isPropertyDeclaration, isShorthandPropertyAssignment, isOmittedExpression, isSpreadAssignment, isSpreadElement, isVariableDeclaration, SyntaxKind, } from "@typescript/native/ast";
9
+ import { ObjectFlags, SymbolFlags, } from "@typescript/native/sync";
10
10
  import { nodeKey } from "./inventory.js";
11
11
  import { must } from "./query.js";
12
+ import { unwrapped } from "./unwrap.js";
12
13
  /** The name node a callee or a decorator expression resolves through, where it has one. */
13
14
  export function calleeName(expression) {
14
15
  if (isParenthesizedExpression(expression)) {
@@ -65,61 +66,296 @@ export function resolvedTargets(project, nodes) {
65
66
  });
66
67
  return targets;
67
68
  }
68
- /** The values one expression passes: itself, or what an array or object literal holds. */
69
- function passedIn(expression, found) {
70
- if (isParenthesizedExpression(expression)) {
71
- passedIn(expression.expression, found);
72
- return;
73
- }
74
- if (isArrayLiteralExpression(expression)) {
75
- for (const element of expression.elements) {
76
- passedIn(isSpreadElement(element) ? element.expression : element, found);
77
- }
78
- return;
69
+ /** The declaration a shorthand property's value resolves to, an import followed to what it names. */
70
+ function shorthandTarget(project, node) {
71
+ const value = must(project.shorthandValueAt(project.handle(node)));
72
+ if (value === undefined || (value.flags & SymbolFlags.Alias) === 0) {
73
+ return value;
79
74
  }
80
- if (isObjectLiteralExpression(expression)) {
81
- for (const property of expression.properties) {
82
- if (isPropertyAssignment(property)) {
83
- passedIn(property.initializer, found);
75
+ const aliased = must(project.queries.aliased(value));
76
+ return aliased.declarations.length === 0 ? undefined : aliased;
77
+ }
78
+ /**
79
+ * The values one expression passes: each value it can be ({@link leavesOf}), or what an
80
+ * array or object literal it can be holds, at any depth.
81
+ */
82
+ function passedIn(written, found) {
83
+ for (const expression of leavesOf(written)) {
84
+ if (isArrayLiteralExpression(expression)) {
85
+ for (const element of expression.elements) {
86
+ passedIn(element, found);
84
87
  }
85
- else if (isShorthandPropertyAssignment(property)) {
86
- found.push({ site: property.name, name: property, shorthand: true });
88
+ }
89
+ else if (isObjectLiteralExpression(expression)) {
90
+ for (const property of expression.properties) {
91
+ if (isPropertyAssignment(property)) {
92
+ passedIn(property.initializer, found);
93
+ }
94
+ else if (isSpreadAssignment(property)) {
95
+ passedIn(property.expression, found);
96
+ }
97
+ else if (isShorthandPropertyAssignment(property)) {
98
+ found.push({ site: property.name, name: property, shorthand: true });
99
+ }
87
100
  }
88
101
  }
89
- return;
102
+ else if (!isOmittedExpression(expression)) {
103
+ found.push({ site: expression, name: calleeName(expression), shorthand: false });
104
+ }
90
105
  }
91
- const name = calleeName(expression);
92
- if (name !== undefined) {
93
- found.push({ site: expression, name, shorthand: false });
106
+ }
107
+ /** The operators whose value is one of their operands. */
108
+ const CHOOSING = new Set([
109
+ SyntaxKind.QuestionQuestionToken,
110
+ SyntaxKind.BarBarToken,
111
+ SyntaxKind.AmpersandAmpersandToken,
112
+ ]);
113
+ /**
114
+ * The expressions one value can be: itself, or each branch of a conditional, each operand
115
+ * of `??`, `||` and `&&` and the last of a comma, inside any wrapper that changes no value.
116
+ * Each is read alone because the checker reduces a union by subtype, so the type at the
117
+ * whole drops a class structurally equal to, or a subtype of, another branch's.
118
+ */
119
+ function leavesOf(written) {
120
+ const expression = unwrapped(isSpreadElement(written) ? written.expression : written);
121
+ if (isConditionalExpression(expression)) {
122
+ return [...leavesOf(expression.whenTrue), ...leavesOf(expression.whenFalse)];
94
123
  }
124
+ if (isBinaryExpression(expression)) {
125
+ const operator = expression.operatorToken.kind;
126
+ if (CHOOSING.has(operator)) {
127
+ return [...leavesOf(expression.left), ...leavesOf(expression.right)];
128
+ }
129
+ if (operator === SyntaxKind.CommaToken) {
130
+ return leavesOf(expression.right);
131
+ }
132
+ }
133
+ return [expression];
95
134
  }
96
135
  /** The values one argument passes, a spread argument's included. */
97
- export function valuesPassed(argument) {
136
+ function leavesPassed(argument) {
98
137
  const found = [];
99
- passedIn(isSpreadElement(argument) ? argument.expression : argument, found);
138
+ passedIn(argument, found);
100
139
  return found;
101
140
  }
141
+ /** The values one argument passes that name their declaration. */
142
+ export function valuesPassed(argument) {
143
+ return leavesPassed(argument).filter((value) => value.name !== undefined);
144
+ }
102
145
  /**
103
- * The classes of the target each call passes, by the call. A value that names no
104
- * class of the target, a class of another program included, passes nothing here.
146
+ * What one passed value holds: the declaration its name resolves to, and the classes and
147
+ * functions the checker's type at it holds ({@link constructedAt}). `known` holds names
148
+ * already resolved in a batch.
149
+ */
150
+ function heldBy(project, value, known) {
151
+ const { name } = value;
152
+ if (name === undefined) {
153
+ return { named: undefined, typed: constructedAt(project, value.site) };
154
+ }
155
+ if (value.shorthand) {
156
+ return { named: shorthandTarget(project, name), typed: [] };
157
+ }
158
+ return {
159
+ named: known?.get(name) ?? resolvedTargets(project, [name]).get(name),
160
+ typed: constructedAt(project, value.site),
161
+ };
162
+ }
163
+ /**
164
+ * The classes of the target each call passes, by the call: each class a value an argument
165
+ * can be holds as a constructor, as the checker types it. A name whose type erases the
166
+ * class is followed through what its declaration binds ({@link boundTo}) and, for a
167
+ * parameter, through what each call of its function passes at its place, so a class handed
168
+ * to a wrapper is passed. A class is used at each value that passes it. A class of another
169
+ * program passes nothing.
105
170
  */
106
171
  export function classesPassed(project, held, chains, calls) {
107
- const passed = new Map(calls.map((call) => [call, call.arguments.flatMap((argument) => valuesPassed(argument))]));
108
- const all = [...passed.values()].flat();
109
- const targets = resolvedTargets(project, all.filter((value) => !value.shorthand).map((value) => value.name));
172
+ const passed = new Map(calls.map((call) => [call, call.arguments.flatMap(leavesPassed)]));
173
+ const targets = resolvedTargets(project, [...passed.values()].flat().flatMap((value) => (value.shorthand ? [] : (value.name ?? []))));
110
174
  const classes = new Set(held.symbols.filter((symbol) => symbol.kind === "class").map((symbol) => symbol.id));
111
- const classesOf = (value) => {
112
- const symbol = value.shorthand
113
- ? must(project.shorthandValueAt(project.handle(value.name)))
114
- : targets.get(value.name);
115
- return symbol === undefined
116
- ? []
117
- : chains.declarationsOf(symbol).filter((id) => classes.has(id));
175
+ let calling;
176
+ const callsOfFunction = (symbol) => {
177
+ calling ??= callsByDeclaration(project);
178
+ return symbol.declarations.flatMap((handle) => calling?.get(keyOf(handle)) ?? []);
179
+ };
180
+ const classesOf = (value, seen) => {
181
+ const { named, typed } = heldBy(project, value, targets);
182
+ return [
183
+ ...typed.flatMap((symbol) => chains.declarationsOf(symbol).filter((id) => classes.has(id))),
184
+ ...(named === undefined ? [] : reached(named, seen)),
185
+ ];
186
+ };
187
+ const reached = (symbol, seen) => {
188
+ const ids = chains.declarationsOf(symbol).filter((id) => classes.has(id));
189
+ if (ids.length > 0 || seen.has(symbol.id)) {
190
+ return ids;
191
+ }
192
+ seen.add(symbol.id);
193
+ const through = (written) => leavesPassed(written).flatMap((value) => classesOf(value, seen));
194
+ return symbol.declarations.flatMap((handle) => {
195
+ const node = project.declarationAt(handle)?.node;
196
+ if (node === undefined) {
197
+ return [];
198
+ }
199
+ if (isParameterDeclaration(node)) {
200
+ return argumentsAt(project, node, callsOfFunction).flatMap(through);
201
+ }
202
+ const bound = boundTo(project, node);
203
+ return [
204
+ ...(bound.written === undefined ? [] : through(bound.written)),
205
+ ...bound.symbols.flatMap((next) => reached(next, seen)),
206
+ ];
207
+ });
118
208
  };
119
- return new Map([...passed].map(([call, values]) => [
120
- call,
121
- values.flatMap((value) => classesOf(value).map((id) => ({ id, site: value.site }))),
122
- ]));
209
+ return new Map([...passed].map(([call, values]) => {
210
+ const uses = new Map();
211
+ for (const value of values) {
212
+ for (const id of classesOf(value, new Set())) {
213
+ uses.set(`${id}\u0000${String(value.site.pos)}`, { id, site: value.site });
214
+ }
215
+ }
216
+ return [call, [...uses.values()]];
217
+ }));
218
+ }
219
+ /**
220
+ * The symbols of the classes and functions the checker's type at one expression holds as
221
+ * values, each member of a union: the static side of a class or a function is an
222
+ * anonymous type its declaration's symbol names, which an instance's type is not.
223
+ */
224
+ function constructedAt(project, written) {
225
+ return heldIn(project, must(project.queries.typeAt(unwrapped(written))));
226
+ }
227
+ /** The classes and functions one type holds as values, as {@link constructedAt} reads them. */
228
+ function heldIn(project, type) {
229
+ const { queries } = project;
230
+ return (type === undefined ? [] : must(queries.constituents(type))).flatMap((part) => {
231
+ if (!part.isObjectType() || (part.objectFlags & ObjectFlags.Anonymous) === 0) {
232
+ return [];
233
+ }
234
+ return must(queries.symbolOfType(part)) ?? [];
235
+ });
236
+ }
237
+ /**
238
+ * What a variable, a property or a destructured binding binds its name to: a variable's
239
+ * or a property's initializer, the value a shorthand property names, or the property of
240
+ * the destructured value a binding element reads.
241
+ */
242
+ function boundTo(project, node) {
243
+ if (isShorthandPropertyAssignment(node)) {
244
+ const value = shorthandTarget(project, node);
245
+ return { symbols: value === undefined ? [] : [value] };
246
+ }
247
+ if (isBindingElement(node)) {
248
+ const key = node.propertyName ?? node.name;
249
+ if (key === undefined || !isIdentifier(key)) {
250
+ return { symbols: [] };
251
+ }
252
+ const source = must(project.queries.typeAt(node.parent));
253
+ const property = source === undefined
254
+ ? undefined
255
+ : must(project.queries.propertiesOf(source)).find((one) => one.name === key.text);
256
+ return { symbols: property === undefined ? [] : [property] };
257
+ }
258
+ const written = initializerOf(node);
259
+ return written === undefined ? { symbols: [] } : { written, symbols: [] };
260
+ }
261
+ /** The value a variable or a property declaration binds its name to, where it writes one. */
262
+ function initializerOf(node) {
263
+ return isVariableDeclaration(node) || isPropertyAssignment(node) || isPropertyDeclaration(node)
264
+ ? node.initializer
265
+ : undefined;
266
+ }
267
+ /** The key of one declaration a symbol names, the same for each symbol the checker makes of it. */
268
+ function keyOf(handle) {
269
+ return `${handle.path}#${String(handle.index)}`;
270
+ }
271
+ /**
272
+ * Every call of the project by the declarations its callee can be: the function or the
273
+ * method it names, or else each function the checker's type at it holds, wherever that
274
+ * value came from. A name is also followed through what its binding copies
275
+ * ({@link boundTo}), which is how a call reaches a function an annotation erases.
276
+ * Only the target's own declarations are keys, as only its own functions are asked for.
277
+ */
278
+ function callsByDeclaration(project) {
279
+ const calls = callsOf(project);
280
+ const own = project.ownPaths();
281
+ const callees = resolvedTargets(project, calls.flatMap((call) => calleeName(call.expression) ?? []));
282
+ const named = new Map();
283
+ const keysOf = (symbol, seen) => {
284
+ const known = named.get(symbol.id);
285
+ if (known !== undefined || seen.has(symbol.id)) {
286
+ return known ?? [];
287
+ }
288
+ seen.add(symbol.id);
289
+ const keys = symbol.declarations
290
+ .filter((handle) => own.has(handle.path))
291
+ .flatMap((handle) => {
292
+ const node = project.declarationAt(handle)?.node;
293
+ const bound = node === undefined ? { symbols: [] } : boundTo(project, node);
294
+ const copied = [
295
+ ...bound.symbols,
296
+ ...(bound.written === undefined ? [] : leavesPassed(bound.written)).flatMap((value) => {
297
+ const { named: next, typed } = heldBy(project, value);
298
+ return [...typed, ...(next === undefined ? [] : [next])];
299
+ }),
300
+ ];
301
+ return [keyOf(handle), ...copied.flatMap((next) => keysOf(next, seen))];
302
+ });
303
+ named.set(symbol.id, keys);
304
+ return keys;
305
+ };
306
+ const calleeOf = (call) => {
307
+ const name = calleeName(call.expression);
308
+ return name === undefined ? undefined : callees.get(name);
309
+ };
310
+ const declared = (call) => ((calleeOf(call)?.flags ?? 0) & (SymbolFlags.Function | SymbolFlags.Method)) !== 0;
311
+ const typed = calls.filter((call) => !declared(call));
312
+ const types = new Map(project.queries
313
+ .typesAt(typed.map((call) => unwrapped(call.expression)))
314
+ .map((type, index) => [typed[index], must(type)]));
315
+ const found = new Map();
316
+ for (const call of calls) {
317
+ const callee = calleeOf(call);
318
+ const held = [
319
+ ...(callee === undefined ? [] : [callee]),
320
+ ...(types.has(call) ? heldIn(project, types.get(call)) : []),
321
+ ];
322
+ for (const key of new Set(held.flatMap((symbol) => keysOf(symbol, new Set())))) {
323
+ found.set(key, [...(found.get(key) ?? []), call]);
324
+ }
325
+ }
326
+ return found;
327
+ }
328
+ /**
329
+ * What each call of the function a parameter belongs to passes at the parameter's place,
330
+ * every argument from there on for a rest parameter. The function is the one the checker's
331
+ * type at its own declaration names, so a function with no name of its own is called too.
332
+ * A `this` parameter takes no place, and an argument at or after a spread argument passes
333
+ * at every place the spread's length can move it to.
334
+ */
335
+ function argumentsAt(project, parameter, callsOfFunction) {
336
+ const owner = parameter.parent;
337
+ if (!isFunctionDeclaration(owner) &&
338
+ !isMethodDeclaration(owner) &&
339
+ !isArrowFunction(owner) &&
340
+ !isFunctionExpression(owner)) {
341
+ return [];
342
+ }
343
+ const calls = new Set(constructedAt(project, owner).flatMap(callsOfFunction));
344
+ const [first] = owner.parameters;
345
+ const erased = first !== undefined && isIdentifier(first.name) && first.name.text === "this";
346
+ const place = owner.parameters.indexOf(parameter) - (erased ? 1 : 0);
347
+ const rest = parameter.dotDotDotToken !== undefined;
348
+ return [...calls].flatMap((call) => {
349
+ let spreads = 0;
350
+ return call.arguments.flatMap((argument, index) => {
351
+ const spread = isSpreadElement(argument);
352
+ const earliest = index - spreads;
353
+ spreads += spread ? 1 : 0;
354
+ const open = spread || earliest < index;
355
+ const lands = open ? rest || earliest <= place : rest ? index >= place : index === place;
356
+ return lands ? [spread ? argument.expression : argument] : [];
357
+ });
358
+ });
123
359
  }
124
360
  /** Every class declaration of the target that carries a decorator. */
125
361
  export function decoratedClasses(project, held) {