@eagleoutice/flowr 2.6.2 → 2.7.0
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 +36 -34
- package/abstract-interpretation/data-frame/absint-visitor.d.ts +1 -1
- package/abstract-interpretation/data-frame/absint-visitor.js +6 -6
- package/abstract-interpretation/data-frame/dataframe-domain.d.ts +4 -7
- package/abstract-interpretation/data-frame/dataframe-domain.js +5 -11
- package/abstract-interpretation/data-frame/mappers/access-mapper.d.ts +3 -1
- package/abstract-interpretation/data-frame/mappers/access-mapper.js +3 -2
- package/abstract-interpretation/data-frame/mappers/arguments.js +2 -2
- package/abstract-interpretation/data-frame/mappers/assignment-mapper.d.ts +3 -1
- package/abstract-interpretation/data-frame/mappers/assignment-mapper.js +3 -2
- package/abstract-interpretation/data-frame/mappers/function-mapper.d.ts +7 -7
- package/abstract-interpretation/data-frame/mappers/function-mapper.js +28 -24
- package/abstract-interpretation/data-frame/mappers/replacement-mapper.d.ts +3 -1
- package/abstract-interpretation/data-frame/mappers/replacement-mapper.js +3 -2
- package/abstract-interpretation/data-frame/semantics.js +54 -41
- package/abstract-interpretation/data-frame/shape-inference.d.ts +3 -3
- package/abstract-interpretation/data-frame/shape-inference.js +3 -3
- package/abstract-interpretation/domains/abstract-domain.d.ts +1 -0
- package/abstract-interpretation/domains/abstract-domain.js +3 -2
- package/abstract-interpretation/domains/bounded-set-domain.js +1 -1
- package/abstract-interpretation/domains/interval-domain.d.ts +2 -2
- package/abstract-interpretation/domains/interval-domain.js +3 -6
- package/abstract-interpretation/domains/lattice.d.ts +2 -0
- package/abstract-interpretation/domains/lattice.js +3 -1
- package/abstract-interpretation/domains/positive-interval-domain.d.ts +1 -1
- package/abstract-interpretation/domains/positive-interval-domain.js +1 -1
- package/abstract-interpretation/domains/satisfiable-domain.d.ts +2 -2
- package/abstract-interpretation/domains/satisfiable-domain.js +2 -2
- package/abstract-interpretation/domains/set-range-domain.d.ts +98 -0
- package/abstract-interpretation/domains/set-range-domain.js +400 -0
- package/abstract-interpretation/domains/set-upper-bound-domain.js +2 -2
- package/abstract-interpretation/domains/singleton-domain.js +2 -2
- package/abstract-interpretation/normalized-ast-fold.d.ts +1 -1
- package/benchmark/slicer.d.ts +3 -1
- package/benchmark/slicer.js +50 -27
- package/benchmark/stats/print.js +8 -5
- package/benchmark/stats/stats.d.ts +3 -2
- package/benchmark/summarizer/data.d.ts +11 -8
- package/benchmark/summarizer/first-phase/process.js +12 -9
- package/benchmark/summarizer/second-phase/graph.d.ts +3 -1
- package/benchmark/summarizer/second-phase/graph.js +3 -1
- package/benchmark/summarizer/second-phase/process.js +24 -18
- package/cli/export-quads-app.js +1 -1
- package/cli/repl/commands/repl-dataflow.js +2 -1
- package/cli/repl/commands/repl-parse.js +16 -4
- package/cli/repl/commands/repl-query.js +1 -1
- package/cli/repl/core.js +16 -13
- package/cli/repl/server/connection.js +2 -1
- package/cli/script-core/statistics-helper-core.js +2 -1
- package/cli/slicer-app.js +3 -4
- package/cli/wiki.d.ts +4 -0
- package/cli/wiki.js +165 -0
- package/config.d.ts +4 -0
- package/config.js +6 -0
- package/control-flow/cfg-dead-code.js +14 -3
- package/control-flow/cfg-simplification.d.ts +5 -2
- package/control-flow/cfg-simplification.js +3 -0
- package/control-flow/extract-cfg.d.ts +9 -3
- package/control-flow/extract-cfg.js +44 -4
- package/control-flow/semantic-cfg-guided-visitor.d.ts +2 -2
- package/control-flow/simple-visitor.js +2 -2
- package/control-flow/useless-loop.d.ts +3 -3
- package/control-flow/useless-loop.js +16 -5
- package/core/pipeline-executor.d.ts +3 -6
- package/core/pipeline-executor.js +4 -7
- package/core/print/normalize-printer.d.ts +1 -1
- package/core/print/normalize-printer.js +2 -2
- package/core/steps/all/core/00-parse.d.ts +1 -1
- package/core/steps/all/core/00-parse.js +1 -1
- package/core/steps/all/core/10-normalize.d.ts +3 -9
- package/core/steps/all/core/10-normalize.js +1 -16
- package/core/steps/all/core/11-normalize-tree-sitter.d.ts +2 -3
- package/core/steps/all/core/11-normalize-tree-sitter.js +2 -3
- package/core/steps/all/core/20-dataflow.d.ts +3 -4
- package/core/steps/all/core/20-dataflow.js +2 -2
- package/core/steps/all/static-slicing/00-slice.d.ts +4 -2
- package/core/steps/all/static-slicing/00-slice.js +3 -2
- package/core/steps/all/static-slicing/10-reconstruct.d.ts +8 -0
- package/core/steps/all/static-slicing/10-reconstruct.js +4 -1
- package/core/steps/pipeline/default-pipelines.d.ts +94 -95
- package/core/steps/pipeline/default-pipelines.js +8 -8
- package/dataflow/cluster.js +2 -2
- package/dataflow/environments/append.d.ts +5 -0
- package/dataflow/environments/append.js +6 -20
- package/dataflow/environments/built-in.d.ts +2 -1
- package/dataflow/environments/clone.d.ts +1 -2
- package/dataflow/environments/clone.js +3 -17
- package/dataflow/environments/define.d.ts +7 -3
- package/dataflow/environments/define.js +9 -56
- package/dataflow/environments/diff.js +3 -3
- package/dataflow/environments/environment.d.ts +48 -28
- package/dataflow/environments/environment.js +187 -62
- package/dataflow/environments/overwrite.d.ts +1 -5
- package/dataflow/environments/overwrite.js +2 -61
- package/dataflow/environments/reference-to-maybe.d.ts +13 -0
- package/dataflow/environments/reference-to-maybe.js +54 -0
- package/dataflow/environments/resolve-by-name.d.ts +6 -1
- package/dataflow/environments/resolve-by-name.js +56 -4
- package/dataflow/environments/scoping.d.ts +8 -4
- package/dataflow/environments/scoping.js +13 -9
- package/dataflow/eval/resolve/alias-tracking.d.ts +10 -4
- package/dataflow/eval/resolve/alias-tracking.js +15 -13
- package/dataflow/eval/resolve/resolve-argument.d.ts +2 -1
- package/dataflow/eval/resolve/resolve-argument.js +10 -10
- package/dataflow/eval/resolve/resolve.d.ts +13 -11
- package/dataflow/eval/resolve/resolve.js +16 -15
- package/dataflow/eval/values/string/string-constants.d.ts +9 -3
- package/dataflow/eval/values/string/string-constants.js +9 -3
- package/dataflow/extractor.d.ts +2 -3
- package/dataflow/extractor.js +25 -28
- package/dataflow/fn/higher-order-function.d.ts +2 -1
- package/dataflow/fn/higher-order-function.js +4 -4
- package/dataflow/graph/dataflowgraph-builder.d.ts +9 -5
- package/dataflow/graph/dataflowgraph-builder.js +21 -11
- package/dataflow/graph/diff-dataflow-graph.js +2 -2
- package/dataflow/graph/graph.d.ts +13 -11
- package/dataflow/graph/graph.js +40 -24
- package/dataflow/graph/invert-dfg.d.ts +3 -2
- package/dataflow/graph/invert-dfg.js +3 -3
- package/dataflow/graph/resolve-graph.d.ts +2 -1
- package/dataflow/graph/resolve-graph.js +2 -2
- package/dataflow/graph/unknown-replacement.d.ts +4 -2
- package/dataflow/graph/unknown-replacement.js +4 -2
- package/dataflow/graph/vertex.d.ts +3 -3
- package/dataflow/graph/vertex.js +3 -3
- package/dataflow/info.d.ts +8 -1
- package/dataflow/info.js +21 -0
- package/dataflow/internal/linker.js +10 -11
- package/dataflow/internal/process/functions/call/argument/make-argument.d.ts +2 -2
- package/dataflow/internal/process/functions/call/argument/make-argument.js +2 -3
- package/dataflow/internal/process/functions/call/argument/unpack-argument.d.ts +7 -1
- package/dataflow/internal/process/functions/call/argument/unpack-argument.js +12 -3
- package/dataflow/internal/process/functions/call/built-in/built-in-access.d.ts +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-access.js +7 -7
- package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.d.ts +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +6 -6
- package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +14 -14
- package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +10 -8
- package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +4 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.d.ts +2 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +10 -14
- package/dataflow/internal/process/functions/call/built-in/built-in-get.d.ts +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-get.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.d.ts +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +8 -6
- package/dataflow/internal/process/functions/call/built-in/built-in-library.js +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-list.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +4 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.d.ts +6 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +7 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +5 -5
- package/dataflow/internal/process/functions/call/built-in/built-in-rm.js +6 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +15 -10
- package/dataflow/internal/process/functions/call/built-in/built-in-source.js +78 -75
- package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.d.ts +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.js +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-vector.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +5 -5
- package/dataflow/internal/process/functions/call/common.d.ts +1 -1
- package/dataflow/internal/process/functions/call/common.js +6 -7
- package/dataflow/internal/process/functions/call/default-call-handling.d.ts +3 -1
- package/dataflow/internal/process/functions/call/default-call-handling.js +3 -1
- package/dataflow/internal/process/functions/call/known-call-handling.js +4 -4
- package/dataflow/internal/process/functions/call/named-call-handling.js +4 -4
- package/dataflow/internal/process/functions/call/unnamed-call-handling.js +1 -1
- package/dataflow/internal/process/functions/process-argument.js +1 -1
- package/dataflow/internal/process/functions/process-parameter.js +4 -4
- package/dataflow/internal/process/process-symbol.js +1 -1
- package/dataflow/internal/process/process-value.d.ts +1 -1
- package/dataflow/internal/process/process-value.js +7 -7
- package/dataflow/origin/dfg-get-symbol-refs.d.ts +1 -1
- package/dataflow/origin/dfg-get-symbol-refs.js +1 -1
- package/dataflow/processor.d.ts +7 -16
- package/documentation/data/dfg/doc-data-dfg-util.d.ts +0 -2
- package/documentation/data/faq/faqs.js +27 -18
- package/documentation/data/faq/recommended-configs.d.ts +36 -0
- package/documentation/data/faq/recommended-configs.js +40 -0
- package/documentation/data/faq/wiki-faq-store.d.ts +1 -0
- package/documentation/data/faq/wiki-faq-store.js +10 -2
- package/documentation/data/server/doc-data-server-messages.js +1 -1
- package/documentation/doc-capabilities.d.ts +9 -0
- package/documentation/{print-capabilities-markdown.js → doc-capabilities.js} +18 -21
- package/documentation/doc-readme.d.ts +9 -0
- package/documentation/{print-readme.js → doc-readme.js} +31 -35
- package/documentation/doc-util/doc-benchmarks.d.ts +6 -4
- package/documentation/doc-util/doc-benchmarks.js +6 -4
- package/documentation/doc-util/doc-cfg.js +5 -8
- package/documentation/doc-util/doc-dfg.d.ts +7 -7
- package/documentation/doc-util/doc-dfg.js +15 -14
- package/documentation/doc-util/doc-escape.d.ts +6 -0
- package/documentation/doc-util/doc-escape.js +11 -0
- package/documentation/doc-util/doc-general.d.ts +22 -2
- package/documentation/doc-util/doc-general.js +22 -2
- package/documentation/doc-util/doc-normalized-ast.d.ts +10 -5
- package/documentation/doc-util/doc-normalized-ast.js +14 -10
- package/documentation/doc-util/doc-query.d.ts +12 -4
- package/documentation/doc-util/doc-query.js +18 -11
- package/documentation/doc-util/doc-search.d.ts +0 -30
- package/documentation/doc-util/doc-search.js +2 -73
- package/documentation/doc-util/doc-server-message.d.ts +5 -5
- package/documentation/doc-util/doc-server-message.js +4 -4
- package/documentation/doc-util/doc-types.d.ts +69 -32
- package/documentation/doc-util/doc-types.js +109 -62
- package/documentation/index.d.ts +9 -9
- package/documentation/index.js +9 -9
- package/documentation/issue-linting-rule.d.ts +9 -0
- package/documentation/{print-linter-issue.js → issue-linting-rule.js} +20 -23
- package/documentation/wiki-analyzer.d.ts +9 -0
- package/documentation/wiki-analyzer.js +425 -0
- package/documentation/wiki-cfg.d.ts +9 -0
- package/documentation/{print-cfg-wiki.js → wiki-cfg.js} +144 -160
- package/documentation/wiki-core.d.ts +14 -0
- package/documentation/{print-core-wiki.js → wiki-core.js} +164 -175
- package/documentation/wiki-dataflow-graph.d.ts +9 -0
- package/documentation/{print-dataflow-graph-wiki.js → wiki-dataflow-graph.js} +146 -177
- package/documentation/wiki-engine.d.ts +9 -0
- package/documentation/{print-engines-wiki.js → wiki-engine.js} +27 -42
- package/documentation/wiki-faq.d.ts +8 -0
- package/documentation/wiki-faq.js +21 -0
- package/documentation/wiki-interface.d.ts +9 -0
- package/documentation/{print-interface-wiki.js → wiki-interface.js} +59 -56
- package/documentation/wiki-linter.d.ts +9 -0
- package/documentation/{print-linter-wiki.js → wiki-linter.js} +52 -48
- package/documentation/wiki-linting-and-testing.d.ts +9 -0
- package/documentation/{print-linting-and-testing-wiki.js → wiki-linting-and-testing.js} +25 -32
- package/documentation/wiki-mk/doc-context.d.ts +186 -0
- package/documentation/wiki-mk/doc-context.js +84 -0
- package/documentation/wiki-mk/doc-maker.d.ts +95 -0
- package/documentation/wiki-mk/doc-maker.js +134 -0
- package/documentation/wiki-normalized-ast.d.ts +9 -0
- package/documentation/{print-normalized-ast-wiki.js → wiki-normalized-ast.js} +64 -47
- package/documentation/wiki-onboarding.d.ts +8 -0
- package/documentation/{print-onboarding-wiki.js → wiki-onboarding.js} +18 -15
- package/documentation/wiki-query.d.ts +9 -0
- package/documentation/{print-query-wiki.js → wiki-query.js} +62 -47
- package/documentation/wiki-search.d.ts +9 -0
- package/documentation/wiki-search.js +61 -0
- package/linter/linter-executor.js +3 -2
- package/linter/linter-format.d.ts +2 -2
- package/linter/linter-rules.d.ts +15 -19
- package/linter/rules/absolute-path.d.ts +1 -2
- package/linter/rules/absolute-path.js +5 -5
- package/linter/rules/dataframe-access-validation.d.ts +2 -2
- package/linter/rules/dataframe-access-validation.js +13 -9
- package/linter/rules/dead-code.d.ts +1 -1
- package/linter/rules/deprecated-functions.d.ts +1 -5
- package/linter/rules/file-path-validity.d.ts +1 -1
- package/linter/rules/file-path-validity.js +4 -4
- package/linter/rules/function-finder-util.d.ts +3 -7
- package/linter/rules/function-finder-util.js +1 -1
- package/linter/rules/naming-convention.d.ts +2 -2
- package/linter/rules/naming-convention.js +1 -1
- package/linter/rules/network-functions.d.ts +1 -1
- package/linter/rules/network-functions.js +1 -1
- package/linter/rules/seeded-randomness.d.ts +4 -3
- package/linter/rules/seeded-randomness.js +38 -18
- package/linter/rules/unused-definition.d.ts +1 -1
- package/linter/rules/useless-loop.d.ts +2 -2
- package/linter/rules/useless-loop.js +2 -2
- package/package.json +5 -17
- package/project/cache/flowr-analyzer-cache.d.ts +7 -10
- package/project/cache/flowr-analyzer-cache.js +17 -38
- package/project/cache/flowr-analyzer-controlflow-cache.d.ts +34 -0
- package/project/cache/flowr-analyzer-controlflow-cache.js +79 -0
- package/project/context/flowr-analyzer-context.d.ts +37 -5
- package/project/context/flowr-analyzer-context.js +51 -4
- package/project/context/flowr-analyzer-environment-context.d.ts +47 -0
- package/project/context/flowr-analyzer-environment-context.js +50 -0
- package/project/context/flowr-analyzer-files-context.d.ts +63 -13
- package/project/context/flowr-analyzer-files-context.js +110 -39
- package/project/context/flowr-file.d.ts +32 -10
- package/project/context/flowr-file.js +30 -9
- package/project/flowr-analyzer-builder.d.ts +22 -28
- package/project/flowr-analyzer-builder.js +32 -70
- package/project/flowr-analyzer.d.ts +55 -14
- package/project/flowr-analyzer.js +53 -8
- package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.d.ts +7 -1
- package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.js +13 -5
- package/project/plugins/file-plugins/flowr-analyzer-file-plugin.d.ts +3 -3
- package/project/plugins/file-plugins/flowr-analyzer-file-plugin.js +11 -5
- package/project/plugins/file-plugins/flowr-description-file.d.ts +3 -3
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.d.ts +22 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.js +33 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.d.ts +22 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.js +33 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.d.ts +22 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.js +33 -0
- package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.d.ts +20 -0
- package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.js +42 -0
- package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.d.ts +59 -0
- package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.js +132 -0
- package/project/plugins/file-plugins/notebooks/notebook.d.ts +0 -0
- package/project/plugins/file-plugins/notebooks/notebook.js +2 -0
- package/project/plugins/flowr-analyzer-plugin-defaults.d.ts +5 -0
- package/project/plugins/flowr-analyzer-plugin-defaults.js +23 -0
- package/project/plugins/flowr-analyzer-plugin.d.ts +2 -0
- package/project/plugins/flowr-analyzer-plugin.js +2 -0
- package/project/plugins/loading-order-plugins/flowr-analyzer-loading-order-description-file-plugin.js +1 -1
- package/project/plugins/package-version-plugins/flowr-analyzer-package-versions-description-file-plugin.js +1 -1
- package/project/plugins/plugin-registry.d.ts +34 -0
- package/project/plugins/plugin-registry.js +62 -0
- package/project/plugins/project-discovery/flowr-analyzer-project-discovery-plugin.js +7 -1
- package/queries/catalog/call-context-query/call-context-query-executor.js +5 -6
- package/queries/catalog/call-context-query/identify-link-to-last-call-relation.d.ts +5 -2
- package/queries/catalog/call-context-query/identify-link-to-last-call-relation.js +25 -18
- package/queries/catalog/cluster-query/cluster-query-format.d.ts +1 -1
- package/queries/catalog/control-flow-query/control-flow-query-format.d.ts +1 -1
- package/queries/catalog/control-flow-query/control-flow-query-format.js +3 -2
- package/queries/catalog/dataflow-lens-query/dataflow-lens-query-executor.js +1 -1
- package/queries/catalog/dataflow-lens-query/dataflow-lens-query-format.d.ts +1 -1
- package/queries/catalog/dataflow-query/dataflow-query-format.d.ts +1 -1
- package/queries/catalog/dependencies-query/dependencies-query-executor.d.ts +1 -1
- package/queries/catalog/dependencies-query/dependencies-query-executor.js +5 -5
- package/queries/catalog/dependencies-query/dependencies-query-format.d.ts +1 -1
- package/queries/catalog/dependencies-query/dependencies-query-format.js +1 -1
- package/queries/catalog/df-shape-query/df-shape-query-executor.d.ts +1 -1
- package/queries/catalog/df-shape-query/df-shape-query-executor.js +2 -2
- package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +6 -6
- package/queries/catalog/df-shape-query/df-shape-query-format.js +8 -7
- package/queries/catalog/happens-before-query/happens-before-query-executor.d.ts +2 -1
- package/queries/catalog/happens-before-query/happens-before-query-executor.js +2 -1
- package/queries/catalog/happens-before-query/happens-before-query-format.d.ts +1 -1
- package/queries/catalog/id-map-query/id-map-query-format.d.ts +1 -1
- package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.d.ts +1 -1
- package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.js +4 -4
- package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-format.d.ts +1 -1
- package/queries/catalog/linter-query/linter-query-format.d.ts +1 -1
- package/queries/catalog/linter-query/linter-query-format.js +13 -2
- package/queries/catalog/location-map-query/location-map-query-executor.js +2 -1
- package/queries/catalog/location-map-query/location-map-query-format.d.ts +1 -1
- package/queries/catalog/location-map-query/location-map-query-format.js +1 -1
- package/queries/catalog/normalized-ast-query/normalized-ast-query-format.d.ts +1 -1
- package/queries/catalog/origin-query/origin-query-format.d.ts +1 -1
- package/queries/catalog/project-query/project-query-executor.js +3 -1
- package/queries/catalog/project-query/project-query-format.d.ts +1 -1
- package/queries/catalog/resolve-value-query/resolve-value-query-executor.d.ts +2 -2
- package/queries/catalog/resolve-value-query/resolve-value-query-executor.js +3 -3
- package/queries/catalog/resolve-value-query/resolve-value-query-format.d.ts +1 -1
- package/queries/catalog/search-query/search-query-format.d.ts +1 -1
- package/queries/catalog/static-slice-query/static-slice-query-executor.js +2 -2
- package/queries/catalog/static-slice-query/static-slice-query-format.d.ts +1 -1
- package/queries/catalog/static-slice-query/static-slice-query-format.js +13 -1
- package/queries/query.d.ts +26 -18
- package/queries/query.js +21 -1
- package/r-bridge/lang-4.x/ast/model/collect.d.ts +2 -1
- package/r-bridge/lang-4.x/ast/model/collect.js +4 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-project.d.ts +29 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-project.js +15 -0
- package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +5 -7
- package/r-bridge/lang-4.x/ast/model/processing/decorate.js +24 -11
- package/r-bridge/lang-4.x/ast/model/type.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/model/type.js +2 -0
- package/r-bridge/lang-4.x/ast/parser/json/format.js +1 -1
- package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +9 -8
- package/r-bridge/lang-4.x/ast/parser/json/parser.js +11 -10
- package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.d.ts +4 -3
- package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.js +20 -11
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.d.ts +3 -3
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.js +5 -4
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.d.ts +3 -2
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.js +14 -5
- package/r-bridge/parser.d.ts +15 -5
- package/r-bridge/parser.js +27 -13
- package/r-bridge/retriever.d.ts +9 -15
- package/r-bridge/retriever.js +14 -5
- package/r-bridge/shell.d.ts +1 -1
- package/r-bridge/shell.js +1 -1
- package/reconstruct/auto-select/auto-select-defaults.d.ts +0 -1
- package/reconstruct/auto-select/magic-comments.js +1 -1
- package/reconstruct/reconstruct.d.ts +17 -9
- package/reconstruct/reconstruct.js +19 -8
- package/search/flowr-search.d.ts +12 -0
- package/search/search-executor/search-enrichers.d.ts +9 -2
- package/search/search-executor/search-enrichers.js +1 -3
- package/search/search-executor/search-generators.d.ts +1 -1
- package/search/search-executor/search-generators.js +9 -4
- package/slicing/criterion/collect-all.d.ts +3 -2
- package/slicing/criterion/collect-all.js +1 -1
- package/slicing/criterion/parse.js +4 -4
- package/slicing/static/slice-call.d.ts +3 -2
- package/slicing/static/slice-call.js +4 -4
- package/slicing/static/static-slicer.d.ts +3 -1
- package/slicing/static/static-slicer.js +6 -7
- package/statistics/features/supported/assignments/assignments.js +1 -1
- package/statistics/features/supported/control-flow/control-flow.js +2 -2
- package/statistics/features/supported/data-access/data-access.js +1 -1
- package/statistics/features/supported/defined-functions/defined-functions.js +1 -1
- package/statistics/features/supported/expression-list/statistics-expression-list.js +1 -1
- package/statistics/features/supported/loops/loops.js +1 -1
- package/statistics/features/supported/used-functions/used-functions.js +2 -2
- package/statistics/features/supported/variables/variables.js +3 -2
- package/statistics/statistics.js +3 -2
- package/util/assert.d.ts +4 -0
- package/util/assert.js +4 -0
- package/util/containers.js +1 -1
- package/util/files.d.ts +1 -1
- package/util/files.js +1 -1
- package/util/mermaid/ast.d.ts +4 -3
- package/util/mermaid/ast.js +36 -8
- package/util/mermaid/cfg.js +1 -1
- package/util/mermaid/dfg.d.ts +1 -0
- package/util/mermaid/dfg.js +3 -3
- package/util/simple-df/dfg-view.d.ts +2 -1
- package/util/simple-df/dfg-view.js +2 -2
- package/util/version.js +1 -1
- package/dataflow/environments/remove.d.ts +0 -12
- package/dataflow/environments/remove.js +0 -52
- package/documentation/print-analyzer-wiki.d.ts +0 -1
- package/documentation/print-analyzer-wiki.js +0 -141
- package/documentation/print-capabilities-markdown.d.ts +0 -1
- package/documentation/print-cfg-wiki.d.ts +0 -1
- package/documentation/print-core-wiki.d.ts +0 -5
- package/documentation/print-dataflow-graph-wiki.d.ts +0 -1
- package/documentation/print-engines-wiki.d.ts +0 -1
- package/documentation/print-faq-wiki.d.ts +0 -1
- package/documentation/print-faq-wiki.js +0 -18
- package/documentation/print-interface-wiki.d.ts +0 -1
- package/documentation/print-linter-issue.d.ts +0 -1
- package/documentation/print-linter-wiki.d.ts +0 -1
- package/documentation/print-linting-and-testing-wiki.d.ts +0 -1
- package/documentation/print-normalized-ast-wiki.d.ts +0 -1
- package/documentation/print-onboarding-wiki.d.ts +0 -1
- package/documentation/print-query-wiki.d.ts +0 -1
- package/documentation/print-readme.d.ts +0 -1
- package/documentation/print-search-wiki.d.ts +0 -1
- package/documentation/print-search-wiki.js +0 -74
- package/util/formats/adapter-format.d.ts +0 -6
- package/util/formats/adapter-format.js +0 -3
- package/util/formats/adapter.d.ts +0 -27
- package/util/formats/adapter.js +0 -58
- package/util/formats/adapters/r-adapter.d.ts +0 -4
- package/util/formats/adapters/r-adapter.js +0 -7
- package/util/formats/adapters/rmd-adapter.d.ts +0 -35
- package/util/formats/adapters/rmd-adapter.js +0 -100
|
@@ -3,9 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getSourceProvider = getSourceProvider;
|
|
7
|
-
exports.setSourceProvider = setSourceProvider;
|
|
8
6
|
exports.inferWdFromScript = inferWdFromScript;
|
|
7
|
+
exports.platformBasename = platformBasename;
|
|
8
|
+
exports.platformDirname = platformDirname;
|
|
9
9
|
exports.findSource = findSource;
|
|
10
10
|
exports.processSourceCall = processSourceCall;
|
|
11
11
|
exports.sourceRequest = sourceRequest;
|
|
@@ -21,7 +21,6 @@ const logger_1 = require("../../../../../logger");
|
|
|
21
21
|
const type_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/type");
|
|
22
22
|
const overwrite_1 = require("../../../../../environments/overwrite");
|
|
23
23
|
const log_1 = require("../../../../../../util/log");
|
|
24
|
-
const fs_1 = __importDefault(require("fs"));
|
|
25
24
|
const parser_1 = require("../../../../../../r-bridge/lang-4.x/ast/parser/json/parser");
|
|
26
25
|
const shell_executor_1 = require("../../../../../../r-bridge/shell-executor");
|
|
27
26
|
const assert_1 = require("../../../../../../util/assert");
|
|
@@ -30,40 +29,36 @@ const general_1 = require("../../../../../eval/values/general");
|
|
|
30
29
|
const r_value_1 = require("../../../../../eval/values/r-value");
|
|
31
30
|
const unknown_side_effect_1 = require("../../../../../graph/unknown-side-effect");
|
|
32
31
|
const alias_tracking_1 = require("../../../../../eval/resolve/alias-tracking");
|
|
33
|
-
let sourceProvider = (0, retriever_1.requestProviderFromFile)();
|
|
34
|
-
/**
|
|
35
|
-
* Returns the current (global) source provider
|
|
36
|
-
*/
|
|
37
|
-
function getSourceProvider() {
|
|
38
|
-
return sourceProvider;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Sets the current (global) source provider
|
|
42
|
-
*/
|
|
43
|
-
function setSourceProvider(provider) {
|
|
44
|
-
sourceProvider = provider;
|
|
45
|
-
}
|
|
46
32
|
/**
|
|
47
33
|
* Infers working directories based on the given option and reference chain
|
|
48
34
|
*/
|
|
49
35
|
function inferWdFromScript(option, referenceChain) {
|
|
50
36
|
switch (option) {
|
|
51
37
|
case config_1.InferWorkingDirectory.MainScript:
|
|
52
|
-
return referenceChain[0]
|
|
53
|
-
case config_1.InferWorkingDirectory.ActiveScript:
|
|
54
|
-
|
|
38
|
+
return referenceChain[0] ? [platformDirname(referenceChain[0])] : [];
|
|
39
|
+
case config_1.InferWorkingDirectory.ActiveScript: {
|
|
40
|
+
const secondToLast = referenceChain[referenceChain.length - 1];
|
|
41
|
+
return secondToLast ? [platformDirname(secondToLast)] : [];
|
|
42
|
+
}
|
|
55
43
|
case config_1.InferWorkingDirectory.AnyScript:
|
|
56
|
-
return referenceChain.filter(
|
|
44
|
+
return referenceChain.filter(assert_1.isNotUndefined).map(e => platformDirname(e));
|
|
57
45
|
case config_1.InferWorkingDirectory.No:
|
|
58
46
|
default:
|
|
59
47
|
return [];
|
|
60
48
|
}
|
|
61
49
|
}
|
|
62
50
|
const AnyPathSeparator = /[/\\]/g;
|
|
51
|
+
/**
|
|
52
|
+
* Return the basename of a path in a platform-agnostic way
|
|
53
|
+
* @see {@link platformDirname} - for the dirname counterpart
|
|
54
|
+
*/
|
|
63
55
|
function platformBasename(p) {
|
|
64
56
|
const normalized = p.replaceAll(path_1.default.win32.sep, path_1.default.posix.sep);
|
|
65
57
|
return path_1.default.posix.basename(normalized);
|
|
66
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Return the dirname of a path in a platform-agnostic way
|
|
61
|
+
*/
|
|
67
62
|
function platformDirname(p) {
|
|
68
63
|
const normalized = p.replaceAll(path_1.default.win32.sep, path_1.default.posix.sep);
|
|
69
64
|
return path_1.default.posix.dirname(normalized);
|
|
@@ -87,10 +82,7 @@ function applyReplacements(path, replacements) {
|
|
|
87
82
|
*/
|
|
88
83
|
function findSource(resolveSource, seed, data) {
|
|
89
84
|
const capitalization = resolveSource?.ignoreCapitalization ?? false;
|
|
90
|
-
const explorePaths = [
|
|
91
|
-
...(resolveSource?.searchPath ?? []),
|
|
92
|
-
...(inferWdFromScript(resolveSource?.inferWorkingDirectory ?? config_1.InferWorkingDirectory.No, data.referenceChain))
|
|
93
|
-
];
|
|
85
|
+
const explorePaths = (resolveSource?.searchPath ?? []).concat(inferWdFromScript(resolveSource?.inferWorkingDirectory ?? config_1.InferWorkingDirectory.No, data.referenceChain));
|
|
94
86
|
let tryPaths = [seed];
|
|
95
87
|
switch (resolveSource?.dropPaths ?? config_1.DropPathsOption.No) {
|
|
96
88
|
case config_1.DropPathsOption.Once: {
|
|
@@ -122,7 +114,8 @@ function findSource(resolveSource, seed, data) {
|
|
|
122
114
|
for (const explore of [undefined, ...explorePaths]) {
|
|
123
115
|
for (const tryPath of tryPaths) {
|
|
124
116
|
const effectivePath = explore ? path_1.default.join(explore, tryPath) : tryPath;
|
|
125
|
-
const
|
|
117
|
+
const context = data.ctx.files;
|
|
118
|
+
const get = context.exists(effectivePath, capitalization) ?? context.exists(returnPlatformPath(effectivePath), capitalization);
|
|
126
119
|
if (get && !found.includes(effectivePath)) {
|
|
127
120
|
found.push(returnPlatformPath(effectivePath));
|
|
128
121
|
}
|
|
@@ -145,7 +138,7 @@ function processSourceCall(name, args, rootId, data, config) {
|
|
|
145
138
|
(0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'builtin:source' }).information
|
|
146
139
|
: (0, info_1.initializeCleanDataflowInformation)(rootId, data);
|
|
147
140
|
const sourceFileArgument = args[0];
|
|
148
|
-
if (!config.forceFollow && data.
|
|
141
|
+
if (!config.forceFollow && data.ctx.config.ignoreSourceCalls) {
|
|
149
142
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Skipping source call ${JSON.stringify(sourceFileArgument)} (disabled in config file)`);
|
|
150
143
|
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
|
|
151
144
|
return information;
|
|
@@ -155,26 +148,25 @@ function processSourceCall(name, args, rootId, data, config) {
|
|
|
155
148
|
sourceFile = [(0, retriever_1.removeRQuotes)(sourceFileArgument.lexeme)];
|
|
156
149
|
}
|
|
157
150
|
else if (sourceFileArgument !== r_function_call_1.EmptyArgument) {
|
|
158
|
-
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(sourceFileArgument.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.
|
|
151
|
+
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(sourceFileArgument.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.ctx.config.solver.variables, ctx: data.ctx }));
|
|
159
152
|
sourceFile = resolved?.elements.map(r => r.type === 'string' && (0, r_value_1.isValue)(r.value) ? r.value.str : undefined).filter(assert_1.isNotUndefined);
|
|
160
153
|
}
|
|
161
154
|
if (sourceFile && sourceFile.length === 1) {
|
|
162
155
|
const path = (0, retriever_1.removeRQuotes)(sourceFile[0]);
|
|
163
|
-
let filepath = path ? findSource(data.
|
|
156
|
+
let filepath = path ? findSource(data.ctx.config.solver.resolveSource, path, data) : path;
|
|
164
157
|
if (Array.isArray(filepath)) {
|
|
165
158
|
filepath = filepath?.[0];
|
|
166
159
|
}
|
|
167
160
|
if (filepath !== undefined) {
|
|
168
|
-
const request = sourceProvider.createRequest(filepath);
|
|
169
161
|
// check if the sourced file has already been dataflow analyzed, and if so, skip it
|
|
170
|
-
const limit = data.
|
|
171
|
-
const findCount = data.referenceChain.filter(e => e
|
|
162
|
+
const limit = data.ctx.config.solver.resolveSource?.repeatedSourceLimit ?? 0;
|
|
163
|
+
const findCount = data.referenceChain.filter(e => e !== undefined && filepath === e).length;
|
|
172
164
|
if (findCount > limit) {
|
|
173
|
-
logger_1.dataflowLogger.warn(`Found cycle (>=${limit + 1}) in dataflow analysis for ${JSON.stringify(
|
|
165
|
+
logger_1.dataflowLogger.warn(`Found cycle (>=${limit + 1}) in dataflow analysis for ${JSON.stringify(filepath)}: ${JSON.stringify(data.referenceChain)}, skipping further dataflow analysis`);
|
|
174
166
|
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
|
|
175
167
|
return information;
|
|
176
168
|
}
|
|
177
|
-
return sourceRequest(rootId, request, data, information, (0, decorate_1.sourcedDeterministicCountingIdGenerator)((findCount > 0 ? findCount + '::' : '') + path, name.location));
|
|
169
|
+
return sourceRequest(rootId, { request: 'file', content: filepath }, data, information, (0, decorate_1.sourcedDeterministicCountingIdGenerator)((findCount > 0 ? findCount + '::' : '') + path, name.location));
|
|
178
170
|
}
|
|
179
171
|
}
|
|
180
172
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Non-constant argument ${JSON.stringify(sourceFile)} for source is currently not supported, skipping`);
|
|
@@ -183,30 +175,48 @@ function processSourceCall(name, args, rootId, data, config) {
|
|
|
183
175
|
}
|
|
184
176
|
/**
|
|
185
177
|
* Processes a source request with the given dataflow processor information and existing dataflow information
|
|
178
|
+
* Otherwise, this can be an {@link RProjectFile} representing a standalone source file
|
|
186
179
|
*/
|
|
187
180
|
function sourceRequest(rootId, request, data, information, getId) {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
181
|
+
// parse, normalize and dataflow the sourced file
|
|
182
|
+
let dataflow;
|
|
183
|
+
let fst;
|
|
184
|
+
let filePath;
|
|
185
|
+
if ('root' in request) {
|
|
186
|
+
fst = request;
|
|
187
|
+
filePath = request.filePath;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const textRequest = data.ctx.files.resolveRequest(request);
|
|
191
|
+
if (textRequest === undefined && request.request === 'file') {
|
|
192
|
+
// if translation failed there is nothing we can do!!
|
|
191
193
|
logger_1.dataflowLogger.warn(`Failed to analyze sourced file ${JSON.stringify(request)}: file does not exist`);
|
|
192
194
|
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
|
|
193
195
|
return information;
|
|
194
196
|
}
|
|
197
|
+
else {
|
|
198
|
+
(0, assert_1.guard)(textRequest !== undefined, `Expected text request to be defined for sourced file ${JSON.stringify(request)}`);
|
|
199
|
+
}
|
|
200
|
+
const parsed = (!data.parser.async ? data.parser : new shell_executor_1.RShellExecutor()).parse(textRequest.r);
|
|
201
|
+
const normalized = (typeof parsed !== 'string' ?
|
|
202
|
+
(0, parser_1.normalizeTreeSitter)({ files: [{ parsed, filePath: textRequest.path }] }, getId, data.ctx.config)
|
|
203
|
+
: (0, parser_1.normalize)({ files: [{ parsed, filePath: textRequest.path }] }, getId));
|
|
204
|
+
fst = normalized.ast.files[0];
|
|
205
|
+
// this can be improved, see issue #628
|
|
206
|
+
for (const [k, v] of normalized.idMap) {
|
|
207
|
+
data.completeAst.idMap.set(k, v);
|
|
208
|
+
}
|
|
209
|
+
// add to the main ast
|
|
210
|
+
if (!data.completeAst.ast.files.find(f => f.filePath === fst.filePath)) {
|
|
211
|
+
data.completeAst.ast.files.push(fst);
|
|
212
|
+
}
|
|
213
|
+
filePath = textRequest.path;
|
|
195
214
|
}
|
|
196
|
-
// parse, normalize and dataflow the sourced file
|
|
197
|
-
let normalized;
|
|
198
|
-
let dataflow;
|
|
199
215
|
try {
|
|
200
|
-
|
|
201
|
-
const parsed = (!data.parser.async ? data.parser : new shell_executor_1.RShellExecutor()).parse(request);
|
|
202
|
-
normalized = (typeof parsed !== 'string' ?
|
|
203
|
-
(0, parser_1.normalizeTreeSitter)({ parsed }, getId, data.flowrConfig, file)
|
|
204
|
-
: (0, parser_1.normalize)({ parsed }, getId, file));
|
|
205
|
-
dataflow = (0, processor_1.processDataflowFor)(normalized.ast, {
|
|
216
|
+
dataflow = (0, processor_1.processDataflowFor)(fst.root, {
|
|
206
217
|
...data,
|
|
207
|
-
currentRequest: request,
|
|
208
218
|
environment: information.environment,
|
|
209
|
-
referenceChain: [...data.referenceChain,
|
|
219
|
+
referenceChain: [...data.referenceChain, fst.filePath]
|
|
210
220
|
});
|
|
211
221
|
}
|
|
212
222
|
catch (e) {
|
|
@@ -216,47 +226,40 @@ function sourceRequest(rootId, request, data, information, getId) {
|
|
|
216
226
|
return information;
|
|
217
227
|
}
|
|
218
228
|
// take the entry point as well as all the written references, and give them a control dependency to the source call to show that they are conditional
|
|
219
|
-
if (
|
|
220
|
-
dataflow.graph.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
229
|
+
if (!String(rootId).startsWith('file-')) {
|
|
230
|
+
if (dataflow.graph.hasVertex(dataflow.entryPoint)) {
|
|
231
|
+
dataflow.graph.addControlDependency(dataflow.entryPoint, rootId, true);
|
|
232
|
+
}
|
|
233
|
+
for (const out of dataflow.out) {
|
|
234
|
+
dataflow.graph.addControlDependency(out.nodeId, rootId, true);
|
|
235
|
+
}
|
|
224
236
|
}
|
|
225
|
-
|
|
237
|
+
data.ctx.files.addConsideredFile(filePath ?? '<inline>');
|
|
226
238
|
// update our graph with the sourced file's information
|
|
227
|
-
const newInformation = { ...information };
|
|
228
|
-
newInformation.environment = (0, overwrite_1.overwriteEnvironment)(information.environment, dataflow.environment);
|
|
229
|
-
newInformation.graph.mergeWith(dataflow.graph);
|
|
230
|
-
// this can be improved, see issue #628
|
|
231
|
-
for (const [k, v] of normalized.idMap) {
|
|
232
|
-
data.completeAst.idMap.set(k, v);
|
|
233
|
-
}
|
|
234
239
|
return {
|
|
235
|
-
...
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
240
|
+
...information,
|
|
241
|
+
environment: (0, overwrite_1.overwriteEnvironment)(information.environment, dataflow.environment),
|
|
242
|
+
graph: information.graph.mergeWith(dataflow.graph),
|
|
243
|
+
in: information.in.concat(dataflow.in),
|
|
244
|
+
out: information.out.concat(dataflow.out),
|
|
245
|
+
unknownReferences: information.unknownReferences.concat(dataflow.unknownReferences),
|
|
239
246
|
exitPoints: dataflow.exitPoints
|
|
240
247
|
};
|
|
241
248
|
}
|
|
242
249
|
/**
|
|
243
250
|
* Processes a standalone source file (i.e., not from a source function call)
|
|
244
251
|
*/
|
|
245
|
-
function standaloneSourceFile(
|
|
246
|
-
const path = inputRequest.request === 'file' ? inputRequest.content : '-inline-';
|
|
247
|
-
/* this way we can still pass content */
|
|
248
|
-
const request = inputRequest.request === 'file' ? sourceProvider.createRequest(inputRequest.content) : inputRequest;
|
|
252
|
+
function standaloneSourceFile(idx, file, data, information) {
|
|
249
253
|
// check if the sourced file has already been dataflow analyzed, and if so, skip it
|
|
250
|
-
if (data.referenceChain.find(e => e
|
|
251
|
-
logger_1.dataflowLogger.info(`Found loop in dataflow analysis for ${JSON.stringify(
|
|
252
|
-
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment,
|
|
254
|
+
if (data.referenceChain.find(e => e !== undefined && e === file.filePath)) {
|
|
255
|
+
logger_1.dataflowLogger.info(`Found loop in dataflow analysis for ${JSON.stringify(file.filePath)}: ${JSON.stringify(data.referenceChain)}, skipping further dataflow analysis`);
|
|
256
|
+
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, file.root.info.id);
|
|
253
257
|
return information;
|
|
254
258
|
}
|
|
255
|
-
return sourceRequest(
|
|
259
|
+
return sourceRequest('file-' + idx, file, {
|
|
256
260
|
...data,
|
|
257
|
-
currentRequest: request,
|
|
258
261
|
environment: information.environment,
|
|
259
|
-
referenceChain: [...data.referenceChain,
|
|
260
|
-
}, information
|
|
262
|
+
referenceChain: [...data.referenceChain, file.filePath]
|
|
263
|
+
}, information);
|
|
261
264
|
}
|
|
262
265
|
//# sourceMappingURL=built-in-source.js.map
|
|
@@ -6,7 +6,9 @@ import type { RSymbol } from '../../../../../../r-bridge/lang-4.x/ast/model/node
|
|
|
6
6
|
import type { NodeId } from '../../../../../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
7
7
|
import type { ForceArguments } from '../common';
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Process a special built-in binary operator, possibly lazily.
|
|
10
|
+
* For example, the logical AND `&&` and OR `||` operators only evaluate their right-hand side if necessary.
|
|
11
|
+
* Please note that this is not (directly) related to R's special binary operators like `%in%`.
|
|
10
12
|
*/
|
|
11
13
|
export declare function processSpecialBinOp<OtherInfo>(name: RSymbol<OtherInfo & ParentInformation>, args: readonly RFunctionArgument<OtherInfo & ParentInformation>[], rootId: NodeId, data: DataflowProcessorInformation<OtherInfo & ParentInformation>, config: {
|
|
12
14
|
lazy: boolean;
|
|
@@ -5,7 +5,9 @@ const known_call_handling_1 = require("../known-call-handling");
|
|
|
5
5
|
const logger_1 = require("../../../../../logger");
|
|
6
6
|
const edge_1 = require("../../../../../graph/edge");
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Process a special built-in binary operator, possibly lazily.
|
|
9
|
+
* For example, the logical AND `&&` and OR `||` operators only evaluate their right-hand side if necessary.
|
|
10
|
+
* Please note that this is not (directly) related to R's special binary operators like `%in%`.
|
|
9
11
|
*/
|
|
10
12
|
function processSpecialBinOp(name, args, rootId, data, config) {
|
|
11
13
|
if (!config.lazy) {
|
|
@@ -16,7 +16,7 @@ const containers_1 = require("../../../../../../util/containers");
|
|
|
16
16
|
*/
|
|
17
17
|
function processVector(name, args, rootId, data) {
|
|
18
18
|
const fnCall = (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'builtin:vector' });
|
|
19
|
-
if (!data.
|
|
19
|
+
if (!data.ctx.config.solver.pointerTracking) {
|
|
20
20
|
return fnCall.information;
|
|
21
21
|
}
|
|
22
22
|
let vectorArgs = [];
|
|
@@ -52,7 +52,7 @@ function processVector(name, args, rootId, data) {
|
|
|
52
52
|
vectorArgs = vectorArgs.concat(flattenedIndices);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
if ((0, config_1.isOverPointerAnalysisThreshold)(data.
|
|
55
|
+
if ((0, config_1.isOverPointerAnalysisThreshold)(data.ctx.config, vectorArgs.length)) {
|
|
56
56
|
return fnCall.information;
|
|
57
57
|
}
|
|
58
58
|
const indices = {
|
|
@@ -8,11 +8,11 @@ const assert_1 = require("../../../../../../util/assert");
|
|
|
8
8
|
const unpack_argument_1 = require("../argument/unpack-argument");
|
|
9
9
|
const r_function_call_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
|
|
10
10
|
const logger_1 = require("../../../../../logger");
|
|
11
|
-
const environment_1 = require("../../../../../environments/environment");
|
|
12
11
|
const edge_1 = require("../../../../../graph/edge");
|
|
13
12
|
const identifier_1 = require("../../../../../environments/identifier");
|
|
14
13
|
const general_1 = require("../../../../../eval/values/general");
|
|
15
14
|
const alias_tracking_1 = require("../../../../../eval/resolve/alias-tracking");
|
|
15
|
+
const reference_to_maybe_1 = require("../../../../../environments/reference-to-maybe");
|
|
16
16
|
/**
|
|
17
17
|
*
|
|
18
18
|
*/
|
|
@@ -21,13 +21,13 @@ function processWhileLoop(name, args, rootId, data) {
|
|
|
21
21
|
logger_1.dataflowLogger.warn(`While-Loop ${name.content} does not have 2 arguments, skipping`);
|
|
22
22
|
return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information;
|
|
23
23
|
}
|
|
24
|
-
const unpackedArgs = args.map(e => (0, unpack_argument_1.
|
|
24
|
+
const unpackedArgs = args.map(e => (0, unpack_argument_1.unpackNonameArg)(e));
|
|
25
25
|
if (unpackedArgs.some(assert_1.isUndefined)) {
|
|
26
26
|
logger_1.dataflowLogger.warn(`While-Loop ${name.content} has empty arguments in ${JSON.stringify(args)}, skipping`);
|
|
27
27
|
return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information;
|
|
28
28
|
}
|
|
29
29
|
// we should defer this to the abstract interpretation
|
|
30
|
-
const values = (0, alias_tracking_1.resolveIdToValue)(unpackedArgs[0]?.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.
|
|
30
|
+
const values = (0, alias_tracking_1.resolveIdToValue)(unpackedArgs[0]?.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.ctx.config.solver.variables, ctx: data.ctx });
|
|
31
31
|
const conditionIsAlwaysFalse = (0, general_1.valueSetGuard)(values)?.elements.every(d => d.type === 'logical' && d.value === false) ?? false;
|
|
32
32
|
//We don't care about the body if it never executes
|
|
33
33
|
if (conditionIsAlwaysFalse) {
|
|
@@ -69,7 +69,7 @@ function processWhileLoop(name, args, rootId, data) {
|
|
|
69
69
|
return condition;
|
|
70
70
|
}
|
|
71
71
|
const cdTrue = { id: name.info.id, when: true };
|
|
72
|
-
const remainingInputs = (0, linker_1.linkInputs)((0,
|
|
72
|
+
const remainingInputs = (0, linker_1.linkInputs)((0, reference_to_maybe_1.makeAllMaybe)(body.unknownReferences, information.graph, information.environment, false, cdTrue).concat((0, reference_to_maybe_1.makeAllMaybe)(body.in, information.graph, information.environment, false, cdTrue)), information.environment, condition.in.concat(condition.unknownReferences), information.graph, true);
|
|
73
73
|
(0, linker_1.linkCircularRedefinitionsWithinALoop)(information.graph, (0, linker_1.produceNameSharedIdMap)((0, linker_1.findNonLocalReads)(information.graph, condition.in)), body.out);
|
|
74
74
|
(0, linker_1.reapplyLoopExitPoints)(body.exitPoints, body.in.concat(body.out, body.unknownReferences));
|
|
75
75
|
// as the while-loop always evaluates its condition
|
|
@@ -77,7 +77,7 @@ function processWhileLoop(name, args, rootId, data) {
|
|
|
77
77
|
return {
|
|
78
78
|
unknownReferences: [],
|
|
79
79
|
in: [{ nodeId: name.info.id, name: name.lexeme, controlDependencies: originalDependency, type: identifier_1.ReferenceType.Function }, ...remainingInputs],
|
|
80
|
-
out: condition.out.concat((0,
|
|
80
|
+
out: condition.out.concat((0, reference_to_maybe_1.makeAllMaybe)(body.out, information.graph, information.environment, true, cdTrue)),
|
|
81
81
|
entryPoint: name.info.id,
|
|
82
82
|
exitPoints: (0, info_1.filterOutLoopExitPoints)(body.exitPoints),
|
|
83
83
|
graph: information.graph,
|
|
@@ -30,7 +30,7 @@ export interface ProcessAllArgumentResult {
|
|
|
30
30
|
readonly processedArguments: (DataflowInformation | undefined)[];
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Processes all arguments for a function call, updating the given final graph and environment.
|
|
34
34
|
*/
|
|
35
35
|
export declare function processAllArguments<OtherInfo>({ functionName, args, data, finalGraph, functionRootId, forceArgs, patchData }: ProcessAllArgumentInput<OtherInfo>): ProcessAllArgumentResult;
|
|
36
36
|
export interface PatchFunctionCallInput<OtherInfo> {
|
|
@@ -29,8 +29,7 @@ function forceVertexArgumentValueReferences(rootId, value, graph, env) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
const containedSubflowIn = graph.
|
|
33
|
-
.filter(([, info]) => (0, vertex_1.isFunctionDefinitionVertex)(info))
|
|
32
|
+
const containedSubflowIn = graph.verticesOfType(vertex_1.VertexType.FunctionDefinition)
|
|
34
33
|
.flatMap(([, info]) => info.subflow.in)
|
|
35
34
|
.toArray();
|
|
36
35
|
// try to resolve them against the current environment
|
|
@@ -44,9 +43,9 @@ function forceVertexArgumentValueReferences(rootId, value, graph, env) {
|
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
45
|
/**
|
|
47
|
-
*
|
|
46
|
+
* Processes all arguments for a function call, updating the given final graph and environment.
|
|
48
47
|
*/
|
|
49
|
-
function processAllArguments({ functionName, args, data, finalGraph, functionRootId, forceArgs = [], patchData
|
|
48
|
+
function processAllArguments({ functionName, args, data, finalGraph, functionRootId, forceArgs = [], patchData }) {
|
|
50
49
|
let finalEnv = functionName.environment;
|
|
51
50
|
// arg env contains the environments with other args defined
|
|
52
51
|
let argEnv = functionName.environment;
|
|
@@ -56,7 +55,7 @@ function processAllArguments({ functionName, args, data, finalGraph, functionRoo
|
|
|
56
55
|
let i = -1;
|
|
57
56
|
for (const arg of args) {
|
|
58
57
|
i++;
|
|
59
|
-
data = patchData(data, i);
|
|
58
|
+
data = patchData?.(data, i) ?? data;
|
|
60
59
|
if (arg === r_function_call_1.EmptyArgument) {
|
|
61
60
|
callArgs.push(r_function_call_1.EmptyArgument);
|
|
62
61
|
processedArguments.push(undefined);
|
|
@@ -70,7 +69,7 @@ function processAllArguments({ functionName, args, data, finalGraph, functionRoo
|
|
|
70
69
|
finalEnv = (0, overwrite_1.overwriteEnvironment)(finalEnv, processed.environment);
|
|
71
70
|
finalGraph.mergeWith(processed.graph);
|
|
72
71
|
// resolve reads within argument, we resolve before adding the `processed.environment` to avoid cyclic dependencies
|
|
73
|
-
for (const ingoing of
|
|
72
|
+
for (const ingoing of processed.in.concat(processed.unknownReferences)) {
|
|
74
73
|
// check if it is called directly
|
|
75
74
|
const vtx = finalGraph.getVertex(ingoing.nodeId);
|
|
76
75
|
const tryToResolve = ingoing.name ? (0, resolve_by_name_1.resolveByName)(ingoing.name, argEnv, vtx?.tag === vertex_1.VertexType.FunctionCall ? identifier_1.ReferenceType.Function : identifier_1.ReferenceType.Unknown) : undefined;
|
|
@@ -122,7 +121,7 @@ function patchFunctionCall({ nextGraph, rootId, name, data, argumentProcessResul
|
|
|
122
121
|
args: argumentProcessResult.map(arg => arg === undefined ? r_function_call_1.EmptyArgument : { nodeId: arg.entryPoint, controlDependencies: undefined, call: undefined, type: identifier_1.ReferenceType.Argument }),
|
|
123
122
|
origin: [origin],
|
|
124
123
|
link
|
|
125
|
-
}, !nextGraph.hasVertex(rootId) || nextGraph.isRoot(rootId), true);
|
|
124
|
+
}, data.ctx.env.makeCleanEnv(), !nextGraph.hasVertex(rootId) || nextGraph.isRoot(rootId), true);
|
|
126
125
|
for (const arg of argumentProcessResult) {
|
|
127
126
|
if (arg) {
|
|
128
127
|
nextGraph.addEdge(rootId, arg.entryPoint, edge_1.EdgeType.Argument);
|
|
@@ -3,6 +3,8 @@ import type { DataflowProcessorInformation } from '../../../../processor';
|
|
|
3
3
|
import type { ParentInformation } from '../../../../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
4
4
|
import type { RFunctionCall } from '../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Processes a function call, either named or unnamed.
|
|
7
|
+
* @see {@link processNamedCall}
|
|
8
|
+
* @see {@link processUnnamedFunctionCall}
|
|
7
9
|
*/
|
|
8
10
|
export declare function processFunctionCall<OtherInfo>(functionCall: RFunctionCall<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -4,7 +4,9 @@ exports.processFunctionCall = processFunctionCall;
|
|
|
4
4
|
const named_call_handling_1 = require("./named-call-handling");
|
|
5
5
|
const unnamed_call_handling_1 = require("./unnamed-call-handling");
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Processes a function call, either named or unnamed.
|
|
8
|
+
* @see {@link processNamedCall}
|
|
9
|
+
* @see {@link processUnnamedFunctionCall}
|
|
8
10
|
*/
|
|
9
11
|
function processFunctionCall(functionCall, data) {
|
|
10
12
|
if (functionCall.named) {
|
|
@@ -36,7 +36,7 @@ function processKnownFunctionCall({ name, args, rootId, data, reverseOrder = fal
|
|
|
36
36
|
const finalGraph = new graph_1.DataflowGraph(data.completeAst.idMap);
|
|
37
37
|
const functionCallName = name.content;
|
|
38
38
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Processing known function call ${functionCallName} with ${args.length} arguments`);
|
|
39
|
-
const processArgs = reverseOrder ?
|
|
39
|
+
const processArgs = reverseOrder ? args.toReversed() : args;
|
|
40
40
|
const { finalEnv, callArgs, remainingReadInArgs, processedArguments } = (0, common_1.processAllArguments)({ functionName, args: processArgs, data, finalGraph, functionRootId: rootId, patchData, forceArgs });
|
|
41
41
|
if (markAsNSE) {
|
|
42
42
|
markNonStandardEvaluationEdges(markAsNSE, processedArguments, finalGraph, rootId);
|
|
@@ -49,10 +49,10 @@ function processKnownFunctionCall({ name, args, rootId, data, reverseOrder = fal
|
|
|
49
49
|
/* will be overwritten accordingly */
|
|
50
50
|
onlyBuiltin: false,
|
|
51
51
|
cds: data.controlDependencies,
|
|
52
|
-
args: reverseOrder ?
|
|
52
|
+
args: reverseOrder ? callArgs.reverse() : callArgs,
|
|
53
53
|
indicesCollection: indicesCollection,
|
|
54
54
|
origin: origin === 'default' ? ['function'] : [origin]
|
|
55
|
-
});
|
|
55
|
+
}, data.ctx.env.makeCleanEnv());
|
|
56
56
|
if (hasUnknownSideEffect) {
|
|
57
57
|
(0, unknown_side_effect_1.handleUnknownSideEffect)(finalGraph, data.environment, rootId);
|
|
58
58
|
}
|
|
@@ -70,7 +70,7 @@ function processKnownFunctionCall({ name, args, rootId, data, reverseOrder = fal
|
|
|
70
70
|
entryPoint: rootId,
|
|
71
71
|
exitPoints: [{ nodeId: rootId, type: 0 /* ExitPointType.Default */, controlDependencies: data.controlDependencies }]
|
|
72
72
|
},
|
|
73
|
-
processedArguments: reverseOrder ?
|
|
73
|
+
processedArguments: reverseOrder ? processedArguments.reverse() : processedArguments,
|
|
74
74
|
fnRef
|
|
75
75
|
};
|
|
76
76
|
}
|
|
@@ -13,13 +13,13 @@ function mergeInformation(info, newInfo) {
|
|
|
13
13
|
return newInfo;
|
|
14
14
|
}
|
|
15
15
|
return {
|
|
16
|
-
unknownReferences:
|
|
17
|
-
in:
|
|
18
|
-
out:
|
|
16
|
+
unknownReferences: info.unknownReferences.concat(newInfo.unknownReferences),
|
|
17
|
+
in: info.in.concat(newInfo.in),
|
|
18
|
+
out: info.out.concat(newInfo.out),
|
|
19
19
|
graph: info.graph.mergeWith(newInfo.graph),
|
|
20
20
|
environment: (0, append_1.appendEnvironment)(info.environment, newInfo.environment),
|
|
21
21
|
entryPoint: newInfo.entryPoint,
|
|
22
|
-
exitPoints:
|
|
22
|
+
exitPoints: info.exitPoints.concat(newInfo.exitPoints),
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
function processDefaultFunctionProcessor(information, name, args, rootId, data) {
|
|
@@ -45,7 +45,7 @@ function processUnnamedFunctionCall(functionCall, data) {
|
|
|
45
45
|
cds: data.controlDependencies,
|
|
46
46
|
args: callArgs, // same reference
|
|
47
47
|
origin: [exports.UnnamedFunctionCallOrigin]
|
|
48
|
-
});
|
|
48
|
+
}, data.ctx.env.makeCleanEnv());
|
|
49
49
|
let inIds = remainingReadInArgs;
|
|
50
50
|
inIds.push({ nodeId: functionRootId, name: functionCallName, controlDependencies: data.controlDependencies, type: identifier_1.ReferenceType.Function });
|
|
51
51
|
if (functionCall.calledFunction.type === type_1.RType.FunctionDefinition) {
|
|
@@ -34,7 +34,7 @@ function processFunctionArgument(argument, data) {
|
|
|
34
34
|
tag: vertex_1.VertexType.Use,
|
|
35
35
|
id: argument.info.id,
|
|
36
36
|
cds: data.controlDependencies
|
|
37
|
-
});
|
|
37
|
+
}, data.ctx.env.makeCleanEnv());
|
|
38
38
|
entryPoint = argument.info.id;
|
|
39
39
|
}
|
|
40
40
|
const ingoingRefs = [...value?.unknownReferences ?? [], ...value?.in ?? [], ...(name === undefined ? [] : [...name.in])];
|
|
@@ -23,13 +23,13 @@ function processFunctionParameter(parameter, data) {
|
|
|
23
23
|
for (const writtenNode of writtenNodes) {
|
|
24
24
|
log_1.log.trace(`parameter ${writtenNode.name} (${writtenNode.nodeId}) is defined at id ${writtenNode.definedAt} with ${defaultValue === undefined ? 'no default value' : ' no default value'}`);
|
|
25
25
|
graph.setDefinitionOfVertex(writtenNode);
|
|
26
|
-
environment = (0, define_1.define)(writtenNode, false, environment, data.
|
|
26
|
+
environment = (0, define_1.define)(writtenNode, false, environment, data.ctx.config);
|
|
27
27
|
if (defaultValue !== undefined) {
|
|
28
28
|
if (parameter.defaultValue?.type === type_1.RType.FunctionDefinition) {
|
|
29
29
|
graph.addEdge(writtenNode, parameter.defaultValue.info.id, edge_1.EdgeType.DefinedBy);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
const definedBy =
|
|
32
|
+
const definedBy = defaultValue.in.concat(defaultValue.unknownReferences);
|
|
33
33
|
for (const node of definedBy) {
|
|
34
34
|
graph.addEdge(writtenNode, node, edge_1.EdgeType.DefinedBy);
|
|
35
35
|
}
|
|
@@ -38,8 +38,8 @@ function processFunctionParameter(parameter, data) {
|
|
|
38
38
|
}
|
|
39
39
|
return {
|
|
40
40
|
unknownReferences: [],
|
|
41
|
-
in: defaultValue === undefined ? [] :
|
|
42
|
-
out:
|
|
41
|
+
in: defaultValue === undefined ? [] : defaultValue.in.concat(defaultValue.unknownReferences, name.in),
|
|
42
|
+
out: (defaultValue?.out ?? []).concat(name.out, name.unknownReferences),
|
|
43
43
|
graph: graph,
|
|
44
44
|
environment: environment,
|
|
45
45
|
entryPoint: parameter.info.id,
|
|
@@ -22,7 +22,7 @@ function processSymbol(symbol, data) {
|
|
|
22
22
|
tag: vertex_1.VertexType.Use,
|
|
23
23
|
id: symbol.info.id,
|
|
24
24
|
cds: data.controlDependencies
|
|
25
|
-
}),
|
|
25
|
+
}, data.ctx.env.makeCleanEnv()),
|
|
26
26
|
entryPoint: symbol.info.id,
|
|
27
27
|
exitPoints: [{ nodeId: symbol.info.id, type: 0 /* ExitPointType.Default */, controlDependencies: data.controlDependencies }]
|
|
28
28
|
};
|
|
@@ -4,4 +4,4 @@ import type { RNodeWithParent } from '../../../r-bridge/lang-4.x/ast/model/proce
|
|
|
4
4
|
/**
|
|
5
5
|
*
|
|
6
6
|
*/
|
|
7
|
-
export declare function processValue<OtherInfo>({ info: { id } }: RNodeWithParent,
|
|
7
|
+
export declare function processValue<OtherInfo>({ info: { id } }: RNodeWithParent, { controlDependencies, completeAst: { idMap }, ctx: { env }, environment }: DataflowProcessorInformation<OtherInfo>): DataflowInformation;
|
|
@@ -7,18 +7,18 @@ const identifier_1 = require("../../environments/identifier");
|
|
|
7
7
|
/**
|
|
8
8
|
*
|
|
9
9
|
*/
|
|
10
|
-
function processValue({ info: { id } },
|
|
10
|
+
function processValue({ info: { id } }, { controlDependencies, completeAst: { idMap }, ctx: { env }, environment }) {
|
|
11
11
|
return {
|
|
12
12
|
unknownReferences: [],
|
|
13
|
-
in: [{ nodeId: id, name: undefined, controlDependencies
|
|
13
|
+
in: [{ nodeId: id, name: undefined, controlDependencies, type: identifier_1.ReferenceType.Constant }],
|
|
14
14
|
out: [],
|
|
15
|
-
environment
|
|
16
|
-
graph: new graph_1.DataflowGraph(
|
|
15
|
+
environment,
|
|
16
|
+
graph: new graph_1.DataflowGraph(idMap).addVertex({
|
|
17
17
|
tag: vertex_1.VertexType.Value,
|
|
18
18
|
id: id,
|
|
19
|
-
cds:
|
|
20
|
-
}),
|
|
21
|
-
exitPoints: [{ nodeId: id, type: 0 /* ExitPointType.Default */, controlDependencies
|
|
19
|
+
cds: controlDependencies
|
|
20
|
+
}, env.makeCleanEnv()),
|
|
21
|
+
exitPoints: [{ nodeId: id, type: 0 /* ExitPointType.Default */, controlDependencies }],
|
|
22
22
|
entryPoint: id
|
|
23
23
|
};
|
|
24
24
|
}
|
|
@@ -14,6 +14,6 @@ import type { DataflowGraph } from '../graph/graph';
|
|
|
14
14
|
* @example getAllRefsToSymbol('3\@y') returns ['3\@y', '4\@y']
|
|
15
15
|
* @param graph - Dataflow Graph
|
|
16
16
|
* @param nodeId - NodeId of Symbol to resolve
|
|
17
|
-
* @returns List including the Definitions and
|
|
17
|
+
* @returns List including the Definitions and References to that definition
|
|
18
18
|
*/
|
|
19
19
|
export declare function getAllRefsToSymbol(graph: DataflowGraph, nodeId: NodeId): NodeId[] | undefined;
|
|
@@ -18,7 +18,7 @@ const dfg_get_origin_1 = require("./dfg-get-origin");
|
|
|
18
18
|
* @example getAllRefsToSymbol('3\@y') returns ['3\@y', '4\@y']
|
|
19
19
|
* @param graph - Dataflow Graph
|
|
20
20
|
* @param nodeId - NodeId of Symbol to resolve
|
|
21
|
-
* @returns List including the Definitions and
|
|
21
|
+
* @returns List including the Definitions and References to that definition
|
|
22
22
|
*/
|
|
23
23
|
function getAllRefsToSymbol(graph, nodeId) {
|
|
24
24
|
// Get all origins and filter for ones that happen for sure
|