@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.
- 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 +2 -7
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +269 -432
- 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/calls.js +279 -43
- 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 +1 -1
- 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 +1369 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +164 -121
- 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/enum-group.js +3 -10
- package/dist/src/erased-stores.js +4 -6
- package/dist/src/exempt-classes.js +1 -63
- package/dist/src/exempt.js +21 -66
- 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/framework-lifecycle.js +46 -19
- 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/generated-file.js +174 -28
- 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.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/injection-container.js +2 -2
- package/dist/src/interface-satisfaction.js +1 -1
- 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 +47 -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/serialization-contract.js +601 -22
- 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/template-field.js +9 -19
- 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 +7 -5
- 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 +2 -9
- package/src/amd.ts +130 -0
- package/src/analysis.ts +424 -650
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- package/src/calls.ts +338 -46
- 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 +1 -1
- 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 +1452 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +222 -127
- 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/enum-group.ts +2 -11
- package/src/erased-stores.ts +3 -7
- package/src/exempt-classes.ts +1 -75
- package/src/exempt.ts +70 -98
- 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/framework-lifecycle.ts +47 -19
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- package/src/generated-file.ts +242 -35
- 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.ts +2 -2
- package/src/indexed-access.ts +570 -527
- package/src/injection-container.ts +2 -2
- package/src/interface-satisfaction.ts +2 -2
- 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 +92 -0
- 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} +27 -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/serialization-contract.ts +769 -23
- 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/template-field.ts +15 -25
- 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 +7 -5
- 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/conventions.js +0 -937
- package/dist/src/discover.js +0 -468
- package/dist/src/entry-points.js +0 -529
- 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/setup-failure.js +0 -23
- package/dist/src/sweep.js +0 -224
- package/dist/src/test-joins.js +0 -101
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- 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/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
package/src/findings/emitters.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { Confidence } from "../
|
|
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
|
|
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
|
-
|
|
33
|
-
|
|
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) =>
|
|
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
|
-
|
|
49
|
-
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
128
|
-
* finding each record claims withheld, the rest withheld by the dials, so a root one
|
|
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,
|
|
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
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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 "
|
|
19
|
-
import { nodeKey, type Inventory } from "
|
|
20
|
-
import { must, Unanswerable } from "
|
|
21
|
-
import type { ProjectView } from "
|
|
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 "
|
|
15
|
-
import { sourceFilesOf } from "
|
|
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 {
|
|
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) =>
|
|
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 `
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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 {
|
|
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
|
-
|
|
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
|
|
88
|
+
case CODE.unusedParameter:
|
|
87
89
|
return parameterVerdict(part, free, freeButValued) !== undefined;
|
|
88
|
-
case
|
|
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
|
|
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.
|
|
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.
|
|
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 ===
|
|
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 ===
|
|
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
|
|
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:
|
|
18
|
+
function completeMatrix(config: ResolvedConfig): boolean {
|
|
21
19
|
return (
|
|
22
|
-
config.analysis.
|
|
23
|
-
config.analysis.configurations.some((entry) =>
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
+
};
|