@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
|
@@ -57,7 +57,8 @@ exports.dataflowCommand = {
|
|
|
57
57
|
clipboard.default.writeSync(mermaid);
|
|
58
58
|
output.stdout(formatInfo(output, 'mermaid code', result));
|
|
59
59
|
}
|
|
60
|
-
catch { /* do nothing this is a service thing */
|
|
60
|
+
catch { /* do nothing this is a service thing */
|
|
61
|
+
}
|
|
61
62
|
}
|
|
62
63
|
};
|
|
63
64
|
exports.dataflowStarCommand = {
|
|
@@ -4,6 +4,7 @@ exports.parseCommand = void 0;
|
|
|
4
4
|
const format_1 = require("../../../r-bridge/lang-4.x/ast/parser/json/format");
|
|
5
5
|
const normalize_meta_1 = require("../../../r-bridge/lang-4.x/ast/parser/main/normalize-meta");
|
|
6
6
|
const retriever_1 = require("../../../r-bridge/retriever");
|
|
7
|
+
const flowr_file_1 = require("../../../project/context/flowr-file");
|
|
7
8
|
function toDepthMap(entry) {
|
|
8
9
|
const visit = [{ depth: 0, node: entry }];
|
|
9
10
|
const result = [];
|
|
@@ -138,15 +139,26 @@ exports.parseCommand = {
|
|
|
138
139
|
};
|
|
139
140
|
},
|
|
140
141
|
fn: async ({ output, analyzer }) => {
|
|
141
|
-
const result = await analyzer.parse();
|
|
142
|
+
const result = (await analyzer.parse()).files;
|
|
142
143
|
const parserInfo = analyzer.parserInformation();
|
|
143
144
|
if (parserInfo.name === 'r-shell') {
|
|
144
|
-
const
|
|
145
|
-
|
|
145
|
+
for (const { parsed, filePath } of result) {
|
|
146
|
+
if (filePath && filePath !== flowr_file_1.FlowrFile.INLINE_PATH) {
|
|
147
|
+
output.stdout(output.formatter.format(`File: ${filePath}\n`, { style: 4 /* FontStyles.Underline */ }));
|
|
148
|
+
}
|
|
149
|
+
const object = toDepthMap((0, format_1.convertPreparedParsedData)((0, format_1.prepareParsedData)(parsed)));
|
|
150
|
+
output.stdout(depthListToTextTree(object, output.formatter));
|
|
151
|
+
}
|
|
146
152
|
}
|
|
147
153
|
else {
|
|
148
154
|
// print the tree-sitter ast
|
|
149
|
-
|
|
155
|
+
for (const { parsed, filePath } of result) {
|
|
156
|
+
if (filePath && filePath !== flowr_file_1.FlowrFile.INLINE_PATH) {
|
|
157
|
+
output.stdout(output.formatter.format(`File: ${filePath}\n`, { style: 4 /* FontStyles.Underline */ }));
|
|
158
|
+
}
|
|
159
|
+
const object = treeSitterToDepthList(parsed.rootNode);
|
|
160
|
+
output.stdout(depthListToTextTree(object, output.formatter));
|
|
161
|
+
}
|
|
150
162
|
}
|
|
151
163
|
}
|
|
152
164
|
};
|
|
@@ -65,7 +65,7 @@ async function processQueryArgs(output, analyzer, remainingArgs) {
|
|
|
65
65
|
}
|
|
66
66
|
if (input) {
|
|
67
67
|
analyzer.reset();
|
|
68
|
-
analyzer.addRequest(
|
|
68
|
+
analyzer.addRequest(input);
|
|
69
69
|
}
|
|
70
70
|
return {
|
|
71
71
|
query: await (0, query_1.executeQueries)({
|
package/cli/repl/core.js
CHANGED
|
@@ -150,28 +150,30 @@ async function replProcessStatement(output, statement, analyzer, allowRSessionAc
|
|
|
150
150
|
const bold = (s) => output.formatter.format(s, { style: 1 /* FontStyles.Bold */ });
|
|
151
151
|
if (processor) {
|
|
152
152
|
try {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
153
|
+
await (0, query_1.genericWrapReplFailIfNoRequest)(async () => {
|
|
154
|
+
const remainingLine = statement.slice(command.length + 2).trim();
|
|
155
|
+
if (processor.isCodeCommand) {
|
|
156
|
+
const args = processor.argsParser(remainingLine);
|
|
157
|
+
if (args.rCode) {
|
|
158
|
+
analyzer.reset();
|
|
159
|
+
analyzer.addRequest(args.rCode);
|
|
160
|
+
}
|
|
161
|
+
await processor.fn({ output, analyzer, remainingArgs: args.remaining });
|
|
159
162
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
163
|
+
else {
|
|
164
|
+
await processor.fn({ output, analyzer, remainingLine, allowRSessionAccess });
|
|
165
|
+
}
|
|
166
|
+
}, output, analyzer);
|
|
165
167
|
}
|
|
166
168
|
catch (e) {
|
|
167
|
-
output.
|
|
169
|
+
output.stderr(`${bold(`Failed to execute command ${command}`)}: ${e?.message}. Using the ${bold('--verbose')} flag on startup may provide additional information.\n`);
|
|
168
170
|
if (log_1.log.settings.minLevel < 6 /* LogLevel.Fatal */) {
|
|
169
171
|
console.error(e);
|
|
170
172
|
}
|
|
171
173
|
}
|
|
172
174
|
}
|
|
173
175
|
else {
|
|
174
|
-
output.
|
|
176
|
+
output.stderr(`the command '${command}' is unknown, try ${bold(':help')} for more information\n`);
|
|
175
177
|
}
|
|
176
178
|
}
|
|
177
179
|
else {
|
|
@@ -206,6 +208,7 @@ async function repl({ analyzer, rl = readline.createInterface(makeDefaultReplRea
|
|
|
206
208
|
rl.on('history', h => fs_1.default.writeFileSync(historyFile, h.join('\n'), { encoding: 'utf-8' }));
|
|
207
209
|
}
|
|
208
210
|
// the incredible repl :D, we kill it with ':quit'
|
|
211
|
+
// noinspection InfiniteLoopJS
|
|
209
212
|
while (true) {
|
|
210
213
|
await new Promise((resolve, reject) => {
|
|
211
214
|
rl.question((0, prompt_1.prompt)(), answer => {
|
|
@@ -214,10 +214,11 @@ class FlowRServerConnection {
|
|
|
214
214
|
else {
|
|
215
215
|
throw new Error('Either content or filepath must be defined.');
|
|
216
216
|
}
|
|
217
|
-
const analyzer = await new flowr_analyzer_builder_1.FlowrAnalyzerBuilder(
|
|
217
|
+
const analyzer = await new flowr_analyzer_builder_1.FlowrAnalyzerBuilder()
|
|
218
218
|
.setConfig(this.config)
|
|
219
219
|
.setParser(this.parser)
|
|
220
220
|
.build();
|
|
221
|
+
analyzer.addRequest(request);
|
|
221
222
|
if (message.filetoken) {
|
|
222
223
|
this.logger.info(`Storing file token ${message.filetoken}`);
|
|
223
224
|
this.fileMap.set(message.filetoken, {
|
|
@@ -21,6 +21,7 @@ const time_1 = require("../../util/text/time");
|
|
|
21
21
|
const tar_1 = require("tar");
|
|
22
22
|
const ansi_1 = require("../../util/text/ansi");
|
|
23
23
|
const config_1 = require("../../config");
|
|
24
|
+
const flowr_analyzer_context_1 = require("../../project/context/flowr-analyzer-context");
|
|
24
25
|
function compressFolder(folder, target) {
|
|
25
26
|
return (0, tar_1.create)({
|
|
26
27
|
gzip: true,
|
|
@@ -62,7 +63,7 @@ async function getStatsForSingleFile(options, config) {
|
|
|
62
63
|
if (stats.outputs.size === 1) {
|
|
63
64
|
if (options['dump-json']) {
|
|
64
65
|
const [, output] = [...stats.outputs.entries()][0];
|
|
65
|
-
const cfg = (0, extract_cfg_1.extractCfg)(output.normalize, config, output.dataflow.graph);
|
|
66
|
+
const cfg = (0, extract_cfg_1.extractCfg)(output.normalize, (0, flowr_analyzer_context_1.contextFromInput)('', config), output.dataflow.graph);
|
|
66
67
|
statistics_file_1.statisticsFileProvider.append('output-json', 'parse', await (0, print_1.printStepResult)(_00_parse_1.PARSE_WITH_R_SHELL_STEP, output.parse, 2 /* StepOutputFormat.Json */));
|
|
67
68
|
statistics_file_1.statisticsFileProvider.append('output-json', 'normalize', await (0, print_1.printStepResult)(_10_normalize_1.NORMALIZE, output.normalize, 2 /* StepOutputFormat.Json */));
|
|
68
69
|
statistics_file_1.statisticsFileProvider.append('output-json', 'dataflow', await (0, print_1.printStepResult)(_20_dataflow_1.STATIC_DATAFLOW, output.dataflow, 2 /* StepOutputFormat.Json */));
|
package/cli/slicer-app.js
CHANGED
|
@@ -15,7 +15,6 @@ const print_1 = require("../benchmark/stats/print");
|
|
|
15
15
|
const magic_comments_1 = require("../reconstruct/auto-select/magic-comments");
|
|
16
16
|
const auto_select_defaults_1 = require("../reconstruct/auto-select/auto-select-defaults");
|
|
17
17
|
const config_1 = require("../config");
|
|
18
|
-
const adapter_1 = require("../util/formats/adapter");
|
|
19
18
|
const options = (0, script_1.processCommandLineArgs)('slicer', ['input', 'criterion'], {
|
|
20
19
|
subtitle: 'Slice R code based on a given slicing criterion',
|
|
21
20
|
examples: [
|
|
@@ -32,8 +31,8 @@ async function getSlice() {
|
|
|
32
31
|
(0, assert_1.guard)(options.criterion !== undefined, 'a slicing criterion must be given');
|
|
33
32
|
const config = (0, config_1.getConfig)();
|
|
34
33
|
await slicer.init(options['input-is-text']
|
|
35
|
-
?
|
|
36
|
-
:
|
|
34
|
+
? { request: 'text', content: options.input.replaceAll('\\n', '\n') }
|
|
35
|
+
: { request: 'file', content: options.input }, config, options['no-magic-comments'] ? auto_select_defaults_1.doNotAutoSelect : (0, magic_comments_1.makeMagicCommentHandler)(auto_select_defaults_1.doNotAutoSelect));
|
|
37
36
|
let mappedSlices = [];
|
|
38
37
|
let reconstruct = undefined;
|
|
39
38
|
const doSlicing = options.criterion.trim() !== '';
|
|
@@ -77,7 +76,7 @@ async function getSlice() {
|
|
|
77
76
|
if (doSlicing && options.diff) {
|
|
78
77
|
let originalCode = options.input;
|
|
79
78
|
if (!options['input-is-text']) {
|
|
80
|
-
const request =
|
|
79
|
+
const request = { request: 'file', content: options.input };
|
|
81
80
|
originalCode = request.request === 'text' ? request.content : fs_1.default.readFileSync(request.content).toString();
|
|
82
81
|
}
|
|
83
82
|
console.log((0, slice_diff_ansi_1.sliceDiffAnsi)(slice.result, normalize, new Set(mappedSlices.map(({ id }) => id)), originalCode));
|
package/cli/wiki.d.ts
ADDED
package/cli/wiki.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.makeAllWikis = makeAllWikis;
|
|
7
|
+
const doc_context_1 = require("../documentation/wiki-mk/doc-context");
|
|
8
|
+
const shell_1 = require("../r-bridge/shell");
|
|
9
|
+
const tree_sitter_executor_1 = require("../r-bridge/lang-4.x/tree-sitter/tree-sitter-executor");
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const log_1 = require("../../test/functionality/_helper/log");
|
|
12
|
+
const command_line_usage_1 = __importDefault(require("command-line-usage"));
|
|
13
|
+
const command_line_args_1 = __importDefault(require("command-line-args"));
|
|
14
|
+
const version_1 = require("../util/version");
|
|
15
|
+
const wiki_faq_1 = require("../documentation/wiki-faq");
|
|
16
|
+
const ansi_1 = require("../util/text/ansi");
|
|
17
|
+
const documentation_1 = require("../documentation");
|
|
18
|
+
const wiki_cfg_1 = require("../documentation/wiki-cfg");
|
|
19
|
+
const wiki_onboarding_1 = require("../documentation/wiki-onboarding");
|
|
20
|
+
const wiki_analyzer_1 = require("../documentation/wiki-analyzer");
|
|
21
|
+
const issue_linting_rule_1 = require("../documentation/issue-linting-rule");
|
|
22
|
+
const doc_readme_1 = require("../documentation/doc-readme");
|
|
23
|
+
const wiki_linter_1 = require("../documentation/wiki-linter");
|
|
24
|
+
const os_1 = __importDefault(require("os"));
|
|
25
|
+
const Documents = [
|
|
26
|
+
new wiki_faq_1.WikiFaq(),
|
|
27
|
+
new documentation_1.WikiSearch(),
|
|
28
|
+
new wiki_cfg_1.WikiCfg(),
|
|
29
|
+
new documentation_1.WikiQuery(),
|
|
30
|
+
new wiki_onboarding_1.WikiOnboarding(),
|
|
31
|
+
new wiki_analyzer_1.WikiAnalyzer(),
|
|
32
|
+
new documentation_1.WikiEngine(),
|
|
33
|
+
new documentation_1.WikiNormalizedAst(),
|
|
34
|
+
new documentation_1.WikiCore(),
|
|
35
|
+
new documentation_1.WikiInterface(),
|
|
36
|
+
new documentation_1.WikiDataflowGraph(),
|
|
37
|
+
new documentation_1.WikiLintingAndTesting(),
|
|
38
|
+
new wiki_linter_1.WikiLinter(),
|
|
39
|
+
new issue_linting_rule_1.IssueLintingRule(),
|
|
40
|
+
new doc_readme_1.DocReadme(),
|
|
41
|
+
new documentation_1.DocCapabilities()
|
|
42
|
+
];
|
|
43
|
+
function sortByLeastRecentChanged(wikis) {
|
|
44
|
+
return wikis.slice().sort((a, b) => {
|
|
45
|
+
const aStat = fs_1.default.existsSync(a.getProducer()) ? fs_1.default.statSync(a.getProducer()) : undefined;
|
|
46
|
+
const bStat = fs_1.default.existsSync(b.getProducer()) ? fs_1.default.statSync(b.getProducer()) : undefined;
|
|
47
|
+
const aMTime = aStat ? aStat.mtime.getTime() : 0;
|
|
48
|
+
const bMTime = bStat ? bStat.mtime.getTime() : 0;
|
|
49
|
+
return bMTime - aMTime;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Updates and optionally re-creates all flowR wikis.
|
|
54
|
+
*/
|
|
55
|
+
async function makeAllWikis(force, filter) {
|
|
56
|
+
const setupStart = new Date();
|
|
57
|
+
console.log('Setting up wiki generation...');
|
|
58
|
+
const shell = new shell_1.RShell();
|
|
59
|
+
console.log(' * R shell initialized');
|
|
60
|
+
await tree_sitter_executor_1.TreeSitterExecutor.initTreeSitter();
|
|
61
|
+
const treeSitter = new tree_sitter_executor_1.TreeSitterExecutor();
|
|
62
|
+
console.log(' * Tree-sitter parser initialized');
|
|
63
|
+
const ctx = (0, doc_context_1.makeDocContextForTypes)(shell);
|
|
64
|
+
console.log(' * Wiki context prepared');
|
|
65
|
+
if (force) {
|
|
66
|
+
console.log(ansi_1.ansiFormatter.format('Forcing wiki regeneration (existing files will be overwritten)', { style: 1 /* FontStyles.Bold */, color: 3 /* Colors.Yellow */, effect: ansi_1.ColorEffect.Foreground }));
|
|
67
|
+
}
|
|
68
|
+
const info = {
|
|
69
|
+
ctx,
|
|
70
|
+
shell, treeSitter,
|
|
71
|
+
force,
|
|
72
|
+
readFileSync(f) {
|
|
73
|
+
try {
|
|
74
|
+
return fs_1.default.readFileSync(f);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
writeFileSync: fs_1.default.writeFileSync
|
|
81
|
+
};
|
|
82
|
+
console.log(`Setup for wiki generation took ${(new Date().getTime() - setupStart.getTime())}ms`);
|
|
83
|
+
const changedWikis = new Set();
|
|
84
|
+
try {
|
|
85
|
+
const sortedDocs = sortByLeastRecentChanged(Documents);
|
|
86
|
+
console.log(`Generating ${sortedDocs.length} wikis/docs, sorted by most recently updated...`);
|
|
87
|
+
for (const doc of sortedDocs) {
|
|
88
|
+
const type = doc.getTarget().toLowerCase().includes('wiki') ? 'Wiki' : 'Doc';
|
|
89
|
+
if (filter && !filter.some(f => doc.getTarget().includes(f))) {
|
|
90
|
+
console.log(` * Skipping ${type} (filtered out): ${doc.getTarget()}`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const now = new Date();
|
|
94
|
+
console.log(ansi_1.ansiFormatter.format(` [${doc.getTarget()}] Updating ${type}...`, { style: 1 /* FontStyles.Bold */, color: 6 /* Colors.Cyan */, effect: ansi_1.ColorEffect.Foreground }));
|
|
95
|
+
const changed = await doc.make(info);
|
|
96
|
+
const text = changed ? `${type} updated` : `${type} identical, no changes made`;
|
|
97
|
+
if (changed) {
|
|
98
|
+
changedWikis.add(doc.getTarget());
|
|
99
|
+
}
|
|
100
|
+
const color = changed ? 2 /* Colors.Green */ : 7 /* Colors.White */;
|
|
101
|
+
console.log(ansi_1.ansiFormatter.format(` [${doc.getTarget()}] ${text}: ${doc.getTarget()} (took ${new Date().getTime() - now.getTime()}ms)`, { color, effect: ansi_1.ColorEffect.Foreground }));
|
|
102
|
+
for (const out of doc.getWrittenSubfiles()) {
|
|
103
|
+
changedWikis.add(out);
|
|
104
|
+
console.log(` - Also updated: ${out}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error('Error while generating documents:', error);
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
shell.close();
|
|
113
|
+
}
|
|
114
|
+
console.log('All wikis processed in ' + (new Date().getTime() - setupStart.getTime()) + 'ms');
|
|
115
|
+
console.log(` * Changed ${changedWikis.size} wiki/doc files.`);
|
|
116
|
+
// write a temp file in the os temp dir with the changed wikis
|
|
117
|
+
const filename = `${os_1.default.tmpdir()}/flowr-wiki-changed-files.txt`;
|
|
118
|
+
fs_1.default.writeFileSync(`${filename}`, Array.from(changedWikis).join('\n'));
|
|
119
|
+
console.log(` * List of changed wikis/docs written to ${filename}`);
|
|
120
|
+
}
|
|
121
|
+
if (require.main === module) {
|
|
122
|
+
const wikiOptions = [
|
|
123
|
+
{ name: 'force', alias: 'F', type: Boolean, description: 'Overwrite existing wiki files, even if nothing changes' },
|
|
124
|
+
{ name: 'filter', alias: 'f', type: String, multiple: true, description: 'Only generate wikis whose target path contains the given string' },
|
|
125
|
+
{ name: 'help', alias: 'h', type: Boolean, description: 'Print this usage guide for the wiki generator' },
|
|
126
|
+
{ name: 'keep-alive', type: Boolean, description: 'Keep-alive wiki generator (only sensible with a reloading script like ts-node-dev)' },
|
|
127
|
+
];
|
|
128
|
+
const optionHelp = [
|
|
129
|
+
{
|
|
130
|
+
header: `flowR (version ${(0, version_1.flowrVersion)().toString()})`,
|
|
131
|
+
content: 'Documentation (wiki, issue, ...) generator for flowR'
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
header: 'Synopsis',
|
|
135
|
+
content: [
|
|
136
|
+
'$ wiki {bold --help}',
|
|
137
|
+
'$ wiki {bold --force}',
|
|
138
|
+
'$ wiki {bold --filter} {italic "dataflow"}'
|
|
139
|
+
]
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
header: 'Options',
|
|
143
|
+
optionList: wikiOptions
|
|
144
|
+
}
|
|
145
|
+
];
|
|
146
|
+
(0, log_1.setMinLevelOfAllLogs)(6 /* LogLevel.Fatal */);
|
|
147
|
+
// parse args
|
|
148
|
+
const options = (0, command_line_args_1.default)(wikiOptions);
|
|
149
|
+
if (options.help) {
|
|
150
|
+
console.log((0, command_line_usage_1.default)(optionHelp));
|
|
151
|
+
process.exit(0);
|
|
152
|
+
}
|
|
153
|
+
void makeAllWikis(options.force, options.filter).catch(err => {
|
|
154
|
+
console.error('Error while generating wikis:', err);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}).then(() => {
|
|
157
|
+
if (options['keep-alive']) {
|
|
158
|
+
console.log('Wiki generator running in keep-alive mode...');
|
|
159
|
+
setInterval(() => {
|
|
160
|
+
// do nothing, just keep alive
|
|
161
|
+
}, 100);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=wiki.js.map
|
package/config.d.ts
CHANGED
|
@@ -98,6 +98,10 @@ export interface FlowrConfigOptions extends MergeableRecord {
|
|
|
98
98
|
};
|
|
99
99
|
};
|
|
100
100
|
};
|
|
101
|
+
readonly project: {
|
|
102
|
+
/** Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files */
|
|
103
|
+
resolveUnknownPathsOnDisk: boolean;
|
|
104
|
+
};
|
|
101
105
|
/**
|
|
102
106
|
* The engines to use for interacting with R code. Currently, supports {@link TreeSitterEngineConfig} and {@link RShellEngineConfig}.
|
|
103
107
|
* An empty array means all available engines will be used.
|
package/config.js
CHANGED
|
@@ -65,6 +65,9 @@ exports.defaultConfigOptions = {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
|
+
project: {
|
|
69
|
+
resolveUnknownPathsOnDisk: true
|
|
70
|
+
},
|
|
68
71
|
engines: [],
|
|
69
72
|
defaultEngine: 'tree-sitter',
|
|
70
73
|
solver: {
|
|
@@ -103,6 +106,9 @@ exports.flowrConfigFileSchema = joi_1.default.object({
|
|
|
103
106
|
}).optional().description('Do you want to overwrite (parts) of the builtin definition?')
|
|
104
107
|
}).optional().description('Semantics regarding how to handle the R environment.')
|
|
105
108
|
}).description('Configure language semantics and how flowR handles them.'),
|
|
109
|
+
project: joi_1.default.object({
|
|
110
|
+
resolveUnknownPathsOnDisk: joi_1.default.boolean().optional().description('Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files.')
|
|
111
|
+
}).description('Project specific configuration options.'),
|
|
106
112
|
engines: joi_1.default.array().items(joi_1.default.alternatives(joi_1.default.object({
|
|
107
113
|
type: joi_1.default.string().required().valid('tree-sitter').description('Use the tree sitter engine.'),
|
|
108
114
|
wasmPath: joi_1.default.string().optional().description('The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.'),
|
|
@@ -54,7 +54,12 @@ class CfgConditionalDeadCodeRemoval extends semantic_cfg_guided_visitor_1.Semant
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
handleValuesFor(id, valueId) {
|
|
57
|
-
const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(valueId, {
|
|
57
|
+
const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(valueId, {
|
|
58
|
+
graph: this.config.dfg,
|
|
59
|
+
full: true,
|
|
60
|
+
idMap: this.config.normalizedAst.idMap,
|
|
61
|
+
resolve: this.config.ctx.config.solver.variables
|
|
62
|
+
}));
|
|
58
63
|
if (values === undefined || values.elements.length !== 1 || values.elements[0].type != 'logical' || !(0, r_value_1.isValue)(values.elements[0].value)) {
|
|
59
64
|
this.unableToCalculateValue(id);
|
|
60
65
|
return;
|
|
@@ -74,7 +79,12 @@ class CfgConditionalDeadCodeRemoval extends semantic_cfg_guided_visitor_1.Semant
|
|
|
74
79
|
if (data.call.args.length !== 1 || data.call.args[0] === r_function_call_1.EmptyArgument) {
|
|
75
80
|
return undefined;
|
|
76
81
|
}
|
|
77
|
-
const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(data.call.args[0].nodeId, {
|
|
82
|
+
const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(data.call.args[0].nodeId, {
|
|
83
|
+
graph: this.config.dfg,
|
|
84
|
+
full: true,
|
|
85
|
+
idMap: this.config.normalizedAst.idMap,
|
|
86
|
+
resolve: this.config.ctx.config.solver.variables
|
|
87
|
+
}));
|
|
78
88
|
if (values === undefined || values.elements.length !== 1 || values.elements[0].type != 'logical' || !(0, r_value_1.isValue)(values.elements[0].value)) {
|
|
79
89
|
return undefined;
|
|
80
90
|
}
|
|
@@ -115,7 +125,7 @@ function cfgAnalyzeDeadCode(cfg, info) {
|
|
|
115
125
|
controlFlow: cfg,
|
|
116
126
|
normalizedAst: info.ast,
|
|
117
127
|
dfg: info.dfg,
|
|
118
|
-
|
|
128
|
+
ctx: info.ctx,
|
|
119
129
|
defaultVisitingOrder: 'forward',
|
|
120
130
|
});
|
|
121
131
|
visitor.start();
|
|
@@ -3,13 +3,16 @@ import type { NormalizedAst } from '../r-bridge/lang-4.x/ast/model/processing/de
|
|
|
3
3
|
import type { DataflowGraph } from '../dataflow/graph/graph';
|
|
4
4
|
import type { NodeId } from '../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
5
5
|
import { cfgAnalyzeDeadCode } from './cfg-dead-code';
|
|
6
|
-
import type {
|
|
6
|
+
import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
|
|
7
7
|
export interface CfgPassInfo {
|
|
8
8
|
ast?: NormalizedAst;
|
|
9
9
|
dfg?: DataflowGraph;
|
|
10
|
-
|
|
10
|
+
ctx: ReadOnlyFlowrAnalyzerContext;
|
|
11
11
|
}
|
|
12
12
|
export type CfgSimplificationPass = (cfg: ControlFlowInformation, info: CfgPassInfo) => ControlFlowInformation;
|
|
13
|
+
/**
|
|
14
|
+
* All available control flow graph simplification passes.
|
|
15
|
+
*/
|
|
13
16
|
export declare const CfgSimplificationPasses: {
|
|
14
17
|
readonly 'unique-cf-sets': typeof uniqueControlFlowSets;
|
|
15
18
|
readonly 'analyze-dead-code': typeof cfgAnalyzeDeadCode;
|
|
@@ -6,6 +6,9 @@ exports.cfgFindAllReachable = cfgFindAllReachable;
|
|
|
6
6
|
const cfg_to_basic_blocks_1 = require("./cfg-to-basic-blocks");
|
|
7
7
|
const simple_visitor_1 = require("./simple-visitor");
|
|
8
8
|
const cfg_dead_code_1 = require("./cfg-dead-code");
|
|
9
|
+
/**
|
|
10
|
+
* All available control flow graph simplification passes.
|
|
11
|
+
*/
|
|
9
12
|
exports.CfgSimplificationPasses = {
|
|
10
13
|
'unique-cf-sets': uniqueControlFlowSets,
|
|
11
14
|
'analyze-dead-code': cfg_dead_code_1.cfgAnalyzeDeadCode,
|
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
import { type QuadSerializationConfiguration } from '../util/quads';
|
|
2
|
+
import type { NodeId } from '../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
2
3
|
import type { NormalizedAst, ParentInformation } from '../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
3
4
|
import type { DataflowGraph } from '../dataflow/graph/graph';
|
|
5
|
+
import type { DataflowGraphVertexFunctionCall } from '../dataflow/graph/vertex';
|
|
4
6
|
import { type ControlFlowInformation } from './control-flow-graph';
|
|
5
7
|
import { type CfgSimplificationPassName } from './cfg-simplification';
|
|
6
|
-
import type {
|
|
8
|
+
import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
|
|
7
9
|
/**
|
|
8
10
|
* Given a normalized AST, this approximates the control flow graph of the program.
|
|
9
11
|
* This view is different from the computation of the dataflow graph and may differ,
|
|
10
12
|
* especially because it focuses on intra-procedural analysis.
|
|
11
13
|
* @param ast - the normalized AST
|
|
12
|
-
* @param
|
|
14
|
+
* @param ctx - the flowR context
|
|
13
15
|
* @param graph - additional dataflow facts to consider by the control flow extraction
|
|
14
16
|
* @param simplifications - a list of simplification passes to apply to the control flow graph
|
|
15
17
|
* @see {@link extractCfgQuick} - for a simplified version of this function
|
|
16
18
|
*/
|
|
17
|
-
export declare function extractCfg<Info = ParentInformation>(ast: NormalizedAst<Info & ParentInformation>,
|
|
19
|
+
export declare function extractCfg<Info = ParentInformation>(ast: NormalizedAst<Info & ParentInformation>, ctx: ReadOnlyFlowrAnalyzerContext, graph?: DataflowGraph, simplifications?: readonly CfgSimplificationPassName[]): ControlFlowInformation;
|
|
18
20
|
/**
|
|
19
21
|
* A version of {@link extractCfg} that is much quicker and does not apply any simplifications or dataflow information.
|
|
20
22
|
*/
|
|
21
23
|
export declare function extractCfgQuick<Info = ParentInformation>(ast: NormalizedAst<Info>): ControlFlowInformation<import("./control-flow-graph").CfgSimpleVertex>;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts all function call vertices from the given control flow information and dataflow graph.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getCallsInCfg(cfg: ControlFlowInformation, graph: DataflowGraph): Map<NodeId, Required<DataflowGraphVertexFunctionCall>>;
|
|
22
28
|
export declare const ResolvedCallSuffix = "-resolved-call-exit";
|
|
23
29
|
/**
|
|
24
30
|
* Convert a cfg to RDF quads.
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ResolvedCallSuffix = void 0;
|
|
4
4
|
exports.extractCfg = extractCfg;
|
|
5
5
|
exports.extractCfgQuick = extractCfgQuick;
|
|
6
|
+
exports.getCallsInCfg = getCallsInCfg;
|
|
6
7
|
exports.cfg2quads = cfg2quads;
|
|
7
8
|
const quads_1 = require("../util/quads");
|
|
8
9
|
const fold_1 = require("../r-bridge/lang-4.x/ast/model/processing/fold");
|
|
@@ -56,19 +57,58 @@ function dataflowCfgFolds(dataflowGraph) {
|
|
|
56
57
|
* This view is different from the computation of the dataflow graph and may differ,
|
|
57
58
|
* especially because it focuses on intra-procedural analysis.
|
|
58
59
|
* @param ast - the normalized AST
|
|
59
|
-
* @param
|
|
60
|
+
* @param ctx - the flowR context
|
|
60
61
|
* @param graph - additional dataflow facts to consider by the control flow extraction
|
|
61
62
|
* @param simplifications - a list of simplification passes to apply to the control flow graph
|
|
62
63
|
* @see {@link extractCfgQuick} - for a simplified version of this function
|
|
63
64
|
*/
|
|
64
|
-
function extractCfg(ast,
|
|
65
|
-
return (0, cfg_simplification_1.simplifyControlFlowInformation)((
|
|
65
|
+
function extractCfg(ast, ctx, graph, simplifications) {
|
|
66
|
+
return (0, cfg_simplification_1.simplifyControlFlowInformation)(cfgFoldProject(ast.ast, graph ? dataflowCfgFolds(graph) : cfgFolds), { ast, dfg: graph, ctx }, simplifications);
|
|
66
67
|
}
|
|
67
68
|
/**
|
|
68
69
|
* A version of {@link extractCfg} that is much quicker and does not apply any simplifications or dataflow information.
|
|
69
70
|
*/
|
|
70
71
|
function extractCfgQuick(ast) {
|
|
71
|
-
return (
|
|
72
|
+
return cfgFoldProject(ast.ast, cfgFolds);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extracts all function call vertices from the given control flow information and dataflow graph.
|
|
76
|
+
*/
|
|
77
|
+
function getCallsInCfg(cfg, graph) {
|
|
78
|
+
const calls = new Map();
|
|
79
|
+
for (const vertexId of cfg.graph.vertices().keys()) {
|
|
80
|
+
const vertex = graph.getVertex(vertexId, true);
|
|
81
|
+
if ((0, vertex_1.isFunctionCallVertex)(vertex)) {
|
|
82
|
+
calls.set(vertexId, vertex);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return calls;
|
|
86
|
+
}
|
|
87
|
+
function cfgFoldProject(proj, folds) {
|
|
88
|
+
if (proj.files.length === 0) {
|
|
89
|
+
return (0, control_flow_graph_1.emptyControlFlowInformation)();
|
|
90
|
+
}
|
|
91
|
+
else if (proj.files.length === 1) {
|
|
92
|
+
return (0, fold_1.foldAst)(proj.files[0].root, folds);
|
|
93
|
+
}
|
|
94
|
+
const perProject = proj.files.map(file => (0, fold_1.foldAst)(file.root, folds));
|
|
95
|
+
const finalGraph = perProject[0].graph;
|
|
96
|
+
for (let i = 1; i < perProject.length; i++) {
|
|
97
|
+
finalGraph.mergeWith(perProject[i].graph);
|
|
98
|
+
for (const exitPoint of perProject[i - 1].exitPoints) {
|
|
99
|
+
for (const entryPoint of perProject[i].entryPoints) {
|
|
100
|
+
finalGraph.addEdge(entryPoint, exitPoint, { label: 0 /* CfgEdgeType.Fd */ });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
breaks: perProject.flatMap(e => e.breaks),
|
|
106
|
+
nexts: perProject.flatMap(e => e.nexts),
|
|
107
|
+
returns: perProject.flatMap(e => e.returns),
|
|
108
|
+
exitPoints: perProject[perProject.length - 1].exitPoints,
|
|
109
|
+
entryPoints: perProject[0].entryPoints,
|
|
110
|
+
graph: finalGraph
|
|
111
|
+
};
|
|
72
112
|
}
|
|
73
113
|
function cfgLeaf(type) {
|
|
74
114
|
return ({ info: { id } }) => {
|
|
@@ -13,9 +13,9 @@ import type { NoInfo, RNode } from '../r-bridge/lang-4.x/ast/model/model';
|
|
|
13
13
|
import type { RSymbol } from '../r-bridge/lang-4.x/ast/model/nodes/r-symbol';
|
|
14
14
|
import type { BuiltInProcessorMapper } from '../dataflow/environments/built-in';
|
|
15
15
|
import type { RExpressionList } from '../r-bridge/lang-4.x/ast/model/nodes/r-expression-list';
|
|
16
|
-
import type {
|
|
16
|
+
import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
|
|
17
17
|
export interface SemanticCfgGuidedVisitorConfiguration<OtherInfo = NoInfo, ControlFlow extends ControlFlowInformation = ControlFlowInformation, Ast extends NormalizedAst<OtherInfo> = NormalizedAst<OtherInfo>, Dfg extends DataflowGraph = DataflowGraph> extends DataflowCfgGuidedVisitorConfiguration<ControlFlow, Dfg>, SyntaxCfgGuidedVisitorConfiguration<OtherInfo, ControlFlow, Ast> {
|
|
18
|
-
readonly
|
|
18
|
+
readonly ctx: ReadOnlyFlowrAnalyzerContext;
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* This visitor extends on the {@link DataflowAwareCfgGuidedVisitor} by dispatching visitors for separate function calls as well,
|
|
@@ -17,7 +17,7 @@ function visitCfgInReverseOrder(graph, startNodes,
|
|
|
17
17
|
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- void is used to indicate that the return value is ignored/we never stop
|
|
18
18
|
visitor) {
|
|
19
19
|
const visited = new Set();
|
|
20
|
-
let queue =
|
|
20
|
+
let queue = startNodes.slice();
|
|
21
21
|
const hasBb = graph.mayHaveBasicBlocks();
|
|
22
22
|
while (queue.length > 0) {
|
|
23
23
|
const current = queue.pop();
|
|
@@ -36,7 +36,7 @@ visitor) {
|
|
|
36
36
|
}
|
|
37
37
|
const incoming = graph.outgoingEdges(current);
|
|
38
38
|
if (incoming) {
|
|
39
|
-
queue.
|
|
39
|
+
queue = queue.concat(incoming.keys().toArray());
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { FlowrConfigOptions } from '../config';
|
|
2
1
|
import type { DataflowGraph } from '../dataflow/graph/graph';
|
|
3
2
|
import type { NormalizedAst } from '../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
4
3
|
import type { NodeId } from '../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
5
4
|
import type { ControlFlowInformation } from './control-flow-graph';
|
|
5
|
+
import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
|
|
6
6
|
export declare const loopyFunctions: Set<"builtin:default" | "builtin:eval" | "builtin:apply" | "builtin:expression-list" | "builtin:source" | "builtin:access" | "builtin:if-then-else" | "builtin:get" | "builtin:rm" | "builtin:library" | "builtin:assignment" | "builtin:special-bin-op" | "builtin:pipe" | "builtin:function-definition" | "builtin:quote" | "builtin:for-loop" | "builtin:repeat-loop" | "builtin:while-loop" | "builtin:replacement" | "builtin:list" | "builtin:vector">;
|
|
7
7
|
/**
|
|
8
8
|
* Checks whether a loop only loops once
|
|
@@ -10,7 +10,7 @@ export declare const loopyFunctions: Set<"builtin:default" | "builtin:eval" | "b
|
|
|
10
10
|
* @param dataflow - dataflow graph
|
|
11
11
|
* @param controlflow - control flow graph
|
|
12
12
|
* @param ast - normalized ast
|
|
13
|
-
* @param
|
|
13
|
+
* @param ctx - current flowr analyzer context
|
|
14
14
|
* @returns true if the given loop only iterates once
|
|
15
15
|
*/
|
|
16
|
-
export declare function onlyLoopsOnce(loop: NodeId, dataflow: DataflowGraph, controlflow: ControlFlowInformation, ast: NormalizedAst,
|
|
16
|
+
export declare function onlyLoopsOnce(loop: NodeId, dataflow: DataflowGraph, controlflow: ControlFlowInformation, ast: NormalizedAst, ctx: ReadOnlyFlowrAnalyzerContext): boolean | undefined;
|