@eagleoutice/flowr 2.6.2 → 2.6.3
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.js +3 -3
- package/abstract-interpretation/data-frame/mappers/function-mapper.d.ts +7 -7
- package/abstract-interpretation/data-frame/mappers/function-mapper.js +20 -16
- package/abstract-interpretation/data-frame/semantics.js +8 -0
- package/abstract-interpretation/data-frame/shape-inference.d.ts +3 -3
- package/abstract-interpretation/data-frame/shape-inference.js +3 -3
- package/abstract-interpretation/normalized-ast-fold.d.ts +1 -1
- package/benchmark/slicer.d.ts +1 -0
- package/benchmark/slicer.js +13 -12
- package/benchmark/summarizer/first-phase/process.js +1 -1
- package/benchmark/summarizer/second-phase/graph.d.ts +3 -1
- package/benchmark/summarizer/second-phase/graph.js +3 -1
- 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 +13 -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 +14 -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 +1 -2
- package/core/steps/all/static-slicing/00-slice.js +1 -1
- 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 +55 -56
- package/core/steps/pipeline/default-pipelines.js +8 -8
- package/dataflow/environments/clone.d.ts +0 -1
- package/dataflow/environments/clone.js +12 -2
- package/dataflow/environments/diff.js +2 -2
- package/dataflow/environments/overwrite.d.ts +1 -5
- package/dataflow/environments/overwrite.js +3 -19
- package/dataflow/environments/scoping.d.ts +6 -2
- package/dataflow/environments/scoping.js +6 -2
- package/dataflow/eval/resolve/resolve-argument.js +2 -2
- 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 -22
- package/dataflow/graph/graph.d.ts +3 -9
- package/dataflow/graph/graph.js +0 -13
- package/dataflow/graph/unknown-replacement.d.ts +4 -2
- package/dataflow/graph/unknown-replacement.js +4 -2
- package/dataflow/info.d.ts +7 -0
- package/dataflow/info.js +21 -0
- package/dataflow/internal/linker.js +7 -4
- 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/built-in/built-in-access.d.ts +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-access.js +4 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +4 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +6 -6
- package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +1 -1
- 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 +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.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 +3 -3
- 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 +6 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +2 -2
- 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 +1 -1
- package/dataflow/internal/process/functions/call/common.d.ts +1 -1
- package/dataflow/internal/process/functions/call/common.js +4 -4
- 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 +3 -3
- package/dataflow/internal/process/functions/call/named-call-handling.js +4 -4
- package/dataflow/internal/process/functions/process-parameter.js +4 -4
- 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 +6 -11
- 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 +13 -13
- 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 +12 -9
- 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 +108 -61
- 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 +412 -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} +142 -172
- 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 +22 -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 +133 -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 +13 -17
- package/linter/rules/absolute-path.d.ts +1 -2
- package/linter/rules/absolute-path.js +2 -2
- package/linter/rules/dataframe-access-validation.d.ts +1 -1
- package/linter/rules/dataframe-access-validation.js +12 -8
- 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 +1 -5
- 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 +3 -2
- package/linter/rules/seeded-randomness.js +33 -13
- 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 +6 -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 +30 -5
- package/project/context/flowr-analyzer-context.js +48 -4
- 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 +4 -2
- 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/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 +1 -1
- 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.js +1 -1
- package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +2 -2
- package/queries/catalog/df-shape-query/df-shape-query-format.js +6 -5
- 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 +1 -1
- 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 +2 -2
- 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 +1 -1
- 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/statistics/features/supported/assignments/assignments.js +1 -1
- package/statistics/features/supported/control-flow/control-flow.js +1 -1
- 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 +1 -1
- package/statistics/features/supported/variables/variables.js +1 -1
- package/statistics/statistics.js +3 -2
- package/util/assert.d.ts +4 -0
- package/util/assert.js +4 -0
- 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/version.js +1 -1
- 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
|
@@ -9,7 +9,12 @@ 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
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* Process a built-in repeat loop function call like `repeat { ... }`.
|
|
13
|
+
* @param name - The name of the function being called.
|
|
14
|
+
* @param args - The arguments passed to the function.
|
|
15
|
+
* @param rootId - The root node ID for the current processing context.
|
|
16
|
+
* @param data - Additional dataflow processor information.
|
|
17
|
+
* @returns - The resulting dataflow information after processing the repeat loop.
|
|
13
18
|
*/
|
|
14
19
|
function processRepeatLoop(name, args, rootId, data) {
|
|
15
20
|
if (args.length !== 1 || args[0] === r_function_call_1.EmptyArgument) {
|
|
@@ -30,7 +30,7 @@ args, rootId, data, config) {
|
|
|
30
30
|
/* we only get here if <-, <<-, ... or whatever is part of the replacement is not overwritten */
|
|
31
31
|
(0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Replacement ${name.content} with ${JSON.stringify(args)}, processing`);
|
|
32
32
|
let indices = config.activeIndices;
|
|
33
|
-
if (data.
|
|
33
|
+
if (data.ctx.config.solver.pointerTracking) {
|
|
34
34
|
indices ??= constructAccessedIndices(name.content, args);
|
|
35
35
|
}
|
|
36
36
|
/* we assign the first argument by the last for now and maybe mark as maybe!, we can keep the symbol as we now know we have an assignment */
|
|
@@ -81,7 +81,7 @@ args, rootId, data, config) {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
const fa = (0, unpack_argument_1.unpackArgument)(args[0]);
|
|
84
|
-
if (!data.
|
|
84
|
+
if (!data.ctx.config.solver.pointerTracking && fa) {
|
|
85
85
|
res = {
|
|
86
86
|
...res,
|
|
87
87
|
in: [...res.in, { name: fa.lexeme, type: identifier_1.ReferenceType.Variable, nodeId: fa.info.id, controlDependencies: data.controlDependencies }]
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
import { type DataflowProcessorInformation } from '../../../../../processor';
|
|
2
2
|
import { type DataflowInformation } from '../../../../../info';
|
|
3
3
|
import { type FlowrLaxSourcingOptions, InferWorkingDirectory } from '../../../../../../config';
|
|
4
|
-
import { type RParseRequest
|
|
4
|
+
import { type RParseRequest } from '../../../../../../r-bridge/retriever';
|
|
5
5
|
import { type IdGenerator, type ParentInformation } from '../../../../../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
6
6
|
import { type RFunctionArgument } from '../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
|
|
7
7
|
import type { RSymbol } from '../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-symbol';
|
|
8
8
|
import type { NodeId } from '../../../../../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
9
9
|
import type { NoInfo } from '../../../../../../r-bridge/lang-4.x/ast/model/model';
|
|
10
|
+
import type { ReadOnlyFlowrAnalyzerContext } from '../../../../../../project/context/flowr-analyzer-context';
|
|
11
|
+
import type { RProjectFile } from '../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-project';
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
13
|
+
* Infers working directories based on the given option and reference chain
|
|
12
14
|
*/
|
|
13
|
-
export declare function
|
|
15
|
+
export declare function inferWdFromScript(option: InferWorkingDirectory, referenceChain: readonly (string | undefined)[]): string[];
|
|
14
16
|
/**
|
|
15
|
-
*
|
|
17
|
+
* Return the basename of a path in a platform-agnostic way
|
|
18
|
+
* @see {@link platformDirname} - for the dirname counterpart
|
|
16
19
|
*/
|
|
17
|
-
export declare function
|
|
20
|
+
export declare function platformBasename(p: string): string;
|
|
18
21
|
/**
|
|
19
|
-
*
|
|
22
|
+
* Return the dirname of a path in a platform-agnostic way
|
|
20
23
|
*/
|
|
21
|
-
export declare function
|
|
24
|
+
export declare function platformDirname(p: string): string;
|
|
22
25
|
/**
|
|
23
26
|
* Tries to find sourced by a source request and returns the first path that exists
|
|
24
27
|
* @param resolveSource - options for lax file sourcing
|
|
@@ -26,7 +29,8 @@ export declare function inferWdFromScript(option: InferWorkingDirectory, referen
|
|
|
26
29
|
* @param data - more information on the loading context
|
|
27
30
|
*/
|
|
28
31
|
export declare function findSource(resolveSource: FlowrLaxSourcingOptions | undefined, seed: string, data: {
|
|
29
|
-
referenceChain: readonly
|
|
32
|
+
referenceChain: readonly (string | undefined)[];
|
|
33
|
+
ctx: ReadOnlyFlowrAnalyzerContext;
|
|
30
34
|
}): string[] | undefined;
|
|
31
35
|
/**
|
|
32
36
|
* Processes a named function call (i.e., not an anonymous function)
|
|
@@ -39,9 +43,10 @@ export declare function processSourceCall<OtherInfo>(name: RSymbol<OtherInfo & P
|
|
|
39
43
|
}): DataflowInformation;
|
|
40
44
|
/**
|
|
41
45
|
* Processes a source request with the given dataflow processor information and existing dataflow information
|
|
46
|
+
* Otherwise, this can be an {@link RProjectFile} representing a standalone source file
|
|
42
47
|
*/
|
|
43
|
-
export declare function sourceRequest<OtherInfo>(rootId: NodeId, request: RParseRequest
|
|
48
|
+
export declare function sourceRequest<OtherInfo>(rootId: NodeId, request: RParseRequest | RProjectFile<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>, information: DataflowInformation, getId?: IdGenerator<NoInfo>): DataflowInformation;
|
|
44
49
|
/**
|
|
45
50
|
* Processes a standalone source file (i.e., not from a source function call)
|
|
46
51
|
*/
|
|
47
|
-
export declare function standaloneSourceFile<OtherInfo>(
|
|
52
|
+
export declare function standaloneSourceFile<OtherInfo>(idx: number, file: RProjectFile<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>, information: DataflowInformation): DataflowInformation;
|
|
@@ -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 }));
|
|
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 = {
|
|
@@ -27,7 +27,7 @@ function processWhileLoop(name, args, rootId, data) {
|
|
|
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 });
|
|
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) {
|
|
@@ -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> {
|
|
@@ -44,9 +44,9 @@ function forceVertexArgumentValueReferences(rootId, value, graph, env) {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
47
|
+
* Processes all arguments for a function call, updating the given final graph and environment.
|
|
48
48
|
*/
|
|
49
|
-
function processAllArguments({ functionName, args, data, finalGraph, functionRootId, forceArgs = [], patchData
|
|
49
|
+
function processAllArguments({ functionName, args, data, finalGraph, functionRootId, forceArgs = [], patchData }) {
|
|
50
50
|
let finalEnv = functionName.environment;
|
|
51
51
|
// arg env contains the environments with other args defined
|
|
52
52
|
let argEnv = functionName.environment;
|
|
@@ -56,7 +56,7 @@ function processAllArguments({ functionName, args, data, finalGraph, functionRoo
|
|
|
56
56
|
let i = -1;
|
|
57
57
|
for (const arg of args) {
|
|
58
58
|
i++;
|
|
59
|
-
data = patchData(data, i);
|
|
59
|
+
data = patchData?.(data, i) ?? data;
|
|
60
60
|
if (arg === r_function_call_1.EmptyArgument) {
|
|
61
61
|
callArgs.push(r_function_call_1.EmptyArgument);
|
|
62
62
|
processedArguments.push(undefined);
|
|
@@ -70,7 +70,7 @@ function processAllArguments({ functionName, args, data, finalGraph, functionRoo
|
|
|
70
70
|
finalEnv = (0, overwrite_1.overwriteEnvironment)(finalEnv, processed.environment);
|
|
71
71
|
finalGraph.mergeWith(processed.graph);
|
|
72
72
|
// resolve reads within argument, we resolve before adding the `processed.environment` to avoid cyclic dependencies
|
|
73
|
-
for (const ingoing of
|
|
73
|
+
for (const ingoing of processed.in.concat(processed.unknownReferences)) {
|
|
74
74
|
// check if it is called directly
|
|
75
75
|
const vtx = finalGraph.getVertex(ingoing.nodeId);
|
|
76
76
|
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;
|
|
@@ -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,7 +49,7 @@ 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
|
});
|
|
@@ -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) {
|
|
@@ -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,
|
|
@@ -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
|
package/dataflow/processor.d.ts
CHANGED
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
import type { ControlDependency, DataflowInformation } from './info';
|
|
5
5
|
import type { NormalizedAst, ParentInformation, RNodeWithParent } from '../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
6
6
|
import type { IEnvironment, REnvironmentInformation } from './environments/environment';
|
|
7
|
-
import type { RParseRequest } from '../r-bridge/retriever';
|
|
8
7
|
import type { RNode } from '../r-bridge/lang-4.x/ast/model/model';
|
|
9
8
|
import type { KnownParserType, Parser } from '../r-bridge/parser';
|
|
10
|
-
import type {
|
|
9
|
+
import type { FlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
|
|
11
10
|
export interface DataflowProcessorInformation<OtherInfo> {
|
|
12
11
|
readonly parser: Parser<KnownParserType>;
|
|
13
12
|
/**
|
|
@@ -24,14 +23,10 @@ export interface DataflowProcessorInformation<OtherInfo> {
|
|
|
24
23
|
*/
|
|
25
24
|
readonly processors: DataflowProcessors<OtherInfo>;
|
|
26
25
|
/**
|
|
27
|
-
* The
|
|
26
|
+
* The chain of file paths that lead to this inclusion.
|
|
27
|
+
* The most recent (last) entry is expected to always be the current one.
|
|
28
28
|
*/
|
|
29
|
-
readonly
|
|
30
|
-
/**
|
|
31
|
-
* The chain of {@link RParseRequests} that lead to the {@link currentRequest}.
|
|
32
|
-
* The most recent (last) entry is expected to always be the {@link currentRequest}.
|
|
33
|
-
*/
|
|
34
|
-
readonly referenceChain: RParseRequest[];
|
|
29
|
+
readonly referenceChain: (string | undefined)[];
|
|
35
30
|
/**
|
|
36
31
|
* The chain of control-flow {@link NodeId}s that lead to the current node (e.g., of known ifs).
|
|
37
32
|
*/
|
|
@@ -41,9 +36,9 @@ export interface DataflowProcessorInformation<OtherInfo> {
|
|
|
41
36
|
*/
|
|
42
37
|
readonly builtInEnvironment: IEnvironment;
|
|
43
38
|
/**
|
|
44
|
-
* The flowr
|
|
39
|
+
* The flowr context used for environment seeding, files, and precision control, ...
|
|
45
40
|
*/
|
|
46
|
-
readonly
|
|
41
|
+
readonly ctx: FlowrAnalyzerContext;
|
|
47
42
|
}
|
|
48
43
|
export type DataflowProcessor<OtherInfo, NodeType extends RNodeWithParent<OtherInfo>> = (node: NodeType, data: DataflowProcessorInformation<OtherInfo>) => DataflowInformation;
|
|
49
44
|
type NodeWithKey<OtherInfo, Key> = RNode<OtherInfo & ParentInformation> & {
|