@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.21
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.
- package/README.md +3 -1
- package/THIRD_PARTY_NOTICES.md +27 -0
- package/dist/bin/mapper-connection.js +2 -1
- package/dist/bin/node-host.js +24 -5
- package/dist/src/alias-chain.js +35 -9
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +274 -496
- package/dist/src/augmentations.js +64 -3
- package/dist/src/automatic-types.js +10 -29
- package/dist/src/bindings.js +382 -0
- package/dist/src/commands/held.js +499 -0
- package/dist/src/commands/read.js +161 -0
- package/dist/src/commands/shell.js +169 -0
- package/dist/src/commands/tools.js +1847 -0
- package/dist/src/component-files.js +3 -2
- package/dist/src/component-layer.js +4 -2
- package/dist/src/config.js +6 -82
- package/dist/src/conformance-record.js +2 -2
- package/dist/src/consumers.js +10 -38
- package/dist/src/contextual-uses.js +57 -26
- package/dist/src/contract/config.generated.js +561 -0
- package/dist/src/contract/contract.generated.js +1370 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +165 -122
- package/dist/src/destructuring.js +1 -19
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +181 -168
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
- package/dist/src/entries/conventions.js +740 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
- package/dist/src/entries/run-directories.js +77 -0
- package/dist/src/entries/sources.js +144 -0
- package/dist/src/entries/static-module.js +670 -0
- package/dist/src/entries/test-runners.js +650 -0
- package/dist/src/entries/workflow-steps.js +345 -0
- package/dist/src/exemptions/argument-places.js +131 -0
- package/dist/src/exemptions/calls.js +338 -0
- package/dist/src/exemptions/classes.js +13 -0
- package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
- package/dist/src/exemptions/detectors.js +48 -0
- package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
- package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
- package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
- package/dist/src/exemptions/generated-file.js +241 -0
- package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
- package/dist/src/exemptions/installed-globals.js +173 -0
- package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
- package/dist/src/exemptions/lifecycle.js +150 -0
- package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
- package/dist/src/exemptions/serialization-contract.js +1276 -0
- package/dist/src/exemptions/sites.js +182 -0
- package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
- package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
- package/dist/src/exposure.js +400 -0
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/failure.js +36 -0
- package/dist/src/file-facts.js +3 -26
- package/dist/src/findings/completion.js +109 -56
- package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
- package/dist/src/findings/emitters.js +27 -41
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +16 -13
- package/dist/src/findings/non-code-artifacts.js +17 -12
- package/dist/src/findings/reads-and-writes.js +86 -27
- package/dist/src/findings/self-check.js +44 -30
- package/dist/src/findings/unused-declarations.js +29 -45
- package/dist/src/findings/visibility-narrowing.js +23 -31
- package/dist/src/findings-pass.js +13 -21
- package/dist/src/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +67 -0
- package/dist/src/fs/tree.js +88 -0
- package/dist/src/git-ignore.js +39 -26
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index/values.js +124 -0
- package/dist/src/index.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/intra-function-parts.js +63 -43
- package/dist/src/inventory/commonjs.js +507 -0
- package/dist/src/inventory/enumerate.js +167 -0
- package/dist/src/inventory/syntax.js +236 -0
- package/dist/src/inventory.js +323 -724
- package/dist/src/javascript-file.js +48 -0
- package/dist/src/json-document.js +198 -67
- package/dist/src/keyof-comparisons.js +126 -107
- package/dist/src/kinds.js +3 -366
- package/dist/src/{components.js → liveness/components.js} +2 -3
- package/dist/src/{graph.js → liveness/graph.js} +52 -28
- package/dist/src/liveness/matrix.js +99 -0
- package/dist/src/liveness/sweep.js +558 -0
- package/dist/src/load/classify.js +289 -0
- package/dist/src/load/diagnostics.js +87 -0
- package/dist/src/load/discover.js +285 -0
- package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
- package/dist/src/load/expected-module.js +136 -0
- package/dist/src/load/load.js +27 -0
- package/dist/src/load/module-lookup.js +37 -0
- package/dist/src/load/package-scope.js +56 -0
- package/dist/src/load/plan.js +313 -0
- package/dist/src/load/specifiers.js +113 -0
- package/dist/src/load/synthesize.js +152 -0
- package/dist/src/load/test-globals.js +207 -0
- package/dist/src/load/test-joins.js +82 -0
- package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
- package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
- package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
- package/dist/src/{workspace.js → load/workspace.js} +62 -124
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/partial.js +2 -1
- package/dist/src/paths.js +82 -16
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/position.js +43 -1
- package/dist/src/print.js +11 -79
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +95 -0
- package/dist/src/ref.js +12 -20
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +237 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +117 -1074
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +57 -41
- package/dist/src/reporters/annotations.js +15 -8
- package/dist/src/reporters/sarif.js +16 -10
- package/dist/src/reporters/template.js +4 -19
- package/dist/src/resolve.js +246 -730
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
- package/dist/src/roots/manifest.js +216 -0
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +487 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -343
- package/dist/src/scope.js +38 -115
- package/dist/src/session.js +37 -29
- package/dist/src/source-files.js +6 -10
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress-file.js +25 -28
- package/dist/src/suppress-inline.js +36 -83
- package/dist/src/suppress.js +50 -71
- package/dist/src/symbol-keys.js +92 -88
- package/dist/src/tests/file-class.js +76 -0
- package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
- package/dist/src/{test-support.js → tests/support.js} +5 -12
- package/dist/src/text/compare.js +26 -0
- package/dist/src/text/glob.js +194 -0
- package/dist/src/text/named-files.js +298 -0
- package/dist/src/text/yaml.js +684 -0
- package/dist/src/type-errors.js +11 -232
- package/dist/src/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/unwrap.js +23 -0
- package/dist/src/usage.js +10 -0
- package/dist/src/vendor/unbash/ansi-c.js +132 -0
- package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
- package/dist/src/vendor/unbash/arithmetic.js +591 -0
- package/dist/src/vendor/unbash/assignment.js +131 -0
- package/dist/src/vendor/unbash/chars.js +48 -0
- package/dist/src/vendor/unbash/command.js +41 -0
- package/dist/src/vendor/unbash/expansion.js +80 -0
- package/dist/src/vendor/unbash/glob.js +268 -0
- package/dist/src/vendor/unbash/heredoc.js +27 -0
- package/dist/src/vendor/unbash/internal-types.js +1 -0
- package/dist/src/vendor/unbash/lexer.js +4274 -0
- package/dist/src/vendor/unbash/limits.js +3 -0
- package/dist/src/vendor/unbash/parser.js +1366 -0
- package/dist/src/vendor/unbash/parts.js +57 -0
- package/dist/src/vendor/unbash/substitution-context.js +8 -0
- package/dist/src/vendor/unbash/traversal.js +212 -0
- package/dist/src/vendor/unbash/types.js +1 -0
- package/dist/src/vendor/unbash/word-value.js +61 -0
- package/dist/src/vendor/unbash/word.js +40 -0
- package/dist/src/verbs/analyze.js +194 -127
- package/dist/src/verbs/describe.js +13 -18
- package/dist/src/verbs/explain.js +85 -139
- package/dist/src/verbs/print-config.js +2 -1
- package/dist/src/verbs/print-projects.js +6 -4
- package/dist/src/verbs/print-retained.js +30 -6
- package/dist/src/verbs/print-roots.js +4 -2
- package/dist/src/verbs/verb.js +1 -5
- package/dist/src/verbs/version.js +14 -3
- package/jsr.json +2 -1
- package/package.json +14 -8
- package/src/alias-chain.ts +40 -11
- package/src/amd.ts +130 -0
- package/src/analysis.ts +426 -733
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- package/src/commands/held.ts +632 -0
- package/src/commands/read.ts +242 -0
- package/src/commands/shell.ts +228 -0
- package/src/commands/tools.ts +2382 -0
- package/src/component-files.ts +4 -2
- package/src/component-layer.ts +4 -2
- package/src/config.ts +31 -302
- package/src/conformance-record.ts +2 -2
- package/src/consumers.ts +16 -66
- package/src/contextual-uses.ts +66 -34
- package/src/contract/config.generated.ts +821 -0
- package/src/contract/contract.generated.ts +1453 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +223 -128
- package/src/destructuring.ts +1 -31
- package/src/edges.ts +41 -140
- package/src/element-access.ts +190 -187
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
- package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
- package/src/{conventions.ts → entries/conventions.ts} +367 -583
- package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
- package/src/entries/run-directories.ts +108 -0
- package/src/entries/sources.ts +266 -0
- package/src/entries/static-module.ts +858 -0
- package/src/entries/test-runners.ts +835 -0
- package/src/entries/workflow-steps.ts +432 -0
- package/src/exemptions/argument-places.ts +198 -0
- package/src/exemptions/calls.ts +483 -0
- package/src/exemptions/classes.ts +49 -0
- package/src/exemptions/decorator.ts +56 -0
- package/src/exemptions/detectors.ts +75 -0
- package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
- package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
- package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
- package/src/exemptions/generated-file.ts +318 -0
- package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
- package/src/exemptions/installed-globals.ts +255 -0
- package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
- package/src/exemptions/lifecycle.ts +286 -0
- package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
- package/src/exemptions/serialization-contract.ts +1729 -0
- package/src/exemptions/sites.ts +293 -0
- package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
- package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
- package/src/exposure.ts +492 -0
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/failure.ts +63 -0
- package/src/file-facts.ts +15 -25
- package/src/finding.ts +10 -10
- package/src/findings/boundary.ts +11 -0
- package/src/findings/completion.ts +133 -64
- package/src/findings/dependencies-and-module-machinery.ts +4 -7
- package/src/findings/emitter.ts +9 -10
- package/src/findings/emitters.ts +38 -52
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
- package/src/findings/interfaces.ts +7 -9
- package/src/findings/intra-function.ts +16 -14
- package/src/findings/non-code-artifacts.ts +24 -15
- package/src/findings/reads-and-writes.ts +118 -41
- package/src/findings/self-check.ts +51 -38
- package/src/findings/unused-declarations.ts +31 -49
- package/src/findings/visibility-narrowing.ts +36 -40
- package/src/findings-pass.ts +15 -31
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- package/src/git-ignore.ts +50 -26
- package/src/host.ts +12 -5
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index/values.ts +170 -0
- package/src/index.ts +2 -2
- package/src/indexed-access.ts +570 -527
- package/src/intra-function-parts.ts +73 -44
- package/src/inventory/commonjs.ts +696 -0
- package/src/inventory/enumerate.ts +203 -0
- package/src/inventory/syntax.ts +311 -0
- package/src/inventory.ts +442 -895
- package/src/javascript-file.ts +54 -0
- package/src/json-document.ts +241 -76
- package/src/keyof-comparisons.ts +133 -122
- package/src/kinds.ts +5 -413
- package/src/{components.ts → liveness/components.ts} +4 -6
- package/src/{graph.ts → liveness/graph.ts} +100 -35
- package/src/liveness/matrix.ts +162 -0
- package/src/liveness/sweep.ts +855 -0
- package/src/load/classify.ts +433 -0
- package/src/load/diagnostics.ts +154 -0
- package/src/load/discover.ts +471 -0
- package/src/{emit-map.ts → load/emit-map.ts} +1 -1
- package/src/load/expected-module.ts +194 -0
- package/src/load/load.ts +73 -0
- package/src/load/module-lookup.ts +50 -0
- package/src/load/package-scope.ts +74 -0
- package/src/load/plan.ts +513 -0
- package/src/load/specifiers.ts +171 -0
- package/src/load/synthesize.ts +230 -0
- package/src/load/test-globals.ts +251 -0
- package/src/load/test-joins.ts +98 -0
- package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
- package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
- package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
- package/src/{workspace.ts → load/workspace.ts} +90 -134
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/partial.ts +3 -2
- package/src/paths.ts +92 -16
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/position.ts +44 -1
- package/src/print.ts +12 -92
- package/src/product.ts +18 -0
- package/src/query.ts +201 -10
- package/src/ref.ts +12 -20
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +314 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +187 -1450
- package/src/report-schema.ts +68 -0
- package/src/report.ts +103 -226
- package/src/reporters/annotations.ts +22 -11
- package/src/reporters/json.ts +1 -1
- package/src/reporters/reporter.ts +2 -4
- package/src/reporters/reporters.ts +1 -1
- package/src/reporters/sarif.ts +29 -16
- package/src/reporters/template.ts +4 -20
- package/src/reporters/text.ts +3 -3
- package/src/resolve.ts +284 -1115
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
- package/src/roots/manifest.ts +303 -0
- package/src/roots/published-reach.ts +486 -0
- package/src/{roots.ts → roots/root-set.ts} +286 -469
- package/src/roots/unseen-loads.ts +345 -0
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -388
- package/src/scope.ts +46 -138
- package/src/session.ts +87 -55
- package/src/source-files.ts +6 -11
- package/src/stores.ts +15 -3
- package/src/suppress-file.ts +24 -33
- package/src/suppress-inline.ts +55 -91
- package/src/suppress.ts +78 -79
- package/src/symbol-keys.ts +104 -107
- package/src/tests/file-class.ts +135 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/text/compare.ts +27 -0
- package/src/text/glob.ts +210 -0
- package/src/text/named-files.ts +388 -0
- package/src/text/yaml.ts +747 -0
- package/src/type-errors.ts +18 -288
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/vendor/unbash/LICENSE +15 -0
- package/src/vendor/unbash/VENDORED.md +16 -0
- package/src/vendor/unbash/ansi-c.ts +132 -0
- package/src/vendor/unbash/arithmetic-parts.ts +53 -0
- package/src/vendor/unbash/arithmetic.ts +641 -0
- package/src/vendor/unbash/assignment.ts +163 -0
- package/src/vendor/unbash/chars.ts +48 -0
- package/src/vendor/unbash/command.ts +47 -0
- package/src/vendor/unbash/expansion.ts +144 -0
- package/src/vendor/unbash/glob.ts +284 -0
- package/src/vendor/unbash/heredoc.ts +34 -0
- package/src/vendor/unbash/internal-types.ts +94 -0
- package/src/vendor/unbash/lexer.ts +4352 -0
- package/src/vendor/unbash/limits.ts +3 -0
- package/src/vendor/unbash/parser.ts +1612 -0
- package/src/vendor/unbash/parts.ts +96 -0
- package/src/vendor/unbash/substitution-context.ts +20 -0
- package/src/vendor/unbash/traversal.ts +182 -0
- package/src/vendor/unbash/types.ts +660 -0
- package/src/vendor/unbash/word-value.ts +64 -0
- package/src/vendor/unbash/word.ts +50 -0
- package/src/verbs/analyze.ts +255 -164
- package/src/verbs/describe.ts +19 -17
- package/src/verbs/explain.ts +93 -169
- package/src/verbs/print-config.ts +2 -1
- package/src/verbs/print-projects.ts +6 -4
- package/src/verbs/print-retained.ts +36 -6
- package/src/verbs/print-roots.ts +4 -2
- package/src/verbs/verb.ts +2 -8
- package/src/verbs/version.ts +15 -3
- package/dist/src/base-url.js +0 -18
- package/dist/src/calls.js +0 -155
- package/dist/src/conventions.js +0 -937
- package/dist/src/discover.js +0 -468
- package/dist/src/entry-points.js +0 -529
- package/dist/src/exempt-classes.js +0 -75
- package/dist/src/exempt.js +0 -209
- package/dist/src/generated-file.js +0 -95
- package/dist/src/glob.js +0 -65
- package/dist/src/manifest.js +0 -165
- package/dist/src/matrix.js +0 -246
- package/dist/src/pnpm-workspace.js +0 -120
- package/dist/src/roots.js +0 -672
- package/dist/src/serialization-contract.js +0 -611
- package/dist/src/setup-failure.js +0 -23
- package/dist/src/sweep.js +0 -224
- package/dist/src/test-joins.js +0 -101
- package/dist/src/value-flow.js +0 -74
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/calls.ts +0 -225
- package/src/decorator.ts +0 -78
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- package/src/exempt-classes.ts +0 -123
- package/src/exempt.ts +0 -323
- package/src/generated-file.ts +0 -111
- package/src/glob.ts +0 -67
- package/src/manifest.ts +0 -234
- package/src/matrix.ts +0 -423
- package/src/pnpm-workspace.ts +0 -135
- package/src/serialization-contract.ts +0 -849
- package/src/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/value-flow.ts +0 -104
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* call sites that use or discard it, each statement control flow cannot reach, each
|
|
5
5
|
* write to a local that no read reaches, and each case an earlier case covers.
|
|
6
6
|
*/
|
|
7
|
+
import { CODE } from "./contract/contract.generated.js";
|
|
7
8
|
import { isArrowFunction, isAwaitExpression, isBigIntLiteral, isBinaryExpression, isBlock, isBreakStatement, isBindingElement, isCallExpression, isCaseClause, isCatchClause, isClassDeclaration, isClassExpression, isConstructorDeclaration, isContinueStatement, isDecorator, isDefaultClause, isEmptyStatement, isExportAssignment, isExportSpecifier, isExpressionStatement, isFunctionDeclaration, isFunctionExpression, isForInStatement, isForOfStatement, isFunctionLikeDeclaration, isHeritageClause, isIdentifier, isIfStatement, isImportClause, isImportSpecifier, isInterfaceDeclaration, isMethodDeclaration, isModuleDeclaration, isNamespaceImport, isNewExpression, isNoSubstitutionTemplateLiteral, isNumericLiteral, isObjectBindingPattern, isObjectLiteralExpression, isParenthesizedExpression, isPrefixUnaryExpression, isPropertyAssignment, isPropertyAccessExpression, isQualifiedName, isReturnStatement, isShorthandPropertyAssignment, isSourceFile, isStringLiteral, isSwitchStatement, isThrowStatement, isTypeAliasDeclaration, isTypeReferenceNode, isVariableDeclarationList, isVariableStatement, isVoidExpression, NodeFlags, SyntaxKind, } from "@typescript/native/ast";
|
|
8
9
|
import { SignatureKind } from "@typescript/native/sync";
|
|
9
10
|
import { exportsLocally, implicitReads, importBindings, } from "./import-bindings.js";
|
|
@@ -13,12 +14,7 @@ import { importRef } from "./ref.js";
|
|
|
13
14
|
import { isAnswered, UNANSWERED } from "./query.js";
|
|
14
15
|
import { signatureOf } from "./signatures.js";
|
|
15
16
|
import { spellsNoBinding } from "./spelled-names.js";
|
|
16
|
-
|
|
17
|
-
export const UNUSED_PARAMETER = "DS1801";
|
|
18
|
-
export const UNUSED_RESULT = "DS1803";
|
|
19
|
-
const UNREACHABLE_STATEMENT = "DS1805";
|
|
20
|
-
const DEAD_STORE = "DS1807";
|
|
21
|
-
const UNREACHABLE_CASE = "DS1809";
|
|
17
|
+
import { parenthesesRemoved } from "./unwrap.js";
|
|
22
18
|
/** The result types that carry no value, as the checker spells them. */
|
|
23
19
|
const NO_VALUE = new Set([
|
|
24
20
|
"void",
|
|
@@ -34,17 +30,13 @@ function spanOf(file, root, node) {
|
|
|
34
30
|
const endLine = file.getLineAndCharacterOfPosition(node.end).line + 1;
|
|
35
31
|
return { ...start, endLine };
|
|
36
32
|
}
|
|
37
|
-
/** The parenthesized expression's content, through every pair of parentheses. */
|
|
38
|
-
function unwrapped(node) {
|
|
39
|
-
return isParenthesizedExpression(node) ? unwrapped(node.expression) : node;
|
|
40
|
-
}
|
|
41
33
|
/** The node the parentheses around one expression sit in. */
|
|
42
34
|
function outerParent(node) {
|
|
43
35
|
return isParenthesizedExpression(node.parent) ? outerParent(node.parent) : node.parent;
|
|
44
36
|
}
|
|
45
37
|
/** The name a call is made through: the identifier, or the member a property access names. */
|
|
46
38
|
function calleeName(call) {
|
|
47
|
-
const callee =
|
|
39
|
+
const callee = parenthesesRemoved(call.expression);
|
|
48
40
|
if (isIdentifier(callee)) {
|
|
49
41
|
return callee;
|
|
50
42
|
}
|
|
@@ -99,7 +91,7 @@ function unreachableExempt(statement) {
|
|
|
99
91
|
}
|
|
100
92
|
/** The value a case expression is a literal of, as a key two equal literals share, or none. */
|
|
101
93
|
function caseKey(expression) {
|
|
102
|
-
const node =
|
|
94
|
+
const node = parenthesesRemoved(expression);
|
|
103
95
|
if (isStringLiteral(node) || isNoSubstitutionTemplateLiteral(node)) {
|
|
104
96
|
return `s:${node.text}`;
|
|
105
97
|
}
|
|
@@ -210,7 +202,7 @@ function extendedNames(files) {
|
|
|
210
202
|
named = isQualifiedName(type.typeName) ? type.typeName.right : type.typeName;
|
|
211
203
|
}
|
|
212
204
|
else {
|
|
213
|
-
const expression =
|
|
205
|
+
const expression = parenthesesRemoved(type.expression);
|
|
214
206
|
named = isPropertyAccessExpression(expression) ? expression.name : expression;
|
|
215
207
|
}
|
|
216
208
|
if (isIdentifier(named)) {
|
|
@@ -254,7 +246,7 @@ function decoratorFixes(constructor) {
|
|
|
254
246
|
}
|
|
255
247
|
/** The name an expression spells a class by: an identifier, or the member a property access names. */
|
|
256
248
|
function spelledName(expression) {
|
|
257
|
-
const node =
|
|
249
|
+
const node = parenthesesRemoved(expression);
|
|
258
250
|
if (isIdentifier(node)) {
|
|
259
251
|
return node;
|
|
260
252
|
}
|
|
@@ -447,8 +439,8 @@ export function projectParts(project, held, references, targetRoot) {
|
|
|
447
439
|
if ((isImportClause(node) || isNamespaceImport(node)) && node.name !== undefined) {
|
|
448
440
|
specifiers.add(position(node.name));
|
|
449
441
|
}
|
|
450
|
-
if (isExportAssignment(node) && isIdentifier(
|
|
451
|
-
specifiers.add(position(
|
|
442
|
+
if (isExportAssignment(node) && isIdentifier(parenthesesRemoved(node.expression))) {
|
|
443
|
+
specifiers.add(position(parenthesesRemoved(node.expression)));
|
|
452
444
|
}
|
|
453
445
|
if (isSwitchStatement(node)) {
|
|
454
446
|
const holder = holderOf(node);
|
|
@@ -572,7 +564,7 @@ export function projectParts(project, held, references, targetRoot) {
|
|
|
572
564
|
}
|
|
573
565
|
walk.catches.forEach(({ name, holder }, at) => {
|
|
574
566
|
parts.push({
|
|
575
|
-
code:
|
|
567
|
+
code: CODE.deadStore,
|
|
576
568
|
declaration: holder,
|
|
577
569
|
kind: "store",
|
|
578
570
|
name: name.text,
|
|
@@ -584,7 +576,7 @@ export function projectParts(project, held, references, targetRoot) {
|
|
|
584
576
|
for (const { names, uses, holder } of loopVariables) {
|
|
585
577
|
for (const name of names) {
|
|
586
578
|
parts.push({
|
|
587
|
-
code:
|
|
579
|
+
code: CODE.deadStore,
|
|
588
580
|
declaration: holder,
|
|
589
581
|
kind: "store",
|
|
590
582
|
name: name.text,
|
|
@@ -602,7 +594,7 @@ export function projectParts(project, held, references, targetRoot) {
|
|
|
602
594
|
});
|
|
603
595
|
for (const { statement, holder } of walk.unreachable) {
|
|
604
596
|
parts.push({
|
|
605
|
-
code:
|
|
597
|
+
code: CODE.unreachableStatement,
|
|
606
598
|
declaration: holder,
|
|
607
599
|
kind: "statement",
|
|
608
600
|
name: "statement",
|
|
@@ -613,7 +605,7 @@ export function projectParts(project, held, references, targetRoot) {
|
|
|
613
605
|
}
|
|
614
606
|
for (const { clause, text, holder } of walk.cases) {
|
|
615
607
|
parts.push({
|
|
616
|
-
code:
|
|
608
|
+
code: CODE.unreachableCase,
|
|
617
609
|
declaration: holder,
|
|
618
610
|
kind: "case",
|
|
619
611
|
name: text,
|
|
@@ -772,10 +764,9 @@ function calleeSteers(project, signature, at) {
|
|
|
772
764
|
}
|
|
773
765
|
/**
|
|
774
766
|
* The parts with each name of `contextual` judged where the compiler gives its function a
|
|
775
|
-
* contextual type:
|
|
776
|
-
*
|
|
777
|
-
*
|
|
778
|
-
* name read.
|
|
767
|
+
* contextual type: a name an object pattern binds is marked as one, and an annotated
|
|
768
|
+
* parameter with whether the call's inference may read its annotation. A question the
|
|
769
|
+
* checker leaves unanswered keeps the name read.
|
|
779
770
|
*/
|
|
780
771
|
function withContextualRead(project, parts, contextual) {
|
|
781
772
|
if (contextual.length === 0) {
|
|
@@ -791,15 +782,17 @@ function withContextualRead(project, parts, contextual) {
|
|
|
791
782
|
continue;
|
|
792
783
|
}
|
|
793
784
|
const place = one.part.parameter;
|
|
794
|
-
judged.set(one.part,
|
|
785
|
+
judged.set(one.part, answer === UNANSWERED || place === undefined
|
|
795
786
|
? { ...one.part, used: true }
|
|
796
|
-
:
|
|
797
|
-
...one.part,
|
|
798
|
-
|
|
799
|
-
...
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
787
|
+
: one.pattern
|
|
788
|
+
? { ...one.part, parameter: { ...place, contextualPattern: true } }
|
|
789
|
+
: {
|
|
790
|
+
...one.part,
|
|
791
|
+
parameter: {
|
|
792
|
+
...place,
|
|
793
|
+
annotated: calleeSteers(project, one.signature, one.at) ? "steers" : "free",
|
|
794
|
+
},
|
|
795
|
+
});
|
|
803
796
|
}
|
|
804
797
|
return parts.map((part) => judged.get(part) ?? part);
|
|
805
798
|
}
|
|
@@ -825,7 +818,7 @@ function parameterParts(file, root, declaration, signature, reader, ids, place)
|
|
|
825
818
|
return;
|
|
826
819
|
}
|
|
827
820
|
const part = {
|
|
828
|
-
code:
|
|
821
|
+
code: CODE.unusedParameter,
|
|
829
822
|
declaration,
|
|
830
823
|
kind: "parameter",
|
|
831
824
|
name: name.text,
|
|
@@ -884,15 +877,28 @@ function functionOf(block) {
|
|
|
884
877
|
}
|
|
885
878
|
}
|
|
886
879
|
/**
|
|
887
|
-
* The locals one block declares with `let`, `const
|
|
888
|
-
* block that spell it. A `var` of a nested
|
|
889
|
-
*
|
|
880
|
+
* The locals one block declares with `let`, `const`, `var` or a function declaration
|
|
881
|
+
* inside a function, each with the names of the block that spell it. A `var` of a nested
|
|
882
|
+
* block is one where no nested function of its function names it, since the function scope
|
|
883
|
+
* holds it past the block's end.
|
|
890
884
|
*/
|
|
891
885
|
function localsOf(block) {
|
|
892
886
|
const declared = [];
|
|
893
887
|
const scope = functionOf(block);
|
|
894
888
|
const outlives = scope?.body !== block;
|
|
895
889
|
block.statements.forEach((statement, at) => {
|
|
890
|
+
if (isFunctionDeclaration(statement)) {
|
|
891
|
+
if (scope !== undefined && statement.name !== undefined && statement.body !== undefined) {
|
|
892
|
+
declared.push({
|
|
893
|
+
name: statement.name,
|
|
894
|
+
statement: at,
|
|
895
|
+
initialized: true,
|
|
896
|
+
outlives: false,
|
|
897
|
+
hoisted: true,
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
return;
|
|
901
|
+
}
|
|
896
902
|
if (!isVariableStatement(statement)) {
|
|
897
903
|
return;
|
|
898
904
|
}
|
|
@@ -902,6 +908,11 @@ function localsOf(block) {
|
|
|
902
908
|
return;
|
|
903
909
|
}
|
|
904
910
|
for (const declaration of list.declarations) {
|
|
911
|
+
// A write to a local typed `never` is the compiler's exhaustiveness check, which
|
|
912
|
+
// fails to compile once a case goes unhandled.
|
|
913
|
+
if (declaration.type?.kind === SyntaxKind.NeverKeyword) {
|
|
914
|
+
continue;
|
|
915
|
+
}
|
|
905
916
|
for (const name of boundNames(declaration.name)) {
|
|
906
917
|
if (!blockScoped &&
|
|
907
918
|
outlives &&
|
|
@@ -913,6 +924,7 @@ function localsOf(block) {
|
|
|
913
924
|
statement: at,
|
|
914
925
|
initialized: declaration.initializer !== undefined,
|
|
915
926
|
outlives: !blockScoped && outlives,
|
|
927
|
+
hoisted: false,
|
|
916
928
|
});
|
|
917
929
|
}
|
|
918
930
|
}
|
|
@@ -931,7 +943,7 @@ function isPlainWrite(use) {
|
|
|
931
943
|
const parent = outerParent(use);
|
|
932
944
|
return (isBinaryExpression(parent) &&
|
|
933
945
|
parent.operatorToken.kind === SyntaxKind.EqualsToken &&
|
|
934
|
-
|
|
946
|
+
parenthesesRemoved(parent.left) === use);
|
|
935
947
|
}
|
|
936
948
|
/**
|
|
937
949
|
* The writes to the locals of one block that no read reaches. A write is a declaration's
|
|
@@ -944,7 +956,7 @@ function isPlainWrite(use) {
|
|
|
944
956
|
function deadStores(file, root, block, holder, locals, ids) {
|
|
945
957
|
const found = [];
|
|
946
958
|
const deadAt = (local, target) => ({
|
|
947
|
-
code:
|
|
959
|
+
code: CODE.deadStore,
|
|
948
960
|
declaration: holder,
|
|
949
961
|
kind: "store",
|
|
950
962
|
name: local.name.text,
|
|
@@ -953,12 +965,20 @@ function deadStores(file, root, block, holder, locals, ids) {
|
|
|
953
965
|
used: false,
|
|
954
966
|
});
|
|
955
967
|
for (const local of locals) {
|
|
956
|
-
const
|
|
968
|
+
const own = local.hoisted ? block.statements[local.statement] : undefined;
|
|
969
|
+
// A function's reads of itself keep it no more than its absence would.
|
|
970
|
+
const uses = local.uses.filter((use) => readsBinding(use, local.name, ids) && (own === undefined || !within(use, own)));
|
|
957
971
|
if (!local.outlives && uses.every(isPlainWrite)) {
|
|
958
|
-
|
|
972
|
+
// A declaration with no initializer writes `undefined`, the one store left to name.
|
|
973
|
+
const writes = [...(local.initialized ? [local.name] : []), ...uses];
|
|
974
|
+
const targets = writes.length === 0 ? [local.name] : writes;
|
|
959
975
|
found.push(...targets.map((target) => deadAt(local, target)));
|
|
960
976
|
continue;
|
|
961
977
|
}
|
|
978
|
+
// A read anywhere in the block reads a function declaration, which is written first.
|
|
979
|
+
if (local.hoisted) {
|
|
980
|
+
continue;
|
|
981
|
+
}
|
|
962
982
|
if (uses.some((use) => inNestedFunction(use, block))) {
|
|
963
983
|
continue;
|
|
964
984
|
}
|
|
@@ -969,12 +989,12 @@ function deadStores(file, root, block, holder, locals, ids) {
|
|
|
969
989
|
if (!isExpressionStatement(statement)) {
|
|
970
990
|
return undefined;
|
|
971
991
|
}
|
|
972
|
-
const expression =
|
|
992
|
+
const expression = parenthesesRemoved(statement.expression);
|
|
973
993
|
if (!isBinaryExpression(expression) ||
|
|
974
994
|
expression.operatorToken.kind !== SyntaxKind.EqualsToken) {
|
|
975
995
|
return undefined;
|
|
976
996
|
}
|
|
977
|
-
const target =
|
|
997
|
+
const target = parenthesesRemoved(expression.left);
|
|
978
998
|
return isIdentifier(target) && uses.includes(target)
|
|
979
999
|
? { target, value: expression.right }
|
|
980
1000
|
: undefined;
|
|
@@ -1052,7 +1072,7 @@ function resultParts(project, root, sites, references, calls) {
|
|
|
1052
1072
|
const valued = project.queries.nonNullable(result);
|
|
1053
1073
|
const members = isAnswered(valued) ? project.queries.propertiesOf(valued) : UNANSWERED;
|
|
1054
1074
|
found.push({
|
|
1055
|
-
code:
|
|
1075
|
+
code: CODE.unusedResult,
|
|
1056
1076
|
declaration: id,
|
|
1057
1077
|
kind: "result",
|
|
1058
1078
|
name: "result",
|