@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
|
@@ -8,10 +8,12 @@ export type ReplacementOperatorHandlerArgs = {
|
|
|
8
8
|
};
|
|
9
9
|
export type ReplacementOperatorHandler = (args: ReplacementOperatorHandlerArgs) => void;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Register a new (global) handler for replacement operators.
|
|
12
|
+
* @see {@link handleReplacementOperator}
|
|
12
13
|
*/
|
|
13
14
|
export declare function onReplacementOperator(handler: ReplacementOperatorHandler): void;
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
+
* Handle a replacement operator by calling all registered handlers.
|
|
17
|
+
* @see {@link onReplacementOperator}
|
|
16
18
|
*/
|
|
17
19
|
export declare function handleReplacementOperator(args: ReplacementOperatorHandlerArgs): void;
|
|
@@ -4,13 +4,15 @@ exports.onReplacementOperator = onReplacementOperator;
|
|
|
4
4
|
exports.handleReplacementOperator = handleReplacementOperator;
|
|
5
5
|
const handlers = [];
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Register a new (global) handler for replacement operators.
|
|
8
|
+
* @see {@link handleReplacementOperator}
|
|
8
9
|
*/
|
|
9
10
|
function onReplacementOperator(handler) {
|
|
10
11
|
handlers.push(handler);
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
+
* Handle a replacement operator by calling all registered handlers.
|
|
15
|
+
* @see {@link onReplacementOperator}
|
|
14
16
|
*/
|
|
15
17
|
function handleReplacementOperator(args) {
|
|
16
18
|
handlers.forEach(handler => handler(args));
|
|
@@ -7,9 +7,9 @@ import type { BuiltInMappingName } from '../environments/built-in';
|
|
|
7
7
|
export declare enum VertexType {
|
|
8
8
|
Value = "value",
|
|
9
9
|
Use = "use",
|
|
10
|
-
FunctionCall = "
|
|
11
|
-
VariableDefinition = "
|
|
12
|
-
FunctionDefinition = "
|
|
10
|
+
FunctionCall = "fcall",
|
|
11
|
+
VariableDefinition = "vdef",
|
|
12
|
+
FunctionDefinition = "fdef"
|
|
13
13
|
}
|
|
14
14
|
export declare const ValidVertexTypes: Set<string>;
|
|
15
15
|
export declare const ValidVertexTypeReverse: {
|
package/dataflow/graph/vertex.js
CHANGED
|
@@ -14,9 +14,9 @@ var VertexType;
|
|
|
14
14
|
(function (VertexType) {
|
|
15
15
|
VertexType["Value"] = "value";
|
|
16
16
|
VertexType["Use"] = "use";
|
|
17
|
-
VertexType["FunctionCall"] = "
|
|
18
|
-
VertexType["VariableDefinition"] = "
|
|
19
|
-
VertexType["FunctionDefinition"] = "
|
|
17
|
+
VertexType["FunctionCall"] = "fcall";
|
|
18
|
+
VertexType["VariableDefinition"] = "vdef";
|
|
19
|
+
VertexType["FunctionDefinition"] = "fdef";
|
|
20
20
|
})(VertexType || (exports.VertexType = VertexType = {}));
|
|
21
21
|
exports.ValidVertexTypes = new Set(Object.values(VertexType));
|
|
22
22
|
exports.ValidVertexTypeReverse = Object.fromEntries(Object.entries(VertexType).map(([k, v]) => [v, k]));
|
package/dataflow/info.d.ts
CHANGED
|
@@ -102,12 +102,19 @@ export interface DataflowInformation extends DataflowCfgInformation {
|
|
|
102
102
|
* This is to be used as a "starting point" when processing leaf nodes during the dataflow extraction.
|
|
103
103
|
* @see {@link DataflowInformation}
|
|
104
104
|
*/
|
|
105
|
-
export declare function initializeCleanDataflowInformation<T>(entryPoint: NodeId, data: Pick<DataflowProcessorInformation<T>, 'environment' | '
|
|
105
|
+
export declare function initializeCleanDataflowInformation<T>(entryPoint: NodeId, data: Pick<DataflowProcessorInformation<T>, 'environment' | 'completeAst'>): DataflowInformation;
|
|
106
106
|
/**
|
|
107
107
|
* Checks whether the given control dependencies are exhaustive (i.e. if for every control dependency on a boolean,
|
|
108
108
|
* the list contains a dependency on the `true` and on the `false` case).
|
|
109
|
+
* @see {@link happensInEveryBranchSet} - for the set-based version
|
|
109
110
|
*/
|
|
110
111
|
export declare function happensInEveryBranch(controlDependencies: readonly ControlDependency[] | undefined): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Checks whether the given control dependencies are exhaustive (i.e. if for every control dependency on a boolean,
|
|
114
|
+
* the list contains a dependency on the `true` and on the `false` case).
|
|
115
|
+
* @see {@link happensInEveryBranch} - for the array-based version
|
|
116
|
+
*/
|
|
117
|
+
export declare function happensInEveryBranchSet(controlDependencies: ReadonlySet<ControlDependency> | undefined): boolean;
|
|
111
118
|
/**
|
|
112
119
|
* Checks whether the given dataflow information always exits (i.e., if there is a non-default exit point in every branch).
|
|
113
120
|
* @see {@link ExitPoint} - for the different types of exit points
|
package/dataflow/info.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.addNonDefaultExitPoints = addNonDefaultExitPoints;
|
|
4
4
|
exports.initializeCleanDataflowInformation = initializeCleanDataflowInformation;
|
|
5
5
|
exports.happensInEveryBranch = happensInEveryBranch;
|
|
6
|
+
exports.happensInEveryBranchSet = happensInEveryBranchSet;
|
|
6
7
|
exports.alwaysExits = alwaysExits;
|
|
7
8
|
exports.filterOutLoopExitPoints = filterOutLoopExitPoints;
|
|
8
9
|
exports.diffControlDependency = diffControlDependency;
|
|
@@ -33,6 +34,7 @@ function initializeCleanDataflowInformation(entryPoint, data) {
|
|
|
33
34
|
/**
|
|
34
35
|
* Checks whether the given control dependencies are exhaustive (i.e. if for every control dependency on a boolean,
|
|
35
36
|
* the list contains a dependency on the `true` and on the `false` case).
|
|
37
|
+
* @see {@link happensInEveryBranchSet} - for the set-based version
|
|
36
38
|
*/
|
|
37
39
|
function happensInEveryBranch(controlDependencies) {
|
|
38
40
|
if (controlDependencies === undefined) {
|
|
@@ -43,6 +45,9 @@ function happensInEveryBranch(controlDependencies) {
|
|
|
43
45
|
/* this happens only when we have no idea and require more analysis */
|
|
44
46
|
return false;
|
|
45
47
|
}
|
|
48
|
+
return coversSet(controlDependencies);
|
|
49
|
+
}
|
|
50
|
+
function coversSet(controlDependencies) {
|
|
46
51
|
const trues = [];
|
|
47
52
|
const falseSet = new Set();
|
|
48
53
|
for (const { id, when } of controlDependencies) {
|
|
@@ -55,6 +60,22 @@ function happensInEveryBranch(controlDependencies) {
|
|
|
55
60
|
}
|
|
56
61
|
return trues.every(id => falseSet.has(id));
|
|
57
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Checks whether the given control dependencies are exhaustive (i.e. if for every control dependency on a boolean,
|
|
65
|
+
* the list contains a dependency on the `true` and on the `false` case).
|
|
66
|
+
* @see {@link happensInEveryBranch} - for the array-based version
|
|
67
|
+
*/
|
|
68
|
+
function happensInEveryBranchSet(controlDependencies) {
|
|
69
|
+
if (controlDependencies === undefined) {
|
|
70
|
+
/* the cds are unconstrained */
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
else if (controlDependencies.size === 0) {
|
|
74
|
+
/* this happens only when we have no idea and require more analysis */
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return coversSet(controlDependencies);
|
|
78
|
+
}
|
|
58
79
|
/**
|
|
59
80
|
* Checks whether the given dataflow information always exits (i.e., if there is a non-default exit point in every branch).
|
|
60
81
|
* @see {@link ExitPoint} - for the different types of exit points
|
|
@@ -29,9 +29,7 @@ const prefix_1 = require("../../util/prefix");
|
|
|
29
29
|
*/
|
|
30
30
|
function findNonLocalReads(graph, ignore) {
|
|
31
31
|
const ignores = new Set(ignore.map(i => i.nodeId));
|
|
32
|
-
const ids = new Set(graph.
|
|
33
|
-
.filter(([_, info]) => info.tag === vertex_1.VertexType.Use || info.tag === vertex_1.VertexType.FunctionCall)
|
|
34
|
-
.map(([id, _]) => id));
|
|
32
|
+
const ids = new Set(graph.vertexIdsOfType(vertex_1.VertexType.Use).concat(graph.vertexIdsOfType(vertex_1.VertexType.FunctionCall)));
|
|
35
33
|
/* find all variable use ids which do not link to a given id */
|
|
36
34
|
const nonLocalReads = [];
|
|
37
35
|
for (const id of ids) {
|
|
@@ -202,10 +200,8 @@ function linkFunctionCall(graph, id, info, idMap, thisGraph, calledFunctionDefin
|
|
|
202
200
|
*/
|
|
203
201
|
function linkFunctionCalls(graph, idMap, thisGraph) {
|
|
204
202
|
const calledFunctionDefinitions = [];
|
|
205
|
-
for (const [id, info] of thisGraph.
|
|
206
|
-
|
|
207
|
-
linkFunctionCall(graph, id, info, idMap, thisGraph, calledFunctionDefinitions);
|
|
208
|
-
}
|
|
203
|
+
for (const [id, info] of thisGraph.verticesOfType(vertex_1.VertexType.FunctionCall)) {
|
|
204
|
+
linkFunctionCall(graph, id, info, idMap, thisGraph, calledFunctionDefinitions);
|
|
209
205
|
}
|
|
210
206
|
return calledFunctionDefinitions;
|
|
211
207
|
}
|
|
@@ -241,7 +237,7 @@ function getAllFunctionCallTargets(call, graph, environment) {
|
|
|
241
237
|
* Finds all linked function definitions starting from the given set of read ids.
|
|
242
238
|
*/
|
|
243
239
|
function getAllLinkedFunctionDefinitions(functionDefinitionReadIds, dataflowGraph) {
|
|
244
|
-
let potential =
|
|
240
|
+
let potential = functionDefinitionReadIds.values().toArray();
|
|
245
241
|
const visited = new Set();
|
|
246
242
|
const result = new Set();
|
|
247
243
|
const builtIns = new Set();
|
|
@@ -257,8 +253,9 @@ function getAllLinkedFunctionDefinitions(functionDefinitionReadIds, dataflowGrap
|
|
|
257
253
|
continue;
|
|
258
254
|
}
|
|
259
255
|
visited.add(currentId);
|
|
260
|
-
const outgoingEdges =
|
|
261
|
-
const returnEdges = outgoingEdges
|
|
256
|
+
const outgoingEdges = currentInfo[1].entries().toArray();
|
|
257
|
+
const returnEdges = outgoingEdges
|
|
258
|
+
.filter(([_, e]) => (0, edge_1.edgeIncludesType)(e.types, edge_1.EdgeType.Returns));
|
|
262
259
|
if (returnEdges.length > 0) {
|
|
263
260
|
// only traverse return edges and do not follow `calls` etc. as this indicates that we have a function call which returns a result, and not the function calls itself
|
|
264
261
|
potential = potential.concat(returnEdges.map(([target]) => target).filter(id => !visited.has(id)));
|
|
@@ -270,7 +267,9 @@ function getAllLinkedFunctionDefinitions(functionDefinitionReadIds, dataflowGrap
|
|
|
270
267
|
result.add(currentInfo[0]);
|
|
271
268
|
}
|
|
272
269
|
// trace all joined reads
|
|
273
|
-
potential = potential.concat(followEdges
|
|
270
|
+
potential = potential.concat(followEdges
|
|
271
|
+
.map(([target]) => target)
|
|
272
|
+
.filter(id => !visited.has(id)));
|
|
274
273
|
}
|
|
275
274
|
return [result, builtIns];
|
|
276
275
|
}
|
|
@@ -3,10 +3,10 @@ import type { AstIdMap, ParentInformation } from '../../../../../../r-bridge/lan
|
|
|
3
3
|
import { EmptyArgument } from '../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
|
|
4
4
|
import type { RUnnamedArgument } from '../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-argument';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Converts a normalized node into an unnamed argument (wraps it with an argument node).
|
|
7
7
|
*/
|
|
8
8
|
export declare function toUnnamedArgument<OtherInfo>(node: RNode<OtherInfo & ParentInformation> | undefined, idMap: AstIdMap<OtherInfo>): RUnnamedArgument<OtherInfo & ParentInformation> | typeof EmptyArgument;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Wraps the given nodes as unnamed arguments where necessary.
|
|
11
11
|
*/
|
|
12
12
|
export declare function wrapArgumentsUnnamed<OtherInfo>(nodes: readonly (RNode<OtherInfo & ParentInformation> | typeof EmptyArgument | undefined)[], idMap: AstIdMap<OtherInfo>): ("<>" | import("../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-argument").RArgument<OtherInfo & ParentInformation>)[];
|
|
@@ -7,7 +7,7 @@ const r_function_call_1 = require("../../../../../../r-bridge/lang-4.x/ast/model
|
|
|
7
7
|
const type_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/type");
|
|
8
8
|
const voidRange = (0, range_1.rangeFrom)(-1, -1, -1, -1);
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Converts a normalized node into an unnamed argument (wraps it with an argument node).
|
|
11
11
|
*/
|
|
12
12
|
function toUnnamedArgument(node, idMap) {
|
|
13
13
|
if (node === undefined) {
|
|
@@ -16,7 +16,6 @@ function toUnnamedArgument(node, idMap) {
|
|
|
16
16
|
const arg = {
|
|
17
17
|
type: type_1.RType.Argument,
|
|
18
18
|
lexeme: node.lexeme ?? '',
|
|
19
|
-
// is this correct?
|
|
20
19
|
location: node.location ?? voidRange,
|
|
21
20
|
info: {
|
|
22
21
|
...node.info,
|
|
@@ -29,7 +28,7 @@ function toUnnamedArgument(node, idMap) {
|
|
|
29
28
|
return arg;
|
|
30
29
|
}
|
|
31
30
|
/**
|
|
32
|
-
*
|
|
31
|
+
* Wraps the given nodes as unnamed arguments where necessary.
|
|
33
32
|
*/
|
|
34
33
|
function wrapArgumentsUnnamed(nodes, idMap) {
|
|
35
34
|
return nodes.map(n => n === r_function_call_1.EmptyArgument || n?.type === type_1.RType.Argument ? n : toUnnamedArgument(n, idMap));
|
|
@@ -2,5 +2,11 @@ import { type RFunctionArgument } from '../../../../../../r-bridge/lang-4.x/ast/
|
|
|
2
2
|
import type { RNode } from '../../../../../../r-bridge/lang-4.x/ast/model/model';
|
|
3
3
|
/**
|
|
4
4
|
* Retrieve the value from an argument, if it is not empty.
|
|
5
|
+
* @see {@link unpackArg} - to specifically retrieve non-named arguments
|
|
5
6
|
*/
|
|
6
|
-
export declare function
|
|
7
|
+
export declare function unpackNonameArg<OtherInfo>(arg: RFunctionArgument<OtherInfo> | undefined): RNode<OtherInfo> | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Retrieve the value from a non-named argument, if it is not empty.
|
|
10
|
+
* @see {@link unpackNonameArg} - to specifically retrieve non-named arguments
|
|
11
|
+
*/
|
|
12
|
+
export declare function unpackArg<OtherInfo>(arg: RFunctionArgument<OtherInfo> | undefined): RNode<OtherInfo> | undefined;
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.unpackNonameArg = unpackNonameArg;
|
|
4
|
+
exports.unpackArg = unpackArg;
|
|
4
5
|
const r_function_call_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
|
|
5
6
|
/**
|
|
6
7
|
* Retrieve the value from an argument, if it is not empty.
|
|
8
|
+
* @see {@link unpackArg} - to specifically retrieve non-named arguments
|
|
7
9
|
*/
|
|
8
|
-
function
|
|
9
|
-
return arg ===
|
|
10
|
+
function unpackNonameArg(arg) {
|
|
11
|
+
return arg === r_function_call_1.EmptyArgument || arg?.name !== undefined ? undefined : arg?.value;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Retrieve the value from a non-named argument, if it is not empty.
|
|
15
|
+
* @see {@link unpackNonameArg} - to specifically retrieve non-named arguments
|
|
16
|
+
*/
|
|
17
|
+
function unpackArg(arg) {
|
|
18
|
+
return arg === r_function_call_1.EmptyArgument ? undefined : arg?.value;
|
|
10
19
|
}
|
|
11
20
|
//# sourceMappingURL=unpack-argument.js.map
|
|
@@ -20,6 +20,6 @@ export declare function processAccess<OtherInfo>(name: RSymbol<OtherInfo & Paren
|
|
|
20
20
|
treatIndicesAsString: boolean;
|
|
21
21
|
} & ForceArguments): DataflowInformation;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Converts symbol arguments to string arguments within the specified range.
|
|
24
24
|
*/
|
|
25
25
|
export declare function symbolArgumentsToStrings<OtherInfo>(args: readonly RFunctionArgument<OtherInfo & ParentInformation>[], firstIndexInclusive?: number, lastIndexInclusive?: number): RFunctionArgument<OtherInfo & ParentInformation>[];
|
|
@@ -7,12 +7,12 @@ const r_function_call_1 = require("../../../../../../r-bridge/lang-4.x/ast/model
|
|
|
7
7
|
const logger_1 = require("../../../../../logger");
|
|
8
8
|
const type_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/type");
|
|
9
9
|
const edge_1 = require("../../../../../graph/edge");
|
|
10
|
-
const environment_1 = require("../../../../../environments/environment");
|
|
11
10
|
const built_in_1 = require("../../../../../environments/built-in");
|
|
12
11
|
const built_in_assignment_1 = require("./built-in-assignment");
|
|
13
12
|
const identifier_1 = require("../../../../../environments/identifier");
|
|
14
13
|
const vertex_1 = require("../../../../../graph/vertex");
|
|
15
14
|
const containers_1 = require("../../../../../../util/containers");
|
|
15
|
+
const reference_to_maybe_1 = require("../../../../../environments/reference-to-maybe");
|
|
16
16
|
function tableAssignmentProcessor(name, args, rootId, data, outInfo) {
|
|
17
17
|
outInfo.definitionRootNodes.push(rootId);
|
|
18
18
|
return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'table:assign' }).information;
|
|
@@ -71,12 +71,12 @@ function processAccess(name, args, rootId, data, config) {
|
|
|
71
71
|
* ```
|
|
72
72
|
* the read for a will use both accesses as potential definitions and not just the last one!
|
|
73
73
|
*/
|
|
74
|
-
unknownReferences: (0,
|
|
74
|
+
unknownReferences: (0, reference_to_maybe_1.makeAllMaybe)(info.unknownReferences, info.graph, info.environment, false),
|
|
75
75
|
entryPoint: rootId,
|
|
76
76
|
/** it is, to be precise, the accessed element we want to map to maybe */
|
|
77
77
|
in: head === r_function_call_1.EmptyArgument ? info.in : info.in.map(ref => {
|
|
78
78
|
if (ref.nodeId === head.value?.info.id) {
|
|
79
|
-
return (0,
|
|
79
|
+
return (0, reference_to_maybe_1.makeReferenceMaybe)(ref, info.graph, info.environment, false);
|
|
80
80
|
}
|
|
81
81
|
else {
|
|
82
82
|
return ref;
|
|
@@ -114,16 +114,16 @@ function processNumberBasedAccess(data, name, args, rootId, config, head) {
|
|
|
114
114
|
if (head.value && outInfo.definitionRootNodes.length > 0) {
|
|
115
115
|
(0, built_in_assignment_1.markAsAssignment)(fnCall.information, { type: identifier_1.ReferenceType.Variable, name: head.value.lexeme ?? '', nodeId: head.value.info.id, definedAt: rootId, controlDependencies: [] }, outInfo.definitionRootNodes, rootId, data);
|
|
116
116
|
}
|
|
117
|
-
if (data.
|
|
117
|
+
if (data.ctx.config.solver.pointerTracking) {
|
|
118
118
|
referenceAccessedIndices(args, data, fnCall, rootId, true);
|
|
119
119
|
}
|
|
120
120
|
return fnCall;
|
|
121
121
|
}
|
|
122
122
|
/**
|
|
123
|
-
*
|
|
123
|
+
* Converts symbol arguments to string arguments within the specified range.
|
|
124
124
|
*/
|
|
125
125
|
function symbolArgumentsToStrings(args, firstIndexInclusive = 1, lastIndexInclusive = args.length - 1) {
|
|
126
|
-
const newArgs =
|
|
126
|
+
const newArgs = args.slice();
|
|
127
127
|
// if the argument is a symbol, we convert it to a string for this perspective
|
|
128
128
|
for (let i = firstIndexInclusive; i <= lastIndexInclusive; i++) {
|
|
129
129
|
const arg = newArgs[i];
|
|
@@ -159,7 +159,7 @@ function processStringBasedAccess(args, data, name, rootId, config) {
|
|
|
159
159
|
const fnCall = (0, known_call_handling_1.processKnownFunctionCall)({ name, args: newArgs, rootId, data, forceArgs: config.forceArgs,
|
|
160
160
|
origin: 'builtin:access'
|
|
161
161
|
});
|
|
162
|
-
if (data.
|
|
162
|
+
if (data.ctx.config.solver.pointerTracking) {
|
|
163
163
|
referenceAccessedIndices(newArgs, data, fnCall, rootId, false);
|
|
164
164
|
}
|
|
165
165
|
return fnCall;
|
|
@@ -60,7 +60,7 @@ function processApply(name, args, rootId, data, config) {
|
|
|
60
60
|
else if (val.type === type_1.RType.Symbol) {
|
|
61
61
|
functionId = val.info.id;
|
|
62
62
|
if (resolveValue) {
|
|
63
|
-
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(val.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.
|
|
63
|
+
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(val.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.ctx.config.solver.variables, ctx: data.ctx }));
|
|
64
64
|
if (resolved?.elements.length === 1 && resolved.elements[0].type === 'string') {
|
|
65
65
|
functionName = (0, r_value_1.isValue)(resolved.elements[0].value) ? resolved.elements[0].value.str : undefined;
|
|
66
66
|
}
|
|
@@ -105,7 +105,7 @@ function processApply(name, args, rootId, data, config) {
|
|
|
105
105
|
cds: data.controlDependencies,
|
|
106
106
|
args: allOtherArguments, // same reference
|
|
107
107
|
origin: ['function']
|
|
108
|
-
});
|
|
108
|
+
}, data.ctx.env.makeCleanEnv());
|
|
109
109
|
information.graph.addEdge(rootId, rootFnId, edge_1.EdgeType.Calls | edge_1.EdgeType.Reads);
|
|
110
110
|
information.graph.addEdge(rootId, functionId, edge_1.EdgeType.Calls | edge_1.EdgeType.Argument);
|
|
111
111
|
information = {
|
|
@@ -51,4 +51,6 @@ export interface AssignmentToSymbolParameters<OtherInfo> extends AssignmentConfi
|
|
|
51
51
|
export declare function markAsAssignment<OtherInfo>(information: {
|
|
52
52
|
environment: REnvironmentInformation;
|
|
53
53
|
graph: DataflowGraph;
|
|
54
|
-
}, nodeToDefine: InGraphIdentifierDefinition
|
|
54
|
+
}, nodeToDefine: InGraphIdentifierDefinition & {
|
|
55
|
+
name: string;
|
|
56
|
+
}, sourceIds: readonly NodeId[], rootIdOfAssignment: NodeId, data: DataflowProcessorInformation<OtherInfo>, assignmentConfig?: AssignmentConfiguration): void;
|
|
@@ -112,7 +112,7 @@ args, rootId, data, config) {
|
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
114
|
// try to resolve the variable first
|
|
115
|
-
const n = (0, alias_tracking_1.resolveIdToValue)(target.info.id, { environment: data.environment, resolve: data.
|
|
115
|
+
const n = (0, alias_tracking_1.resolveIdToValue)(target.info.id, { environment: data.environment, resolve: data.ctx.config.solver.variables, idMap: data.completeAst.idMap, full: true, ctx: data.ctx });
|
|
116
116
|
if (n.type === 'set' && n.elements.length === 1 && n.elements[0].type === 'string') {
|
|
117
117
|
const val = n.elements[0].value;
|
|
118
118
|
if ((0, r_value_1.isValue)(val)) {
|
|
@@ -187,8 +187,8 @@ args, rootId, data, config) {
|
|
|
187
187
|
return info;
|
|
188
188
|
}
|
|
189
189
|
function extractSourceAndTarget(args) {
|
|
190
|
-
const source = (0, unpack_argument_1.
|
|
191
|
-
const target = (0, unpack_argument_1.
|
|
190
|
+
const source = (0, unpack_argument_1.unpackArg)(args[1]);
|
|
191
|
+
const target = (0, unpack_argument_1.unpackArg)(args[0]);
|
|
192
192
|
return { source, target };
|
|
193
193
|
}
|
|
194
194
|
/**
|
|
@@ -259,7 +259,7 @@ function checkTargetReferenceType(source, sourceInfo) {
|
|
|
259
259
|
* @param assignmentConfig - configuration for the assignment processing
|
|
260
260
|
*/
|
|
261
261
|
function markAsAssignment(information, nodeToDefine, sourceIds, rootIdOfAssignment, data, assignmentConfig) {
|
|
262
|
-
if (data.
|
|
262
|
+
if (data.ctx.config.solver.pointerTracking) {
|
|
263
263
|
let indicesCollection = undefined;
|
|
264
264
|
if (sourceIds.length === 1) {
|
|
265
265
|
// support for tracking indices.
|
|
@@ -288,7 +288,7 @@ function markAsAssignment(information, nodeToDefine, sourceIds, rootIdOfAssignme
|
|
|
288
288
|
}
|
|
289
289
|
nodeToDefine.indicesCollection ??= indicesCollection;
|
|
290
290
|
}
|
|
291
|
-
information.environment = (0, define_1.define)(nodeToDefine, assignmentConfig?.superAssignment, information.environment, data.
|
|
291
|
+
information.environment = (0, define_1.define)(nodeToDefine, assignmentConfig?.superAssignment, information.environment, data.ctx.config);
|
|
292
292
|
information.graph.setDefinitionOfVertex(nodeToDefine);
|
|
293
293
|
if (!assignmentConfig?.quoteSource) {
|
|
294
294
|
for (const sourceId of sourceIds) {
|
|
@@ -343,7 +343,7 @@ function processAssignmentToSymbol(config) {
|
|
|
343
343
|
unknownReferences: [],
|
|
344
344
|
entryPoint: rootId,
|
|
345
345
|
in: readTargets,
|
|
346
|
-
out:
|
|
346
|
+
out: writeNodes.concat(readFromSourceWritten),
|
|
347
347
|
};
|
|
348
348
|
}
|
|
349
349
|
//# sourceMappingURL=built-in-assignment.js.map
|
|
@@ -33,12 +33,12 @@ function processEvalCall(name, args, rootId, data, config) {
|
|
|
33
33
|
if (config.includeFunctionCall) {
|
|
34
34
|
information.graph.addEdge(rootId, args[0].value.info.id, edge_1.EdgeType.Returns);
|
|
35
35
|
}
|
|
36
|
-
if (!data.
|
|
36
|
+
if (!data.ctx.config.solver.evalStrings) {
|
|
37
37
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Skipping eval call ${JSON.stringify(evalArgument)} (disabled in config file)`);
|
|
38
38
|
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
|
|
39
39
|
return information;
|
|
40
40
|
}
|
|
41
|
-
const code = resolveEvalToCode(evalArgument.value, data.environment, data.completeAst.idMap, data.
|
|
41
|
+
const code = resolveEvalToCode(evalArgument.value, data.environment, data.completeAst.idMap, data.ctx);
|
|
42
42
|
if (code) {
|
|
43
43
|
const idGenerator = (0, decorate_1.sourcedDeterministicCountingIdGenerator)(name.lexeme + '::' + rootId, name.location);
|
|
44
44
|
data = {
|
|
@@ -60,17 +60,17 @@ function processEvalCall(name, args, rootId, data, config) {
|
|
|
60
60
|
graph: result.reduce((acc, r) => acc.mergeWith(r.graph), information.graph),
|
|
61
61
|
environment: result.reduce((acc, r) => (0, append_1.appendEnvironment)(acc, r.environment), information.environment),
|
|
62
62
|
entryPoint: rootId,
|
|
63
|
-
out:
|
|
64
|
-
in:
|
|
65
|
-
unknownReferences:
|
|
66
|
-
exitPoints:
|
|
63
|
+
out: information.out.concat(result.flatMap(r => r.out)),
|
|
64
|
+
in: information.in.concat(result.flatMap(r => r.in)),
|
|
65
|
+
unknownReferences: information.unknownReferences.concat(result.flatMap(r => r.unknownReferences)),
|
|
66
|
+
exitPoints: information.exitPoints.concat(result.flatMap(r => r.exitPoints)),
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
69
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Non-constant argument ${JSON.stringify(args)} for eval is currently not supported, skipping`);
|
|
70
70
|
(0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
|
|
71
71
|
return information;
|
|
72
72
|
}
|
|
73
|
-
function resolveEvalToCode(evalArgument, env, idMap,
|
|
73
|
+
function resolveEvalToCode(evalArgument, env, idMap, ctx) {
|
|
74
74
|
const val = evalArgument;
|
|
75
75
|
if (val.type === type_1.RType.FunctionCall && val.named && val.functionName.content === 'parse') {
|
|
76
76
|
const arg = val.arguments.find(v => v !== r_function_call_1.EmptyArgument && v.name?.content === 'text');
|
|
@@ -82,13 +82,13 @@ function resolveEvalToCode(evalArgument, env, idMap, config) {
|
|
|
82
82
|
return [arg.value.content.str];
|
|
83
83
|
}
|
|
84
84
|
else if (arg.value?.type === type_1.RType.Symbol) {
|
|
85
|
-
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(arg.value.info.id, { environment: env, idMap: idMap, resolve: config.solver.variables }));
|
|
85
|
+
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(arg.value.info.id, { environment: env, idMap: idMap, resolve: ctx.config.solver.variables, ctx }));
|
|
86
86
|
if (resolved) {
|
|
87
87
|
return (0, string_constants_1.collectStrings)(resolved.elements);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
else if (arg.value?.type === type_1.RType.FunctionCall && arg.value.named && ['paste', 'paste0'].includes(arg.value.functionName.content)) {
|
|
91
|
-
return handlePaste(config, arg.value.arguments, env, idMap, arg.value.functionName.content === 'paste' ? [' '] : ['']);
|
|
91
|
+
return handlePaste(ctx.config, arg.value.arguments, env, idMap, arg.value.functionName.content === 'paste' ? [' '] : [''], ctx);
|
|
92
92
|
}
|
|
93
93
|
return undefined;
|
|
94
94
|
}
|
|
@@ -101,7 +101,7 @@ function resolveEvalToCode(evalArgument, env, idMap, config) {
|
|
|
101
101
|
return undefined;
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
function getAsString(config, val, env, idMap) {
|
|
104
|
+
function getAsString(config, val, env, idMap, ctx) {
|
|
105
105
|
if (!val) {
|
|
106
106
|
return undefined;
|
|
107
107
|
}
|
|
@@ -109,17 +109,17 @@ function getAsString(config, val, env, idMap) {
|
|
|
109
109
|
return [val.content.str];
|
|
110
110
|
}
|
|
111
111
|
else if (val.type === type_1.RType.Symbol) {
|
|
112
|
-
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(val.info.id, { environment: env, idMap: idMap, resolve: config.solver.variables }));
|
|
112
|
+
const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(val.info.id, { environment: env, idMap: idMap, resolve: config.solver.variables, ctx }));
|
|
113
113
|
if (resolved) {
|
|
114
114
|
return (0, string_constants_1.collectStrings)(resolved.elements);
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
return undefined;
|
|
118
118
|
}
|
|
119
|
-
function handlePaste(config, args, env, idMap, sepDefault) {
|
|
119
|
+
function handlePaste(config, args, env, idMap, sepDefault, ctx) {
|
|
120
120
|
const sepArg = args.find(v => v !== r_function_call_1.EmptyArgument && v.name?.content === 'sep');
|
|
121
121
|
if (sepArg) {
|
|
122
|
-
const res = sepArg !== r_function_call_1.EmptyArgument && sepArg.value ? getAsString(config, sepArg.value, env, idMap) : undefined;
|
|
122
|
+
const res = sepArg !== r_function_call_1.EmptyArgument && sepArg.value ? getAsString(config, sepArg.value, env, idMap, ctx) : undefined;
|
|
123
123
|
if (!res) {
|
|
124
124
|
// sep not resolvable clearly / unknown
|
|
125
125
|
return undefined;
|
|
@@ -128,7 +128,7 @@ function handlePaste(config, args, env, idMap, sepDefault) {
|
|
|
128
128
|
}
|
|
129
129
|
const allArgs = args
|
|
130
130
|
.filter(v => v !== r_function_call_1.EmptyArgument && v.name?.content !== 'sep' && v.value)
|
|
131
|
-
.map(v => getAsString(config, v.value, env, idMap));
|
|
131
|
+
.map(v => getAsString(config, v.value, env, idMap, ctx));
|
|
132
132
|
if (allArgs.some(assert_1.isUndefined)) {
|
|
133
133
|
return undefined;
|
|
134
134
|
}
|
|
@@ -7,7 +7,6 @@ const linker_1 = require("../../../../linker");
|
|
|
7
7
|
const assert_1 = require("../../../../../../util/assert");
|
|
8
8
|
const unpack_argument_1 = require("../argument/unpack-argument");
|
|
9
9
|
const common_1 = require("../common");
|
|
10
|
-
const environment_1 = require("../../../../../environments/environment");
|
|
11
10
|
const graph_1 = require("../../../../../graph/graph");
|
|
12
11
|
const identifier_1 = require("../../../../../environments/identifier");
|
|
13
12
|
const resolve_by_name_1 = require("../../../../../environments/resolve-by-name");
|
|
@@ -18,7 +17,7 @@ const built_in_1 = require("../../../../../environments/built-in");
|
|
|
18
17
|
const overwrite_1 = require("../../../../../environments/overwrite");
|
|
19
18
|
const logger_1 = require("../../../../../logger");
|
|
20
19
|
const log_1 = require("../../../../../../util/log");
|
|
21
|
-
const
|
|
20
|
+
const reference_to_maybe_1 = require("../../../../../environments/reference-to-maybe");
|
|
22
21
|
const dotDotDotAccess = /^\.\.\d+$/;
|
|
23
22
|
function linkReadNameToWriteIfPossible(read, environments, listEnvironments, remainingRead, nextGraph) {
|
|
24
23
|
const readName = read.name && dotDotDotAccess.test(read.name) ? '...' : read.name;
|
|
@@ -82,7 +81,10 @@ function updateSideEffectsForCalledFunctions(calledEnvs, inputEnvironment, nextG
|
|
|
82
81
|
// we update all definitions to be linked with the corresponding function call
|
|
83
82
|
// we, however, have to ignore expression-local writes!
|
|
84
83
|
if (localDefs.length > 0) {
|
|
85
|
-
environment =
|
|
84
|
+
environment = {
|
|
85
|
+
current: environment.current.removeAll(localDefs.filter(d => (0, assert_1.isNotUndefined)(d.name))),
|
|
86
|
+
level: environment.level
|
|
87
|
+
};
|
|
86
88
|
}
|
|
87
89
|
if (callDependencies === null) {
|
|
88
90
|
callDependencies = nextGraph.getVertex(functionCall, true)?.cds;
|
|
@@ -97,7 +99,7 @@ function updateSideEffectsForCalledFunctions(calledEnvs, inputEnvironment, nextG
|
|
|
97
99
|
*
|
|
98
100
|
*/
|
|
99
101
|
function processExpressionList(name, args, rootId, data) {
|
|
100
|
-
const expressions = args.map(
|
|
102
|
+
const expressions = args.map(unpack_argument_1.unpackNonameArg);
|
|
101
103
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `[expr list] with ${expressions.length} expressions`);
|
|
102
104
|
let { environment } = data;
|
|
103
105
|
// used to detect if a "write" happens within the same expression list
|
|
@@ -124,9 +126,9 @@ function processExpressionList(name, args, rootId, data) {
|
|
|
124
126
|
// if the expression contained next or break anywhere before the next loop, the "overwrite" should be an "append", because we do not know if the rest is executed
|
|
125
127
|
// update the environments for the next iteration with the previous writes
|
|
126
128
|
if (exitPoints.length > 0) {
|
|
127
|
-
processed.out = (0,
|
|
128
|
-
processed.in = (0,
|
|
129
|
-
processed.unknownReferences = (0,
|
|
129
|
+
processed.out = (0, reference_to_maybe_1.makeAllMaybe)(processed.out, nextGraph, processed.environment, true);
|
|
130
|
+
processed.in = (0, reference_to_maybe_1.makeAllMaybe)(processed.in, nextGraph, processed.environment, false);
|
|
131
|
+
processed.unknownReferences = (0, reference_to_maybe_1.makeAllMaybe)(processed.unknownReferences, nextGraph, processed.environment, false);
|
|
130
132
|
}
|
|
131
133
|
(0, info_1.addNonDefaultExitPoints)(exitPoints, processed.exitPoints);
|
|
132
134
|
out = out.concat(processed.out);
|
|
@@ -153,7 +155,7 @@ function processExpressionList(name, args, rootId, data) {
|
|
|
153
155
|
controlDependencies: data.controlDependencies
|
|
154
156
|
});
|
|
155
157
|
}
|
|
156
|
-
const ingoing =
|
|
158
|
+
const ingoing = remainingRead.values().toArray().flat();
|
|
157
159
|
const rootNode = data.completeAst.idMap.get(rootId);
|
|
158
160
|
const withGroup = rootNode?.grouping;
|
|
159
161
|
if (withGroup) {
|
|
@@ -12,9 +12,9 @@ const logger_1 = require("../../../../../logger");
|
|
|
12
12
|
const overwrite_1 = require("../../../../../environments/overwrite");
|
|
13
13
|
const define_1 = require("../../../../../environments/define");
|
|
14
14
|
const append_1 = require("../../../../../environments/append");
|
|
15
|
-
const environment_1 = require("../../../../../environments/environment");
|
|
16
15
|
const edge_1 = require("../../../../../graph/edge");
|
|
17
16
|
const identifier_1 = require("../../../../../environments/identifier");
|
|
17
|
+
const reference_to_maybe_1 = require("../../../../../environments/reference-to-maybe");
|
|
18
18
|
/**
|
|
19
19
|
*
|
|
20
20
|
*/
|
|
@@ -23,7 +23,7 @@ function processForLoop(name, args, rootId, data) {
|
|
|
23
23
|
logger_1.dataflowLogger.warn(`For-Loop ${name.content} does not have three arguments, skipping`);
|
|
24
24
|
return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information;
|
|
25
25
|
}
|
|
26
|
-
const [variableArg, vectorArg, bodyArg] = args.map(e => (0, unpack_argument_1.
|
|
26
|
+
const [variableArg, vectorArg, bodyArg] = args.map(e => (0, unpack_argument_1.unpackNonameArg)(e));
|
|
27
27
|
(0, assert_1.guard)(variableArg !== undefined && vectorArg !== undefined && bodyArg !== undefined, () => `For-Loop ${JSON.stringify(args)} has missing arguments! Bad!`);
|
|
28
28
|
const vector = (0, processor_1.processDataflowFor)(vectorArg, data);
|
|
29
29
|
if ((0, info_1.alwaysExits)(vector)) {
|
|
@@ -37,7 +37,7 @@ function processForLoop(name, args, rootId, data) {
|
|
|
37
37
|
const headGraph = variable.graph.mergeWith(vector.graph);
|
|
38
38
|
const writtenVariable = variable.unknownReferences.concat(variable.in);
|
|
39
39
|
for (const write of writtenVariable) {
|
|
40
|
-
headEnvironments = (0, define_1.define)({ ...write, definedAt: name.info.id, type: identifier_1.ReferenceType.Variable }, false, headEnvironments, data.
|
|
40
|
+
headEnvironments = (0, define_1.define)({ ...write, definedAt: name.info.id, type: identifier_1.ReferenceType.Variable }, false, headEnvironments, data.ctx.config);
|
|
41
41
|
}
|
|
42
42
|
data = { ...data, controlDependencies: [...data.controlDependencies ?? [], { id: name.info.id, when: true }], environment: headEnvironments };
|
|
43
43
|
const body = (0, processor_1.processDataflowFor)(bodyArg, data);
|
|
@@ -50,7 +50,7 @@ function processForLoop(name, args, rootId, data) {
|
|
|
50
50
|
nextGraph.addEdge(write.nodeId, vector.entryPoint, edge_1.EdgeType.DefinedBy);
|
|
51
51
|
nextGraph.setDefinitionOfVertex(write);
|
|
52
52
|
}
|
|
53
|
-
const outgoing = variable.out.concat(writtenVariable, (0,
|
|
53
|
+
const outgoing = variable.out.concat(writtenVariable, (0, reference_to_maybe_1.makeAllMaybe)(body.out, nextGraph, outEnvironment, true));
|
|
54
54
|
(0, linker_1.linkCircularRedefinitionsWithinALoop)(nextGraph, nameIdShares, body.out);
|
|
55
55
|
(0, linker_1.reapplyLoopExitPoints)(body.exitPoints, body.in.concat(body.out, body.unknownReferences));
|
|
56
56
|
(0, common_1.patchFunctionCall)({
|
|
@@ -6,6 +6,7 @@ import { type RFunctionArgument } from '../../../../../../r-bridge/lang-4.x/ast/
|
|
|
6
6
|
import type { NodeId } from '../../../../../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
7
7
|
import { DataflowGraph } from '../../../../../graph/graph';
|
|
8
8
|
import { type REnvironmentInformation } from '../../../../../environments/environment';
|
|
9
|
+
import type { ReadOnlyFlowrAnalyzerContext } from '../../../../../../project/context/flowr-analyzer-context';
|
|
9
10
|
/**
|
|
10
11
|
* Process a function definition, i.e., `function(a, b) { ... }`
|
|
11
12
|
*/
|
|
@@ -13,7 +14,7 @@ export declare function processFunctionDefinition<OtherInfo>(name: RSymbol<Other
|
|
|
13
14
|
/**
|
|
14
15
|
*
|
|
15
16
|
*/
|
|
16
|
-
export declare function retrieveActiveEnvironment(callerEnvironment: REnvironmentInformation | undefined, baseEnvironment: REnvironmentInformation): REnvironmentInformation;
|
|
17
|
+
export declare function retrieveActiveEnvironment(callerEnvironment: REnvironmentInformation | undefined, baseEnvironment: REnvironmentInformation, ctx: ReadOnlyFlowrAnalyzerContext): REnvironmentInformation;
|
|
17
18
|
/**
|
|
18
19
|
* Update the closure links of all nested function definitions
|
|
19
20
|
* @param graph - dataflow graph to collect the function definitions from and to update the closure links for
|