@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
package/src/calls.ts
DELETED
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The calls and decorators of one project that the configured classes read: what each
|
|
3
|
-
* callee resolves to, and which of the target's classes a call passes or a decorator
|
|
4
|
-
* is attached to. A class is passed as an argument, or as an element of an array
|
|
5
|
-
* literal or a property value of an object literal written as one, at any depth, and a
|
|
6
|
-
* decorator written as a call is a call.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
isArrayLiteralExpression,
|
|
11
|
-
isCallExpression,
|
|
12
|
-
isClassDeclaration,
|
|
13
|
-
isDecorator,
|
|
14
|
-
isIdentifier,
|
|
15
|
-
isObjectLiteralExpression,
|
|
16
|
-
isParenthesizedExpression,
|
|
17
|
-
isPropertyAccessExpression,
|
|
18
|
-
isPropertyAssignment,
|
|
19
|
-
isShorthandPropertyAssignment,
|
|
20
|
-
isSpreadElement,
|
|
21
|
-
type CallExpression,
|
|
22
|
-
type Decorator,
|
|
23
|
-
type Expression,
|
|
24
|
-
type Node,
|
|
25
|
-
} from "@typescript/native/ast";
|
|
26
|
-
import { SymbolFlags, type Symbol as TSSymbol } from "@typescript/native/sync";
|
|
27
|
-
import type { AliasChains } from "./alias-chain.ts";
|
|
28
|
-
import { nodeKey, type Inventory } from "./inventory.ts";
|
|
29
|
-
import { must } from "./query.ts";
|
|
30
|
-
import type { ProjectView } from "./session.ts";
|
|
31
|
-
|
|
32
|
-
/** One value written where a call passes it, and the node its declaration is resolved from. */
|
|
33
|
-
interface PassedValue {
|
|
34
|
-
/** Where the value is written, which is where a record of it sits. */
|
|
35
|
-
readonly site: Node;
|
|
36
|
-
/** The name the value is resolved through, or the shorthand assignment that holds it. */
|
|
37
|
-
readonly name: Node;
|
|
38
|
-
readonly shorthand: boolean;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** One class of the target a call passes or a decorator is attached to, and where. */
|
|
42
|
-
interface ClassUse {
|
|
43
|
-
/** The inventory's identifier of the class. */
|
|
44
|
-
readonly id: string;
|
|
45
|
-
readonly site: Node;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** The name node a callee or a decorator expression resolves through, where it has one. */
|
|
49
|
-
export function calleeName(expression: Expression): Node | undefined {
|
|
50
|
-
if (isParenthesizedExpression(expression)) {
|
|
51
|
-
return calleeName(expression.expression);
|
|
52
|
-
}
|
|
53
|
-
if (isPropertyAccessExpression(expression)) {
|
|
54
|
-
return expression.name;
|
|
55
|
-
}
|
|
56
|
-
return isIdentifier(expression) ? expression : undefined;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** The callee one decorator names: its expression, or the callee of the call it writes. */
|
|
60
|
-
export function decoratorCallee(decorator: Decorator): Node | undefined {
|
|
61
|
-
const expression = decorator.expression;
|
|
62
|
-
return calleeName(isCallExpression(expression) ? expression.expression : expression);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** How one decorator is spelled in a record: its expression, without a call's arguments. */
|
|
66
|
-
export function spelledDecorator(decorator: Decorator): string {
|
|
67
|
-
const expression = decorator.expression;
|
|
68
|
-
const named = isCallExpression(expression) ? expression.expression : expression;
|
|
69
|
-
return `@${named.getText().replace(/\s+/gu, "")}`;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** The decorators written on one declaration. */
|
|
73
|
-
export function decoratorsOf(node: Node): readonly Decorator[] {
|
|
74
|
-
return ((node as { readonly modifiers?: readonly Node[] }).modifiers ?? []).filter(isDecorator);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* What each of a batch of nodes resolves to, every alias followed to the declaration
|
|
79
|
-
* it stands for. A node the checker resolves to nothing, and an alias that resolves
|
|
80
|
-
* to nothing, are absent from the answer. Each alias is followed once. A question the
|
|
81
|
-
* checker does not answer stops the pass, as {@link must} stops.
|
|
82
|
-
*/
|
|
83
|
-
export function resolvedTargets<Brand>(
|
|
84
|
-
project: ProjectView<Brand>,
|
|
85
|
-
nodes: readonly Node[],
|
|
86
|
-
): ReadonlyMap<Node, TSSymbol> {
|
|
87
|
-
const followed = new Map<number, TSSymbol | undefined>();
|
|
88
|
-
const targets = new Map<Node, TSSymbol>();
|
|
89
|
-
project
|
|
90
|
-
.symbolsAt(nodes.map((node) => project.handle(node)))
|
|
91
|
-
.map(must)
|
|
92
|
-
.forEach((symbol, index) => {
|
|
93
|
-
const node = nodes[index];
|
|
94
|
-
if (symbol === undefined || node === undefined) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
let target: TSSymbol | undefined = symbol;
|
|
98
|
-
if ((symbol.flags & SymbolFlags.Alias) !== 0) {
|
|
99
|
-
if (!followed.has(symbol.id)) {
|
|
100
|
-
const aliased = must(project.queries.aliased(symbol));
|
|
101
|
-
followed.set(symbol.id, aliased.declarations.length === 0 ? undefined : aliased);
|
|
102
|
-
}
|
|
103
|
-
target = followed.get(symbol.id);
|
|
104
|
-
}
|
|
105
|
-
if (target !== undefined) {
|
|
106
|
-
targets.set(node, target);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
return targets;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** The values one expression passes: itself, or what an array or object literal holds. */
|
|
113
|
-
function passedIn(expression: Expression, found: PassedValue[]): void {
|
|
114
|
-
if (isParenthesizedExpression(expression)) {
|
|
115
|
-
passedIn(expression.expression, found);
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
if (isArrayLiteralExpression(expression)) {
|
|
119
|
-
for (const element of expression.elements) {
|
|
120
|
-
passedIn(isSpreadElement(element) ? element.expression : element, found);
|
|
121
|
-
}
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
if (isObjectLiteralExpression(expression)) {
|
|
125
|
-
for (const property of expression.properties) {
|
|
126
|
-
if (isPropertyAssignment(property)) {
|
|
127
|
-
passedIn(property.initializer, found);
|
|
128
|
-
} else if (isShorthandPropertyAssignment(property)) {
|
|
129
|
-
found.push({ site: property.name, name: property, shorthand: true });
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const name = calleeName(expression);
|
|
135
|
-
if (name !== undefined) {
|
|
136
|
-
found.push({ site: expression, name, shorthand: false });
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/** The values one argument passes, a spread argument's included. */
|
|
141
|
-
export function valuesPassed(argument: Expression): readonly PassedValue[] {
|
|
142
|
-
const found: PassedValue[] = [];
|
|
143
|
-
passedIn(isSpreadElement(argument) ? argument.expression : argument, found);
|
|
144
|
-
return found;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* The classes of the target each call passes, by the call. A value that names no
|
|
149
|
-
* class of the target, a class of another program included, passes nothing here.
|
|
150
|
-
*/
|
|
151
|
-
export function classesPassed<Brand>(
|
|
152
|
-
project: ProjectView<Brand>,
|
|
153
|
-
held: Inventory,
|
|
154
|
-
chains: AliasChains,
|
|
155
|
-
calls: readonly CallExpression[],
|
|
156
|
-
): ReadonlyMap<CallExpression, readonly ClassUse[]> {
|
|
157
|
-
const passed = new Map(
|
|
158
|
-
calls.map((call) => [call, call.arguments.flatMap((argument) => valuesPassed(argument))]),
|
|
159
|
-
);
|
|
160
|
-
const all = [...passed.values()].flat();
|
|
161
|
-
const targets = resolvedTargets(
|
|
162
|
-
project,
|
|
163
|
-
all.filter((value) => !value.shorthand).map((value) => value.name),
|
|
164
|
-
);
|
|
165
|
-
const classes = new Set(
|
|
166
|
-
held.symbols.filter((symbol) => symbol.kind === "class").map((symbol) => symbol.id),
|
|
167
|
-
);
|
|
168
|
-
const classesOf = (value: PassedValue): readonly string[] => {
|
|
169
|
-
const symbol = value.shorthand
|
|
170
|
-
? must(project.shorthandValueAt(project.handle(value.name)))
|
|
171
|
-
: targets.get(value.name);
|
|
172
|
-
return symbol === undefined
|
|
173
|
-
? []
|
|
174
|
-
: chains.declarationsOf(symbol).filter((id) => classes.has(id));
|
|
175
|
-
};
|
|
176
|
-
return new Map(
|
|
177
|
-
[...passed].map(([call, values]) => [
|
|
178
|
-
call,
|
|
179
|
-
values.flatMap((value) => classesOf(value).map((id) => ({ id, site: value.site }))),
|
|
180
|
-
]),
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/** One class declaration of the target and the decorators written on it. */
|
|
185
|
-
interface DecoratedClass {
|
|
186
|
-
readonly id: string;
|
|
187
|
-
readonly decorators: readonly Decorator[];
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/** Every class declaration of the target that carries a decorator. */
|
|
191
|
-
export function decoratedClasses<Brand>(
|
|
192
|
-
project: ProjectView<Brand>,
|
|
193
|
-
held: Inventory,
|
|
194
|
-
): readonly DecoratedClass[] {
|
|
195
|
-
const found: DecoratedClass[] = [];
|
|
196
|
-
for (const file of project.ownSourceFiles()) {
|
|
197
|
-
const visit = (node: Node): void => {
|
|
198
|
-
if (isClassDeclaration(node)) {
|
|
199
|
-
const id = held.declarations.get(nodeKey(file, node));
|
|
200
|
-
const decorators = decoratorsOf(node);
|
|
201
|
-
if (id !== undefined && decorators.length > 0) {
|
|
202
|
-
found.push({ id, decorators });
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
node.forEachChild(visit);
|
|
206
|
-
};
|
|
207
|
-
file.forEachChild(visit);
|
|
208
|
-
}
|
|
209
|
-
return found;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/** Every call expression of the project's own files, decorators written as calls included. */
|
|
213
|
-
export function callsOf<Brand>(project: ProjectView<Brand>): readonly CallExpression[] {
|
|
214
|
-
const found: CallExpression[] = [];
|
|
215
|
-
for (const file of project.ownSourceFiles()) {
|
|
216
|
-
const visit = (node: Node): void => {
|
|
217
|
-
if (isCallExpression(node)) {
|
|
218
|
-
found.push(node);
|
|
219
|
-
}
|
|
220
|
-
node.forEachChild(visit);
|
|
221
|
-
};
|
|
222
|
-
file.forEachChild(visit);
|
|
223
|
-
}
|
|
224
|
-
return found;
|
|
225
|
-
}
|
package/src/decorator.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The decorator class: a member a decorator expression is attached to, and every member
|
|
3
|
-
* of a class one is attached to but the member a parameter property declares, is held
|
|
4
|
-
* back, because the decorator may reach the member by its name. The rule is read from
|
|
5
|
-
* the tree alone. The decorator's own use of what it decorates is the reference pass's
|
|
6
|
-
* `decorator` reference; this class records only that the declaration is held back,
|
|
7
|
-
* static members of a decorated class included.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { Node } from "@typescript/native/ast";
|
|
11
|
-
import { decoratorsOf, spelledDecorator } from "./calls.ts";
|
|
12
|
-
import type { DetectorInput, Evidence } from "./exempt.ts";
|
|
13
|
-
import {
|
|
14
|
-
isParameterProperty,
|
|
15
|
-
nodeKey,
|
|
16
|
-
type InventorySymbol,
|
|
17
|
-
type SymbolKind,
|
|
18
|
-
} from "./inventory.ts";
|
|
19
|
-
import { renderPosition } from "./position.ts";
|
|
20
|
-
|
|
21
|
-
/** The kinds of declaration a decorator is attached to and holds back. */
|
|
22
|
-
const DECORATED: ReadonlySet<SymbolKind> = new Set(["class", "method", "class-member"]);
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* The decorator detector: each decorated member, and each member of a decorated
|
|
26
|
-
* class, recorded at the decorator.
|
|
27
|
-
*/
|
|
28
|
-
export function decorator<Brand>(input: DetectorInput<Brand>): readonly Evidence[] {
|
|
29
|
-
const { project, held, targetRoot } = input;
|
|
30
|
-
const byId = new Map(held.symbols.map((symbol) => [symbol.id, symbol]));
|
|
31
|
-
const membersOf = new Map<string, InventorySymbol[]>();
|
|
32
|
-
for (const symbol of held.symbols) {
|
|
33
|
-
if (symbol.kind === "method" || symbol.kind === "class-member") {
|
|
34
|
-
const members = membersOf.get(symbol.parent);
|
|
35
|
-
if (members === undefined) {
|
|
36
|
-
membersOf.set(symbol.parent, [symbol]);
|
|
37
|
-
} else {
|
|
38
|
-
members.push(symbol);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const decorated: {
|
|
44
|
-
readonly symbol: InventorySymbol;
|
|
45
|
-
readonly detail: string;
|
|
46
|
-
readonly site: Evidence["site"];
|
|
47
|
-
}[] = [];
|
|
48
|
-
// A decorated class's container passes each constructor argument, which keeps the
|
|
49
|
-
// parameter, not the member a parameter property stores it in.
|
|
50
|
-
const parameterMembers = new Set<string>();
|
|
51
|
-
for (const file of project.ownSourceFiles()) {
|
|
52
|
-
const visit = (node: Node): void => {
|
|
53
|
-
const id = held.declarations.get(nodeKey(file, node));
|
|
54
|
-
const symbol = id === undefined ? undefined : byId.get(id);
|
|
55
|
-
if (id !== undefined && isParameterProperty(node)) {
|
|
56
|
-
parameterMembers.add(id);
|
|
57
|
-
}
|
|
58
|
-
// A parameter property's decorator is attached to its parameter, and to no member.
|
|
59
|
-
if (symbol !== undefined && DECORATED.has(symbol.kind) && !isParameterProperty(node)) {
|
|
60
|
-
for (const attached of decoratorsOf(node)) {
|
|
61
|
-
decorated.push({
|
|
62
|
-
symbol,
|
|
63
|
-
detail: `decorated by ${spelledDecorator(attached)}`,
|
|
64
|
-
site: renderPosition(file, targetRoot, attached.getStart()),
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
node.forEachChild(visit);
|
|
69
|
-
};
|
|
70
|
-
file.forEachChild(visit);
|
|
71
|
-
}
|
|
72
|
-
return decorated.flatMap(({ symbol, detail, site }) =>
|
|
73
|
-
(symbol.kind === "class"
|
|
74
|
-
? (membersOf.get(symbol.id) ?? []).filter((member) => !parameterMembers.has(member.id))
|
|
75
|
-
: [symbol]
|
|
76
|
-
).map((member) => ({ id: member.id, detail, site })),
|
|
77
|
-
);
|
|
78
|
-
}
|