@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,7 +1,6 @@
1
- import type { Confidence } from "../config.ts";
1
+ import type { Confidence } from "../contract/contract.generated.ts";
2
2
  import { evaluateEdges, type EdgeEvaluation } from "../edges.ts";
3
3
  import type { CompletedFinding } from "../finding.ts";
4
- import { liveFilesAt } from "../matrix.ts";
5
4
  import { declarationKey } from "../ref.ts";
6
5
  import { ledgerOf, type Dials, type Ledger, type SuppressionRecord } from "../suppress.ts";
7
6
  import { insideSkipped } from "../type-errors.ts";
@@ -11,12 +10,12 @@ import type { Emitter, EmitterInput, Emitters } from "./emitter.ts";
11
10
  import { interfaces } from "./interfaces.ts";
12
11
  import { intraFunction } from "./intra-function.ts";
13
12
  import { nonCodeArtifacts } from "./non-code-artifacts.ts";
14
- import { readsAndWrites } from "./reads-and-writes.ts";
13
+ import { fallingWithWrites, readsAndWrites } from "./reads-and-writes.ts";
15
14
  import { selfCheck } from "./self-check.ts";
16
15
  import { fallenMembers, unusedDeclarations } from "./unused-declarations.ts";
17
16
  import { visibilityNarrowing } from "./visibility-narrowing.ts";
18
17
 
19
- /** Every kind family this analyzer reports, each by its emitter, in code order. */
18
+ /** Every emitter this analyzer runs, by the name its tests select it by. */
20
19
  export const EMITTERS: Emitters = new Map<string, Emitter>([
21
20
  ["unused-declarations", unusedDeclarations],
22
21
  ["visibility-narrowing", visibilityNarrowing],
@@ -28,42 +27,19 @@ export const EMITTERS: Emitters = new Map<string, Emitter>([
28
27
  ["intra-function", intraFunction],
29
28
  ]);
30
29
 
31
- /**
32
- * The keys of every declaration an unanswered question could have kept live, which the run
33
- * reports nothing about: a finding about one would be computed from the gap.
34
- */
35
- function heldKeys(input: EmitterInput): ReadonlySet<string> {
36
- const held = new Set(input.swept.heldByUnanswered);
37
- if (held.size === 0) {
38
- return held;
39
- }
30
+ /** The keys of the declarations the identifiers name, as {@link findingKey} keys a finding. */
31
+ function keysOf(input: EmitterInput, ids: Iterable<string>): ReadonlySet<string> {
32
+ const named = new Set(ids);
40
33
  return new Set(
41
34
  input.swept.matrix.union.symbols
42
- .filter((symbol) => held.has(symbol.id))
35
+ .filter((symbol) => named.has(symbol.id))
43
36
  .map((symbol) => declarationKey(symbol.ref, symbol.position.path)),
44
37
  );
45
38
  }
46
39
 
47
- /**
48
- * The keys of every top-level declaration of a live component file. The file's
49
- * markup may use each of them, which no analysis of the markup can rule out, so the run
50
- * reports nothing about one while the file is live.
51
- */
52
- function markupKeys(input: EmitterInput): ReadonlySet<string> {
53
- const { swept } = input;
54
- if (swept.componentFiles.length === 0) {
55
- return new Set();
56
- }
57
- const live = new Set(
58
- liveFilesAt(swept.matrix, swept.sweep, new Set(swept.componentFiles)).map(
59
- (symbol) => symbol.id,
60
- ),
61
- );
62
- return new Set(
63
- swept.matrix.union.symbols
64
- .filter((symbol) => live.has(symbol.parent))
65
- .map((symbol) => declarationKey(symbol.ref, symbol.position.path)),
66
- );
40
+ /** The key of the declaration a finding is about, or of the one holding the part it is about. */
41
+ function findingKey(finding: CompletedFinding): string {
42
+ return declarationKey(finding.symbol.holder ?? finding.symbol.ref, finding.position.path);
67
43
  }
68
44
 
69
45
  /** What the suppressions of a run swept under their marks are decided against. */
@@ -76,7 +52,7 @@ interface Suppressed {
76
52
 
77
53
  /** What the emitter table answers about one run. */
78
54
  interface DecidedFindings {
79
- /** Every finding the run reports, each family's in table order. */
55
+ /** Every finding the run reports, each emitter's in table order. */
80
56
  readonly findings: readonly CompletedFinding[];
81
57
  /** One evaluation per declared edge side of this language, ordered by edge, then by side. */
82
58
  readonly evaluations: readonly EdgeEvaluation<CompletedFinding>[];
@@ -91,15 +67,20 @@ interface DecidedFindings {
91
67
  /** How many findings the minimum confidence withheld at each confidence. */
92
68
  export type Withheld = Readonly<Record<Confidence, number>>;
93
69
 
94
- /** Every family's findings over one sweep, and those of any further emitter, completed by one step. */
70
+ /**
71
+ * Every emitter's findings over one sweep, and those of any further emitter, completed by
72
+ * one step, but none about a declaration that falls with a write-only subject: that
73
+ * subject's finding names it, so no finding about it exists for a record to match.
74
+ */
95
75
  function completedOver(
96
76
  input: EmitterInput,
97
77
  ...more: readonly Emitter[]
98
78
  ): readonly CompletedFinding[] {
79
+ const falls = keysOf(input, fallingWithWrites(input));
99
80
  return completed(
100
81
  input,
101
82
  [...EMITTERS.values(), ...more].flatMap((emit) => emit(input)),
102
- );
83
+ ).filter((finding) => !falls.has(findingKey(finding)));
103
84
  }
104
85
 
105
86
  /**
@@ -124,8 +105,8 @@ function dialsOver(
124
105
 
125
106
  /**
126
107
  * Every finding of one run swept under its suppressions' marks, decided in one pass: each
127
- * family's findings completed by one step, so every component number is minted once, the
128
- * finding each record claims withheld, the rest withheld by the dials, so a root one family
108
+ * emitter's findings completed by one step, so every component number is minted once, the
109
+ * finding each record claims withheld, the rest withheld by the dials, so a root one emitter
129
110
  * reports withholds what another reports in its component, and every declared edge
130
111
  * evaluated over what remains, so a pending finding is in its evaluation alone.
131
112
  */
@@ -145,7 +126,7 @@ function atPossible(input: EmitterInput): EmitterInput {
145
126
  const { config } = input;
146
127
  return {
147
128
  ...input,
148
- config: { ...config, analysis: { ...config.analysis, minConfidence: "possible" } },
129
+ config: { ...config, analysis: { ...config.analysis, min_confidence: "possible" } },
149
130
  };
150
131
  }
151
132
 
@@ -161,18 +142,23 @@ function dialledOver(
161
142
  unmarked: readonly CompletedFinding[],
162
143
  ): Omit<DecidedFindings, "would"> {
163
144
  const would = [...unmarked, ...found];
164
- const ledger = ledgerOf(suppressed.records, would, dialsOver(input, found, suppressed, unmarked));
165
- const unanswered = heldKeys(input);
166
- const markup = markupKeys(input);
167
- const candidates = found.filter((finding) => {
168
- const key = declarationKey(finding.symbol.holder ?? finding.symbol.ref, finding.position.path);
169
- return (
170
- !ledger.withheld(finding) &&
171
- !unanswered.has(key) &&
172
- !markup.has(key) &&
173
- !insideSkipped(input.swept.skipped, finding.position)
174
- );
175
- });
145
+ const { sweep } = input.swept;
146
+ // A hold is a gap of the analysis, which leaves a record it touches dormant; a live
147
+ // component file's markup is no gap, so a record on one of its bindings stays in effect.
148
+ const unanswered = keysOf(input, sweep.held);
149
+ const markup = keysOf(input, sweep.bindings);
150
+ const heldIds = new Set(sweep.held);
151
+ const held = (finding: CompletedFinding): boolean =>
152
+ unanswered.has(findingKey(finding)) || insideSkipped(input.swept.skipped, finding.position);
153
+ const ledger = ledgerOf(
154
+ suppressed.records,
155
+ would,
156
+ dialsOver(input, found, suppressed, unmarked),
157
+ { withholds: held, holdsRecord: (record) => heldIds.has(record.bound) },
158
+ );
159
+ const candidates = found.filter(
160
+ (finding) => !ledger.withheld(finding) && !held(finding) && !markup.has(findingKey(finding)),
161
+ );
176
162
  const kept = reportable(input, candidates);
177
163
  const evaluated = evaluateEdges(kept, input.boundary.edges, input.swept.matrix.union.symbols);
178
164
  return {
@@ -15,10 +15,10 @@ import {
15
15
  type Node,
16
16
  } from "@typescript/native/ast";
17
17
  import { SymbolFlags, type Symbol as TSSymbol, type Type } from "@typescript/native/sync";
18
- import { aliasChains } from "./alias-chain.ts";
19
- import { nodeKey, type Inventory } from "./inventory.ts";
20
- import { must, Unanswerable } from "./query.ts";
21
- import type { ProjectView } from "./session.ts";
18
+ import { aliasChains } from "../alias-chain.ts";
19
+ import { nodeKey, type Inventory } from "../inventory.ts";
20
+ import { must, Unanswerable } from "../query.ts";
21
+ import type { ProjectView } from "../session.ts";
22
22
 
23
23
  /** What one run knows about how its interfaces are implemented. */
24
24
  export interface Implementations {
@@ -11,8 +11,9 @@ import {
11
11
  SyntaxKind,
12
12
  type Node,
13
13
  } from "@typescript/native/ast";
14
- import type { ProjectView } from "./session.ts";
15
- import { sourceFilesOf } from "./source-files.ts";
14
+ import type { ProjectView } from "../session.ts";
15
+ import { sourceFilesOf } from "../source-files.ts";
16
+ import { bytewise } from "../text/compare.ts";
16
17
 
17
18
  /**
18
19
  * The text of each string literal, or template literal with no substitution, written as
@@ -41,5 +42,5 @@ export function inOperandNames<Brand>(
41
42
  file.forEachChild(visit);
42
43
  }
43
44
  }
44
- return [...found].sort();
45
+ return [...found].sort(bytewise);
45
46
  }
@@ -1,12 +1,10 @@
1
+ import { CODE } from "../contract/contract.generated.ts";
1
2
  import type { Finding, FindingPosition, PositionedSymbol } from "../finding.ts";
2
3
  import type { InventorySymbol } from "../inventory.ts";
3
4
  import { byPosition } from "../position.ts";
4
- import type { MatrixCandidate } from "../matrix.ts";
5
+ import type { Candidate } from "../liveness/sweep.ts";
5
6
  import type { Emitter, EmitterInput } from "./emitter.ts";
6
7
 
7
- const UNUSED_INTERFACE = "DS1201";
8
- const UNCALLED_INTERFACE_METHOD = "DS1203";
9
-
10
8
  /** What each finding says, by what the sweep found about the subject's references. */
11
9
  const UNUSED_MESSAGE = "nothing in the target names the interface as a type";
12
10
  const UNUSED_DEAD_MESSAGE =
@@ -23,7 +21,7 @@ function positionOf(symbol: InventorySymbol): FindingPosition {
23
21
  function indexed(input: EmitterInput): {
24
22
  readonly symbolOf: (id: string) => InventorySymbol | undefined;
25
23
  readonly inTest: (id: string) => boolean;
26
- readonly candidateOf: (id: string) => MatrixCandidate | undefined;
24
+ readonly candidateOf: (id: string) => Candidate | undefined;
27
25
  readonly implementationsOf: (id: string) => readonly PositionedSymbol[];
28
26
  } {
29
27
  const union = input.swept.matrix.union;
@@ -69,7 +67,7 @@ function findingOf(
69
67
 
70
68
  /**
71
69
  * The findings of the interfaces family, `DS1200` to `DS1299`: `DS1201`, a dead
72
- * interface, whose members fall with it unreported; and `DS1203`, a method of a live
70
+ * interface, whose members fall with it unreported; and `DS1202`, a method of a live
73
71
  * interface no reference names, unless it is a marker, a method whose every
74
72
  * implementation has an empty body. A test file's declaration is neither kind's subject,
75
73
  * because a production sweep counts none of the references it can have, save an interface
@@ -86,7 +84,7 @@ export const interfaces: Emitter = (input) => {
86
84
  if (symbol.kind === "interface") {
87
85
  found.push(
88
86
  findingOf(
89
- UNUSED_INTERFACE,
87
+ CODE.unusedInterface,
90
88
  symbol,
91
89
  unusedMessage(candidate),
92
90
  run.implementationsOf(candidate.id),
@@ -104,7 +102,7 @@ export const interfaces: Emitter = (input) => {
104
102
  }
105
103
  found.push(
106
104
  findingOf(
107
- UNCALLED_INTERFACE_METHOD,
105
+ CODE.uncalledInterfaceMethod,
108
106
  symbol,
109
107
  UNCALLED_MESSAGE,
110
108
  run.implementationsOf(symbol.parent),
@@ -115,7 +113,7 @@ export const interfaces: Emitter = (input) => {
115
113
  };
116
114
 
117
115
  /** What one unused interface's finding says, by the references the sweep counted. */
118
- function unusedMessage(candidate: MatrixCandidate): string {
116
+ function unusedMessage(candidate: Candidate): string {
119
117
  if (candidate.relation === "reachability") {
120
118
  return UNUSED_DEAD_MESSAGE;
121
119
  }
@@ -1,9 +1,9 @@
1
- import type { Confidence } from "../config.ts";
1
+ import { CODE, type Confidence } from "../contract/contract.generated.ts";
2
2
  import type { Finding } from "../finding.ts";
3
3
  import { KINDS } from "../kinds.ts";
4
4
  import { parameterRef } from "../ref.ts";
5
- import { UNUSED_PARAMETER, UNUSED_RESULT, type PartFact } from "../intra-function-parts.ts";
6
- import { reachedWithTheTests } from "../sweep.ts";
5
+ import { type PartFact } from "../intra-function-parts.ts";
6
+ import { reachedWithTheTests } from "../liveness/sweep.ts";
7
7
  import type { Emitter, EmitterInput } from "./emitter.ts";
8
8
 
9
9
  /** A list of rules as a sentence names them. */
@@ -42,7 +42,8 @@ type ParameterVerdict =
42
42
  * caller may pass a function used as a value more arguments than it declares, so there one
43
43
  * a read parameter follows is renamed to an underscore name, which the compilers read as
44
44
  * declared unread, and one no read parameter follows is deleted: kept where the call's
45
- * inference may read its annotation, at `probable` where nothing reads the annotation.
45
+ * inference may read its annotation, at `probable` where nothing reads the annotation or
46
+ * where it is a name a contextually typed object pattern binds.
46
47
  */
47
48
  function parameterVerdict(
48
49
  part: PartFact,
@@ -63,7 +64,8 @@ function parameterVerdict(
63
64
  if (place?.annotated === "steers") {
64
65
  return undefined;
65
66
  }
66
- return { fix: "delete", confidence: place?.annotated === "free" ? "probable" : "certain" };
67
+ const unseen = place?.annotated === "free" || place?.contextualPattern === true;
68
+ return { fix: "delete", confidence: unseen ? "probable" : "certain" };
67
69
  }
68
70
 
69
71
  /**
@@ -83,9 +85,9 @@ function reported(
83
85
  }
84
86
  const { free, freeButValued, discardedEverywhere } = input.intraFunction;
85
87
  switch (part.code) {
86
- case UNUSED_PARAMETER:
88
+ case CODE.unusedParameter:
87
89
  return parameterVerdict(part, free, freeButValued) !== undefined;
88
- case UNUSED_RESULT:
90
+ case CODE.unusedResult:
89
91
  return (
90
92
  free.has(part.declaration) &&
91
93
  discardedEverywhere.has(part.declaration) &&
@@ -97,7 +99,7 @@ function reported(
97
99
  }
98
100
 
99
101
  /**
100
- * The findings of the intra-function family, `DS1800` to `DS1899`, each about a part of
102
+ * The findings of the inside-functions family, `DS1401` to `DS1406`, each about a part of
101
103
  * the declaration its reference names, at the part's own position, whatever the sweep
102
104
  * decided about a production declaration. A part of test code is reported only where the
103
105
  * run that counts test references reaches its declaration and that is no test of dead
@@ -107,8 +109,8 @@ export const intraFunction: Emitter = (input) => {
107
109
  const union = input.swept.matrix.union;
108
110
  const byId = new Map(union.symbols.map((symbol) => [symbol.id, symbol]));
109
111
  const reached = reachedWithTheTests(union, [
110
- ...input.swept.exempt.map((record) => record.id),
111
- ...input.swept.heldByUnanswered,
112
+ ...input.swept.sweep.exempt.map((record) => record.id),
113
+ ...input.swept.sweep.held,
112
114
  ]);
113
115
  const testsOfDeadCode = new Set(
114
116
  input.swept.sweep.candidates.filter((one) => one.testOfDeadCode).map((one) => one.id),
@@ -125,7 +127,7 @@ export const intraFunction: Emitter = (input) => {
125
127
  }),
126
128
  );
127
129
  const { declared, loaded } = input.boundary.consumers;
128
- const closed = input.config.consumersComplete && declared.every((id) => loaded.includes(id));
130
+ const closed = input.config.consumers.complete && declared.every((id) => loaded.includes(id));
129
131
  const published = (id: string): boolean => {
130
132
  const symbol = byId.get(id);
131
133
  return (
@@ -144,12 +146,12 @@ export const intraFunction: Emitter = (input) => {
144
146
  const found: Finding[] = [];
145
147
  for (const part of input.intraFunction.parts) {
146
148
  const declaration = byId.get(part.declaration);
147
- const overlap = KINDS.get(part.code)?.overlap ?? [];
149
+ const overlap = KINDS.get(part.code)?.overlap?.ts ?? [];
148
150
  if (declaration === undefined || !judged(declaration.id) || !reported(input, part, unknown)) {
149
151
  continue;
150
152
  }
151
153
  const verdict =
152
- part.code === UNUSED_PARAMETER
154
+ part.code === CODE.unusedParameter
153
155
  ? parameterVerdict(part, input.intraFunction.free, input.intraFunction.freeButValued)
154
156
  : undefined;
155
157
  const message =
@@ -160,7 +162,7 @@ export const intraFunction: Emitter = (input) => {
160
162
  code: part.code,
161
163
  position: part.position,
162
164
  symbol: {
163
- ...(part.code === UNUSED_PARAMETER
165
+ ...(part.code === CODE.unusedParameter
164
166
  ? { ref: parameterRef(declaration.ref, part.name), holder: declaration.ref }
165
167
  : { ref: declaration.ref }),
166
168
  kind: part.kind,
@@ -1,10 +1,8 @@
1
- import type { Config } from "../config.ts";
1
+ import { CODE } from "../contract/contract.generated.ts";
2
+ import type { ResolvedConfig } from "../config.ts";
2
3
  import type { Finding } from "../finding.ts";
3
4
  import type { Emitter, EmitterInput } from "./emitter.ts";
4
5
 
5
- const FILE_NEVER_BUILT = "DS1501";
6
- const FILE_NEVER_IMPORTED = "DS1502";
7
-
8
6
  /** The subject kind of a finding about a source file, from the finding schema's vocabulary. */
9
7
  const FILE_SUBJECT = "file";
10
8
 
@@ -17,10 +15,10 @@ const FILE_START = 1;
17
15
  * completeness and listing no project declares it of a matrix the run derived, and a
18
16
  * derived matrix is never complete.
19
17
  */
20
- function completeMatrix(config: Config): boolean {
18
+ function completeMatrix(config: ResolvedConfig): boolean {
21
19
  return (
22
- config.analysis.matrixComplete &&
23
- config.analysis.configurations.some((entry) => entry.shape === "project")
20
+ config.analysis.matrix.complete &&
21
+ config.analysis.configurations.some((entry) => "project" in entry)
24
22
  );
25
23
  }
26
24
 
@@ -57,7 +55,7 @@ function fileNeverBuilt({ config, swept, files }: EmitterInput): readonly Findin
57
55
  const message = `no project of the build matrix includes this file (${swept.matrix.configurations.join(", ")})`;
58
56
  return files.tree
59
57
  .filter((file) => !built.has(file.path))
60
- .map((file) => fileFinding(FILE_NEVER_BUILT, file, message));
58
+ .map((file) => fileFinding(CODE.fileNeverBuilt, file, message));
61
59
  }
62
60
 
63
61
  /** The files of the run, each with whether a reference written in another file reaches it. */
@@ -152,22 +150,33 @@ function fileNeverImported(input: EmitterInput): readonly Finding[] {
152
150
  return referenced.has(symbol.position.path)
153
151
  ? {
154
152
  ...fileFinding(
155
- FILE_NEVER_IMPORTED,
153
+ CODE.fileNeverImported,
156
154
  file,
157
155
  "only code that is itself dead imports this file, and no root names it or a declaration in it",
158
156
  ),
159
157
  unreachableOnly: true as const,
160
158
  }
161
159
  : fileFinding(
162
- FILE_NEVER_IMPORTED,
160
+ CODE.fileNeverImported,
163
161
  file,
164
162
  "no import reaches this file and no root names it or a declaration in it",
165
163
  );
166
164
  });
167
165
  }
168
166
 
169
- /** The findings of the non-code-artifacts family, `DS1500` to `DS1599`. */
170
- export const nonCodeArtifacts: Emitter = (input) => [
171
- ...fileNeverBuilt(input),
172
- ...fileNeverImported(input),
173
- ];
167
+ /**
168
+ * The findings of the files family, `DS1600` to `DS1699`, each at the class `possible` in a
169
+ * package a command of which may run a file whose path no word of it writes, since that
170
+ * command may run the file (confidence.35).
171
+ */
172
+ export const nonCodeArtifacts: Emitter = (input) => {
173
+ const unwritten = [...(input.files.unwrittenRuns ?? [])];
174
+ return [...fileNeverBuilt(input), ...fileNeverImported(input)].map((finding) =>
175
+ unwritten.some(
176
+ (dir) =>
177
+ dir === "." || finding.position.path === dir || finding.position.path.startsWith(`${dir}/`),
178
+ )
179
+ ? { ...finding, reachabilityClass: "possible" as const }
180
+ : finding,
181
+ );
182
+ };