@eagleoutice/flowr 2.6.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -34
- package/abstract-interpretation/data-frame/absint-visitor.d.ts +1 -1
- package/abstract-interpretation/data-frame/absint-visitor.js +6 -6
- package/abstract-interpretation/data-frame/dataframe-domain.d.ts +4 -7
- package/abstract-interpretation/data-frame/dataframe-domain.js +5 -11
- package/abstract-interpretation/data-frame/mappers/access-mapper.d.ts +3 -1
- package/abstract-interpretation/data-frame/mappers/access-mapper.js +3 -2
- package/abstract-interpretation/data-frame/mappers/arguments.js +2 -2
- package/abstract-interpretation/data-frame/mappers/assignment-mapper.d.ts +3 -1
- package/abstract-interpretation/data-frame/mappers/assignment-mapper.js +3 -2
- package/abstract-interpretation/data-frame/mappers/function-mapper.d.ts +7 -7
- package/abstract-interpretation/data-frame/mappers/function-mapper.js +28 -24
- package/abstract-interpretation/data-frame/mappers/replacement-mapper.d.ts +3 -1
- package/abstract-interpretation/data-frame/mappers/replacement-mapper.js +3 -2
- package/abstract-interpretation/data-frame/semantics.js +54 -41
- package/abstract-interpretation/data-frame/shape-inference.d.ts +3 -3
- package/abstract-interpretation/data-frame/shape-inference.js +3 -3
- package/abstract-interpretation/domains/abstract-domain.d.ts +1 -0
- package/abstract-interpretation/domains/abstract-domain.js +3 -2
- package/abstract-interpretation/domains/bounded-set-domain.js +1 -1
- package/abstract-interpretation/domains/interval-domain.d.ts +2 -2
- package/abstract-interpretation/domains/interval-domain.js +3 -6
- package/abstract-interpretation/domains/lattice.d.ts +2 -0
- package/abstract-interpretation/domains/lattice.js +3 -1
- package/abstract-interpretation/domains/positive-interval-domain.d.ts +1 -1
- package/abstract-interpretation/domains/positive-interval-domain.js +1 -1
- package/abstract-interpretation/domains/satisfiable-domain.d.ts +2 -2
- package/abstract-interpretation/domains/satisfiable-domain.js +2 -2
- package/abstract-interpretation/domains/set-range-domain.d.ts +98 -0
- package/abstract-interpretation/domains/set-range-domain.js +400 -0
- package/abstract-interpretation/domains/set-upper-bound-domain.js +2 -2
- package/abstract-interpretation/domains/singleton-domain.js +2 -2
- package/abstract-interpretation/normalized-ast-fold.d.ts +1 -1
- package/benchmark/slicer.d.ts +3 -1
- package/benchmark/slicer.js +50 -27
- package/benchmark/stats/print.js +8 -5
- package/benchmark/stats/stats.d.ts +3 -2
- package/benchmark/summarizer/data.d.ts +11 -8
- package/benchmark/summarizer/first-phase/process.js +12 -9
- package/benchmark/summarizer/second-phase/graph.d.ts +3 -1
- package/benchmark/summarizer/second-phase/graph.js +3 -1
- package/benchmark/summarizer/second-phase/process.js +24 -18
- package/cli/export-quads-app.js +1 -1
- package/cli/repl/commands/repl-dataflow.js +2 -1
- package/cli/repl/commands/repl-parse.js +16 -4
- package/cli/repl/commands/repl-query.js +1 -1
- package/cli/repl/core.js +16 -13
- package/cli/repl/server/connection.js +2 -1
- package/cli/script-core/statistics-helper-core.js +2 -1
- package/cli/slicer-app.js +3 -4
- package/cli/wiki.d.ts +4 -0
- package/cli/wiki.js +165 -0
- package/config.d.ts +4 -0
- package/config.js +6 -0
- package/control-flow/cfg-dead-code.js +14 -3
- package/control-flow/cfg-simplification.d.ts +5 -2
- package/control-flow/cfg-simplification.js +3 -0
- package/control-flow/extract-cfg.d.ts +9 -3
- package/control-flow/extract-cfg.js +44 -4
- package/control-flow/semantic-cfg-guided-visitor.d.ts +2 -2
- package/control-flow/simple-visitor.js +2 -2
- package/control-flow/useless-loop.d.ts +3 -3
- package/control-flow/useless-loop.js +16 -5
- package/core/pipeline-executor.d.ts +3 -6
- package/core/pipeline-executor.js +4 -7
- package/core/print/normalize-printer.d.ts +1 -1
- package/core/print/normalize-printer.js +2 -2
- package/core/steps/all/core/00-parse.d.ts +1 -1
- package/core/steps/all/core/00-parse.js +1 -1
- package/core/steps/all/core/10-normalize.d.ts +3 -9
- package/core/steps/all/core/10-normalize.js +1 -16
- package/core/steps/all/core/11-normalize-tree-sitter.d.ts +2 -3
- package/core/steps/all/core/11-normalize-tree-sitter.js +2 -3
- package/core/steps/all/core/20-dataflow.d.ts +3 -4
- package/core/steps/all/core/20-dataflow.js +2 -2
- package/core/steps/all/static-slicing/00-slice.d.ts +4 -2
- package/core/steps/all/static-slicing/00-slice.js +3 -2
- package/core/steps/all/static-slicing/10-reconstruct.d.ts +8 -0
- package/core/steps/all/static-slicing/10-reconstruct.js +4 -1
- package/core/steps/pipeline/default-pipelines.d.ts +94 -95
- package/core/steps/pipeline/default-pipelines.js +8 -8
- package/dataflow/cluster.js +2 -2
- package/dataflow/environments/append.d.ts +5 -0
- package/dataflow/environments/append.js +6 -20
- package/dataflow/environments/built-in.d.ts +2 -1
- package/dataflow/environments/clone.d.ts +1 -2
- package/dataflow/environments/clone.js +3 -17
- package/dataflow/environments/define.d.ts +7 -3
- package/dataflow/environments/define.js +9 -56
- package/dataflow/environments/diff.js +3 -3
- package/dataflow/environments/environment.d.ts +48 -28
- package/dataflow/environments/environment.js +187 -62
- package/dataflow/environments/overwrite.d.ts +1 -5
- package/dataflow/environments/overwrite.js +2 -61
- package/dataflow/environments/reference-to-maybe.d.ts +13 -0
- package/dataflow/environments/reference-to-maybe.js +54 -0
- package/dataflow/environments/resolve-by-name.d.ts +6 -1
- package/dataflow/environments/resolve-by-name.js +56 -4
- package/dataflow/environments/scoping.d.ts +8 -4
- package/dataflow/environments/scoping.js +13 -9
- package/dataflow/eval/resolve/alias-tracking.d.ts +10 -4
- package/dataflow/eval/resolve/alias-tracking.js +15 -13
- package/dataflow/eval/resolve/resolve-argument.d.ts +2 -1
- package/dataflow/eval/resolve/resolve-argument.js +10 -10
- package/dataflow/eval/resolve/resolve.d.ts +13 -11
- package/dataflow/eval/resolve/resolve.js +16 -15
- package/dataflow/eval/values/string/string-constants.d.ts +9 -3
- package/dataflow/eval/values/string/string-constants.js +9 -3
- package/dataflow/extractor.d.ts +2 -3
- package/dataflow/extractor.js +25 -28
- package/dataflow/fn/higher-order-function.d.ts +2 -1
- package/dataflow/fn/higher-order-function.js +4 -4
- package/dataflow/graph/dataflowgraph-builder.d.ts +9 -5
- package/dataflow/graph/dataflowgraph-builder.js +21 -11
- package/dataflow/graph/diff-dataflow-graph.js +2 -2
- package/dataflow/graph/graph.d.ts +13 -11
- package/dataflow/graph/graph.js +40 -24
- package/dataflow/graph/invert-dfg.d.ts +3 -2
- package/dataflow/graph/invert-dfg.js +3 -3
- package/dataflow/graph/resolve-graph.d.ts +2 -1
- package/dataflow/graph/resolve-graph.js +2 -2
- package/dataflow/graph/unknown-replacement.d.ts +4 -2
- package/dataflow/graph/unknown-replacement.js +4 -2
- package/dataflow/graph/vertex.d.ts +3 -3
- package/dataflow/graph/vertex.js +3 -3
- package/dataflow/info.d.ts +8 -1
- package/dataflow/info.js +21 -0
- package/dataflow/internal/linker.js +10 -11
- package/dataflow/internal/process/functions/call/argument/make-argument.d.ts +2 -2
- package/dataflow/internal/process/functions/call/argument/make-argument.js +2 -3
- package/dataflow/internal/process/functions/call/argument/unpack-argument.d.ts +7 -1
- package/dataflow/internal/process/functions/call/argument/unpack-argument.js +12 -3
- package/dataflow/internal/process/functions/call/built-in/built-in-access.d.ts +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-access.js +7 -7
- package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.d.ts +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +6 -6
- package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +14 -14
- package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +10 -8
- package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +4 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.d.ts +2 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +10 -14
- package/dataflow/internal/process/functions/call/built-in/built-in-get.d.ts +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-get.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.d.ts +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +8 -6
- package/dataflow/internal/process/functions/call/built-in/built-in-library.js +1 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-list.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +4 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.d.ts +6 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +7 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +5 -5
- package/dataflow/internal/process/functions/call/built-in/built-in-rm.js +6 -4
- package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +15 -10
- package/dataflow/internal/process/functions/call/built-in/built-in-source.js +78 -75
- package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.d.ts +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.js +3 -1
- package/dataflow/internal/process/functions/call/built-in/built-in-vector.js +2 -2
- package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +5 -5
- package/dataflow/internal/process/functions/call/common.d.ts +1 -1
- package/dataflow/internal/process/functions/call/common.js +6 -7
- package/dataflow/internal/process/functions/call/default-call-handling.d.ts +3 -1
- package/dataflow/internal/process/functions/call/default-call-handling.js +3 -1
- package/dataflow/internal/process/functions/call/known-call-handling.js +4 -4
- package/dataflow/internal/process/functions/call/named-call-handling.js +4 -4
- package/dataflow/internal/process/functions/call/unnamed-call-handling.js +1 -1
- package/dataflow/internal/process/functions/process-argument.js +1 -1
- package/dataflow/internal/process/functions/process-parameter.js +4 -4
- package/dataflow/internal/process/process-symbol.js +1 -1
- package/dataflow/internal/process/process-value.d.ts +1 -1
- package/dataflow/internal/process/process-value.js +7 -7
- package/dataflow/origin/dfg-get-symbol-refs.d.ts +1 -1
- package/dataflow/origin/dfg-get-symbol-refs.js +1 -1
- package/dataflow/processor.d.ts +7 -16
- package/documentation/data/dfg/doc-data-dfg-util.d.ts +0 -2
- package/documentation/data/faq/faqs.js +27 -18
- package/documentation/data/faq/recommended-configs.d.ts +36 -0
- package/documentation/data/faq/recommended-configs.js +40 -0
- package/documentation/data/faq/wiki-faq-store.d.ts +1 -0
- package/documentation/data/faq/wiki-faq-store.js +10 -2
- package/documentation/data/server/doc-data-server-messages.js +1 -1
- package/documentation/doc-capabilities.d.ts +9 -0
- package/documentation/{print-capabilities-markdown.js → doc-capabilities.js} +18 -21
- package/documentation/doc-readme.d.ts +9 -0
- package/documentation/{print-readme.js → doc-readme.js} +31 -35
- package/documentation/doc-util/doc-benchmarks.d.ts +6 -4
- package/documentation/doc-util/doc-benchmarks.js +6 -4
- package/documentation/doc-util/doc-cfg.js +5 -8
- package/documentation/doc-util/doc-dfg.d.ts +7 -7
- package/documentation/doc-util/doc-dfg.js +15 -14
- package/documentation/doc-util/doc-escape.d.ts +6 -0
- package/documentation/doc-util/doc-escape.js +11 -0
- package/documentation/doc-util/doc-general.d.ts +22 -2
- package/documentation/doc-util/doc-general.js +22 -2
- package/documentation/doc-util/doc-normalized-ast.d.ts +10 -5
- package/documentation/doc-util/doc-normalized-ast.js +14 -10
- package/documentation/doc-util/doc-query.d.ts +12 -4
- package/documentation/doc-util/doc-query.js +18 -11
- package/documentation/doc-util/doc-search.d.ts +0 -30
- package/documentation/doc-util/doc-search.js +2 -73
- package/documentation/doc-util/doc-server-message.d.ts +5 -5
- package/documentation/doc-util/doc-server-message.js +4 -4
- package/documentation/doc-util/doc-types.d.ts +69 -32
- package/documentation/doc-util/doc-types.js +109 -62
- package/documentation/index.d.ts +9 -9
- package/documentation/index.js +9 -9
- package/documentation/issue-linting-rule.d.ts +9 -0
- package/documentation/{print-linter-issue.js → issue-linting-rule.js} +20 -23
- package/documentation/wiki-analyzer.d.ts +9 -0
- package/documentation/wiki-analyzer.js +425 -0
- package/documentation/wiki-cfg.d.ts +9 -0
- package/documentation/{print-cfg-wiki.js → wiki-cfg.js} +144 -160
- package/documentation/wiki-core.d.ts +14 -0
- package/documentation/{print-core-wiki.js → wiki-core.js} +164 -175
- package/documentation/wiki-dataflow-graph.d.ts +9 -0
- package/documentation/{print-dataflow-graph-wiki.js → wiki-dataflow-graph.js} +146 -177
- package/documentation/wiki-engine.d.ts +9 -0
- package/documentation/{print-engines-wiki.js → wiki-engine.js} +27 -42
- package/documentation/wiki-faq.d.ts +8 -0
- package/documentation/wiki-faq.js +21 -0
- package/documentation/wiki-interface.d.ts +9 -0
- package/documentation/{print-interface-wiki.js → wiki-interface.js} +59 -56
- package/documentation/wiki-linter.d.ts +9 -0
- package/documentation/{print-linter-wiki.js → wiki-linter.js} +52 -48
- package/documentation/wiki-linting-and-testing.d.ts +9 -0
- package/documentation/{print-linting-and-testing-wiki.js → wiki-linting-and-testing.js} +25 -32
- package/documentation/wiki-mk/doc-context.d.ts +186 -0
- package/documentation/wiki-mk/doc-context.js +84 -0
- package/documentation/wiki-mk/doc-maker.d.ts +95 -0
- package/documentation/wiki-mk/doc-maker.js +134 -0
- package/documentation/wiki-normalized-ast.d.ts +9 -0
- package/documentation/{print-normalized-ast-wiki.js → wiki-normalized-ast.js} +64 -47
- package/documentation/wiki-onboarding.d.ts +8 -0
- package/documentation/{print-onboarding-wiki.js → wiki-onboarding.js} +18 -15
- package/documentation/wiki-query.d.ts +9 -0
- package/documentation/{print-query-wiki.js → wiki-query.js} +62 -47
- package/documentation/wiki-search.d.ts +9 -0
- package/documentation/wiki-search.js +61 -0
- package/linter/linter-executor.js +3 -2
- package/linter/linter-format.d.ts +2 -2
- package/linter/linter-rules.d.ts +15 -19
- package/linter/rules/absolute-path.d.ts +1 -2
- package/linter/rules/absolute-path.js +5 -5
- package/linter/rules/dataframe-access-validation.d.ts +2 -2
- package/linter/rules/dataframe-access-validation.js +13 -9
- package/linter/rules/dead-code.d.ts +1 -1
- package/linter/rules/deprecated-functions.d.ts +1 -5
- package/linter/rules/file-path-validity.d.ts +1 -1
- package/linter/rules/file-path-validity.js +4 -4
- package/linter/rules/function-finder-util.d.ts +3 -7
- package/linter/rules/function-finder-util.js +1 -1
- package/linter/rules/naming-convention.d.ts +2 -2
- package/linter/rules/naming-convention.js +1 -1
- package/linter/rules/network-functions.d.ts +1 -1
- package/linter/rules/network-functions.js +1 -1
- package/linter/rules/seeded-randomness.d.ts +4 -3
- package/linter/rules/seeded-randomness.js +38 -18
- package/linter/rules/unused-definition.d.ts +1 -1
- package/linter/rules/useless-loop.d.ts +2 -2
- package/linter/rules/useless-loop.js +2 -2
- package/package.json +5 -17
- package/project/cache/flowr-analyzer-cache.d.ts +7 -10
- package/project/cache/flowr-analyzer-cache.js +17 -38
- package/project/cache/flowr-analyzer-controlflow-cache.d.ts +34 -0
- package/project/cache/flowr-analyzer-controlflow-cache.js +79 -0
- package/project/context/flowr-analyzer-context.d.ts +37 -5
- package/project/context/flowr-analyzer-context.js +51 -4
- package/project/context/flowr-analyzer-environment-context.d.ts +47 -0
- package/project/context/flowr-analyzer-environment-context.js +50 -0
- package/project/context/flowr-analyzer-files-context.d.ts +63 -13
- package/project/context/flowr-analyzer-files-context.js +110 -39
- package/project/context/flowr-file.d.ts +32 -10
- package/project/context/flowr-file.js +30 -9
- package/project/flowr-analyzer-builder.d.ts +22 -28
- package/project/flowr-analyzer-builder.js +32 -70
- package/project/flowr-analyzer.d.ts +55 -14
- package/project/flowr-analyzer.js +53 -8
- package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.d.ts +7 -1
- package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.js +13 -5
- package/project/plugins/file-plugins/flowr-analyzer-file-plugin.d.ts +3 -3
- package/project/plugins/file-plugins/flowr-analyzer-file-plugin.js +11 -5
- package/project/plugins/file-plugins/flowr-description-file.d.ts +3 -3
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.d.ts +22 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.js +33 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.d.ts +22 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.js +33 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.d.ts +22 -0
- package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.js +33 -0
- package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.d.ts +20 -0
- package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.js +42 -0
- package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.d.ts +59 -0
- package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.js +132 -0
- package/project/plugins/file-plugins/notebooks/notebook.d.ts +0 -0
- package/project/plugins/file-plugins/notebooks/notebook.js +2 -0
- package/project/plugins/flowr-analyzer-plugin-defaults.d.ts +5 -0
- package/project/plugins/flowr-analyzer-plugin-defaults.js +23 -0
- package/project/plugins/flowr-analyzer-plugin.d.ts +2 -0
- package/project/plugins/flowr-analyzer-plugin.js +2 -0
- package/project/plugins/loading-order-plugins/flowr-analyzer-loading-order-description-file-plugin.js +1 -1
- package/project/plugins/package-version-plugins/flowr-analyzer-package-versions-description-file-plugin.js +1 -1
- package/project/plugins/plugin-registry.d.ts +34 -0
- package/project/plugins/plugin-registry.js +62 -0
- package/project/plugins/project-discovery/flowr-analyzer-project-discovery-plugin.js +7 -1
- package/queries/catalog/call-context-query/call-context-query-executor.js +5 -6
- package/queries/catalog/call-context-query/identify-link-to-last-call-relation.d.ts +5 -2
- package/queries/catalog/call-context-query/identify-link-to-last-call-relation.js +25 -18
- package/queries/catalog/cluster-query/cluster-query-format.d.ts +1 -1
- package/queries/catalog/control-flow-query/control-flow-query-format.d.ts +1 -1
- package/queries/catalog/control-flow-query/control-flow-query-format.js +3 -2
- package/queries/catalog/dataflow-lens-query/dataflow-lens-query-executor.js +1 -1
- package/queries/catalog/dataflow-lens-query/dataflow-lens-query-format.d.ts +1 -1
- package/queries/catalog/dataflow-query/dataflow-query-format.d.ts +1 -1
- package/queries/catalog/dependencies-query/dependencies-query-executor.d.ts +1 -1
- package/queries/catalog/dependencies-query/dependencies-query-executor.js +5 -5
- package/queries/catalog/dependencies-query/dependencies-query-format.d.ts +1 -1
- package/queries/catalog/dependencies-query/dependencies-query-format.js +1 -1
- package/queries/catalog/df-shape-query/df-shape-query-executor.d.ts +1 -1
- package/queries/catalog/df-shape-query/df-shape-query-executor.js +2 -2
- package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +6 -6
- package/queries/catalog/df-shape-query/df-shape-query-format.js +8 -7
- package/queries/catalog/happens-before-query/happens-before-query-executor.d.ts +2 -1
- package/queries/catalog/happens-before-query/happens-before-query-executor.js +2 -1
- package/queries/catalog/happens-before-query/happens-before-query-format.d.ts +1 -1
- package/queries/catalog/id-map-query/id-map-query-format.d.ts +1 -1
- package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.d.ts +1 -1
- package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.js +4 -4
- package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-format.d.ts +1 -1
- package/queries/catalog/linter-query/linter-query-format.d.ts +1 -1
- package/queries/catalog/linter-query/linter-query-format.js +13 -2
- package/queries/catalog/location-map-query/location-map-query-executor.js +2 -1
- package/queries/catalog/location-map-query/location-map-query-format.d.ts +1 -1
- package/queries/catalog/location-map-query/location-map-query-format.js +1 -1
- package/queries/catalog/normalized-ast-query/normalized-ast-query-format.d.ts +1 -1
- package/queries/catalog/origin-query/origin-query-format.d.ts +1 -1
- package/queries/catalog/project-query/project-query-executor.js +3 -1
- package/queries/catalog/project-query/project-query-format.d.ts +1 -1
- package/queries/catalog/resolve-value-query/resolve-value-query-executor.d.ts +2 -2
- package/queries/catalog/resolve-value-query/resolve-value-query-executor.js +3 -3
- package/queries/catalog/resolve-value-query/resolve-value-query-format.d.ts +1 -1
- package/queries/catalog/search-query/search-query-format.d.ts +1 -1
- package/queries/catalog/static-slice-query/static-slice-query-executor.js +2 -2
- package/queries/catalog/static-slice-query/static-slice-query-format.d.ts +1 -1
- package/queries/catalog/static-slice-query/static-slice-query-format.js +13 -1
- package/queries/query.d.ts +26 -18
- package/queries/query.js +21 -1
- package/r-bridge/lang-4.x/ast/model/collect.d.ts +2 -1
- package/r-bridge/lang-4.x/ast/model/collect.js +4 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-project.d.ts +29 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-project.js +15 -0
- package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +5 -7
- package/r-bridge/lang-4.x/ast/model/processing/decorate.js +24 -11
- package/r-bridge/lang-4.x/ast/model/type.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/model/type.js +2 -0
- package/r-bridge/lang-4.x/ast/parser/json/format.js +1 -1
- package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +9 -8
- package/r-bridge/lang-4.x/ast/parser/json/parser.js +11 -10
- package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.d.ts +4 -3
- package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.js +20 -11
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.d.ts +3 -3
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.js +5 -4
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.d.ts +3 -2
- package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.js +14 -5
- package/r-bridge/parser.d.ts +15 -5
- package/r-bridge/parser.js +27 -13
- package/r-bridge/retriever.d.ts +9 -15
- package/r-bridge/retriever.js +14 -5
- package/r-bridge/shell.d.ts +1 -1
- package/r-bridge/shell.js +1 -1
- package/reconstruct/auto-select/auto-select-defaults.d.ts +0 -1
- package/reconstruct/auto-select/magic-comments.js +1 -1
- package/reconstruct/reconstruct.d.ts +17 -9
- package/reconstruct/reconstruct.js +19 -8
- package/search/flowr-search.d.ts +12 -0
- package/search/search-executor/search-enrichers.d.ts +9 -2
- package/search/search-executor/search-enrichers.js +1 -3
- package/search/search-executor/search-generators.d.ts +1 -1
- package/search/search-executor/search-generators.js +9 -4
- package/slicing/criterion/collect-all.d.ts +3 -2
- package/slicing/criterion/collect-all.js +1 -1
- package/slicing/criterion/parse.js +4 -4
- package/slicing/static/slice-call.d.ts +3 -2
- package/slicing/static/slice-call.js +4 -4
- package/slicing/static/static-slicer.d.ts +3 -1
- package/slicing/static/static-slicer.js +6 -7
- package/statistics/features/supported/assignments/assignments.js +1 -1
- package/statistics/features/supported/control-flow/control-flow.js +2 -2
- package/statistics/features/supported/data-access/data-access.js +1 -1
- package/statistics/features/supported/defined-functions/defined-functions.js +1 -1
- package/statistics/features/supported/expression-list/statistics-expression-list.js +1 -1
- package/statistics/features/supported/loops/loops.js +1 -1
- package/statistics/features/supported/used-functions/used-functions.js +2 -2
- package/statistics/features/supported/variables/variables.js +3 -2
- package/statistics/statistics.js +3 -2
- package/util/assert.d.ts +4 -0
- package/util/assert.js +4 -0
- package/util/containers.js +1 -1
- package/util/files.d.ts +1 -1
- package/util/files.js +1 -1
- package/util/mermaid/ast.d.ts +4 -3
- package/util/mermaid/ast.js +36 -8
- package/util/mermaid/cfg.js +1 -1
- package/util/mermaid/dfg.d.ts +1 -0
- package/util/mermaid/dfg.js +3 -3
- package/util/simple-df/dfg-view.d.ts +2 -1
- package/util/simple-df/dfg-view.js +2 -2
- package/util/version.js +1 -1
- package/dataflow/environments/remove.d.ts +0 -12
- package/dataflow/environments/remove.js +0 -52
- package/documentation/print-analyzer-wiki.d.ts +0 -1
- package/documentation/print-analyzer-wiki.js +0 -141
- package/documentation/print-capabilities-markdown.d.ts +0 -1
- package/documentation/print-cfg-wiki.d.ts +0 -1
- package/documentation/print-core-wiki.d.ts +0 -5
- package/documentation/print-dataflow-graph-wiki.d.ts +0 -1
- package/documentation/print-engines-wiki.d.ts +0 -1
- package/documentation/print-faq-wiki.d.ts +0 -1
- package/documentation/print-faq-wiki.js +0 -18
- package/documentation/print-interface-wiki.d.ts +0 -1
- package/documentation/print-linter-issue.d.ts +0 -1
- package/documentation/print-linter-wiki.d.ts +0 -1
- package/documentation/print-linting-and-testing-wiki.d.ts +0 -1
- package/documentation/print-normalized-ast-wiki.d.ts +0 -1
- package/documentation/print-onboarding-wiki.d.ts +0 -1
- package/documentation/print-query-wiki.d.ts +0 -1
- package/documentation/print-readme.d.ts +0 -1
- package/documentation/print-search-wiki.d.ts +0 -1
- package/documentation/print-search-wiki.js +0 -74
- package/util/formats/adapter-format.d.ts +0 -6
- package/util/formats/adapter-format.js +0 -3
- package/util/formats/adapter.d.ts +0 -27
- package/util/formats/adapter.js +0 -58
- package/util/formats/adapters/r-adapter.d.ts +0 -4
- package/util/formats/adapters/r-adapter.js +0 -7
- package/util/formats/adapters/rmd-adapter.d.ts +0 -35
- package/util/formats/adapters/rmd-adapter.js +0 -100
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WikiCore = void 0;
|
|
6
4
|
exports.inspectContextExample = inspectContextExample;
|
|
7
|
-
const shell_1 = require("../r-bridge/shell");
|
|
8
|
-
const log_1 = require("../../test/functionality/_helper/log");
|
|
9
|
-
const log_2 = require("../util/log");
|
|
10
|
-
const doc_auto_gen_1 = require("./doc-util/doc-auto-gen");
|
|
11
|
-
const doc_structure_1 = require("./doc-util/doc-structure");
|
|
12
|
-
const doc_files_1 = require("./doc-util/doc-files");
|
|
13
|
-
const doc_cli_option_1 = require("./doc-util/doc-cli-option");
|
|
14
|
-
const doc_types_1 = require("./doc-util/doc-types");
|
|
15
|
-
const path_1 = __importDefault(require("path"));
|
|
16
5
|
const doc_code_1 = require("./doc-util/doc-code");
|
|
17
6
|
const extractor_1 = require("../dataflow/extractor");
|
|
18
7
|
const parser_1 = require("../r-bridge/parser");
|
|
@@ -43,17 +32,27 @@ const doc_issue_1 = require("./doc-util/doc-issue");
|
|
|
43
32
|
const pipeline_executor_1 = require("../core/pipeline-executor");
|
|
44
33
|
const pipeline_1 = require("../core/steps/pipeline/pipeline");
|
|
45
34
|
const static_slicer_1 = require("../slicing/static/static-slicer");
|
|
46
|
-
const config_1 = require("../config");
|
|
47
35
|
const flowr_analyzer_builder_1 = require("../project/flowr-analyzer-builder");
|
|
48
36
|
const flowr_analyzer_1 = require("../project/flowr-analyzer");
|
|
37
|
+
const flowr_analyzer_context_1 = require("../project/context/flowr-analyzer-context");
|
|
38
|
+
const doc_maker_1 = require("./wiki-mk/doc-maker");
|
|
39
|
+
const process_value_1 = require("../dataflow/internal/process/process-value");
|
|
40
|
+
const graph_1 = require("../dataflow/graph/graph");
|
|
41
|
+
const process_named_call_1 = require("../dataflow/internal/process/process-named-call");
|
|
42
|
+
const doc_cli_option_1 = require("./doc-util/doc-cli-option");
|
|
43
|
+
const doc_files_1 = require("./doc-util/doc-files");
|
|
44
|
+
const doc_structure_1 = require("./doc-util/doc-structure");
|
|
45
|
+
const shell_1 = require("../r-bridge/shell");
|
|
46
|
+
const log_1 = require("../../test/functionality/_helper/log");
|
|
47
|
+
const log_2 = require("../util/log");
|
|
49
48
|
async function makeAnalyzerExample() {
|
|
50
49
|
const analyzer = await new flowr_analyzer_builder_1.FlowrAnalyzerBuilder()
|
|
51
|
-
.addRequestFromInput('x <- 1; y <- x; print(y);')
|
|
52
50
|
.amendConfig(c => {
|
|
53
51
|
c.ignoreSourceCalls = true;
|
|
54
52
|
})
|
|
55
53
|
.setEngine('tree-sitter')
|
|
56
54
|
.build();
|
|
55
|
+
analyzer.addRequest('x <- 1; y <- x; print(y);');
|
|
57
56
|
return analyzer;
|
|
58
57
|
}
|
|
59
58
|
async function extractStepsExample(analyzer) {
|
|
@@ -62,6 +61,9 @@ async function extractStepsExample(analyzer) {
|
|
|
62
61
|
const cfg = await analyzer.controlflow();
|
|
63
62
|
return { normalizedAst, dataflow, cfg };
|
|
64
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Shows how to use the query API to perform a static slice (please do not simplify).
|
|
66
|
+
*/
|
|
65
67
|
async function sliceQueryExample(analyzer) {
|
|
66
68
|
const result = await analyzer.query([{
|
|
67
69
|
type: 'static-slice',
|
|
@@ -70,26 +72,23 @@ async function sliceQueryExample(analyzer) {
|
|
|
70
72
|
return result;
|
|
71
73
|
}
|
|
72
74
|
/**
|
|
73
|
-
*
|
|
75
|
+
* Shows how to inspect the context of an analyzer instance.
|
|
74
76
|
*/
|
|
75
77
|
function inspectContextExample(analyzer) {
|
|
76
78
|
const ctx = analyzer.inspectContext();
|
|
77
79
|
console.log('dplyr version', ctx.deps.getDependency('dplyr'));
|
|
78
80
|
console.log('loading order', ctx.files.loadingOrder.getLoadingOrder());
|
|
79
81
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}).info;
|
|
91
|
-
return `${(0, doc_auto_gen_1.autoGenHeader)({ filename: module.filename, purpose: 'core', rVersion: rversion })}
|
|
92
|
-
|
|
82
|
+
/**
|
|
83
|
+
* https://github.com/flowr-analysis/flowr/wiki/Core
|
|
84
|
+
*/
|
|
85
|
+
class WikiCore extends doc_maker_1.DocMaker {
|
|
86
|
+
constructor() {
|
|
87
|
+
super('wiki/Core.md', module.filename, 'core');
|
|
88
|
+
}
|
|
89
|
+
async text({ shell, treeSitter, ctx }) {
|
|
90
|
+
const sampleCode = 'x <- 1; print(x)';
|
|
91
|
+
return `
|
|
93
92
|
This wiki page provides an overview of the inner workings of _flowR_.
|
|
94
93
|
It is mostly intended for developers that want to extend the capabilities of _flowR_
|
|
95
94
|
and assumes knowledge of [TypeScript](https://www.typescriptlang.org/) and [R](https://www.r-project.org/).
|
|
@@ -98,21 +97,21 @@ In case you are new and want to develop for flowR, please check out the relevant
|
|
|
98
97
|
and the [Contributing Guidelines](${doc_files_1.RemoteFlowrFilePathBaseRef}/.github/CONTRIBUTING.md).
|
|
99
98
|
|
|
100
99
|
${(0, doc_structure_1.block)({
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
type: 'NOTE',
|
|
101
|
+
content: `
|
|
103
102
|
Essentially every step we explain here can be explored directly from flowR's REPL in an interactive fashion (see the [Interface](${doc_files_1.FlowrWikiBaseRef}/Interface#using-the-repl) wiki page).
|
|
104
103
|
We recommend to use commands like ${(0, doc_cli_option_1.getReplCommand)('parse')} or ${(0, doc_cli_option_1.getReplCommand)('dataflow*')} to explore the output of flowR using your own samples.
|
|
105
104
|
As a quickstart you may use:
|
|
106
105
|
|
|
107
106
|
${await (0, doc_repl_1.documentReplSession)(shell, [{
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
command: `:parse "${sampleCode}"`,
|
|
108
|
+
description: `Retrieves the AST from the ${ctx.link(shell_1.RShell)}.`
|
|
109
|
+
}])}
|
|
111
110
|
|
|
112
111
|
If you are brave (or desperate) enough, you can also try to use the ${(0, doc_cli_option_1.getCliLongOptionOf)('flowr', 'verbose')} option to be dumped with information about flowR's internals (please, never use this for benchmarking).
|
|
113
112
|
See the [Getting flowR to Talk](#getting-flowr-to-talk) section below for more information.
|
|
114
113
|
`
|
|
115
|
-
|
|
114
|
+
})}
|
|
116
115
|
|
|
117
116
|
* [Creating and Using a flowR Analyzer Instance](#creating-and-using-a-flowr-analyzer-instance)
|
|
118
117
|
* [Pipelines and their Execution](#pipelines-and-their-execution)
|
|
@@ -127,90 +126,91 @@ See the [Getting flowR to Talk](#getting-flowr-to-talk) section below for more i
|
|
|
127
126
|
|
|
128
127
|
## Creating and Using a flowR Analyzer Instance
|
|
129
128
|
|
|
130
|
-
The ${
|
|
131
|
-
It provides a fluent interface for the configuration and creation of a ${
|
|
129
|
+
The ${ctx.link(flowr_analyzer_builder_1.FlowrAnalyzerBuilder)} class should be used as a starting point to create analyses in _flowR_.
|
|
130
|
+
It provides a fluent interface for the configuration and creation of a ${ctx.link(flowr_analyzer_1.FlowrAnalyzer)} instance:
|
|
132
131
|
|
|
133
|
-
${(
|
|
132
|
+
${ctx.code(makeAnalyzerExample, { dropLinesStart: 1, dropLinesEnd: 2, hideDefinedAt: true })}
|
|
134
133
|
|
|
135
134
|
Have a look at the [Engine](${doc_files_1.FlowrWikiBaseRef}/Engines) wiki page to understand the different engines and parsers you can use.
|
|
136
135
|
|
|
137
136
|
The analyzer instance can then be used to access analysis results like the [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST),
|
|
138
137
|
the [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph), and the [controlflow graph](${doc_files_1.FlowrWikiBaseRef}/Control-Flow-Graph):
|
|
139
138
|
|
|
140
|
-
${(
|
|
139
|
+
${ctx.code(extractStepsExample, { dropLinesStart: 1, dropLinesEnd: 2, hideDefinedAt: true })}
|
|
141
140
|
|
|
142
|
-
The underlying ${
|
|
141
|
+
The underlying ${ctx.link(flowr_analyzer_1.FlowrAnalyzer.name)} instance will take care of caching, updates, and running the appropriate steps.
|
|
143
142
|
It also exposes the [query API](${doc_files_1.FlowrWikiBaseRef}/Query-API):
|
|
144
143
|
|
|
145
|
-
${(
|
|
144
|
+
${ctx.code(sliceQueryExample, { dropLinesStart: 1, dropLinesEnd: 2, hideDefinedAt: true })}
|
|
146
145
|
|
|
147
|
-
One of the additional advantages of using the ${
|
|
146
|
+
One of the additional advantages of using the ${ctx.link(flowr_analyzer_1.FlowrAnalyzer.name)} is that it provides you with context information about the analysed files:
|
|
148
147
|
|
|
149
|
-
${(
|
|
148
|
+
${ctx.code(inspectContextExample, { dropLinesStart: 1, dropLinesEnd: 1, hideDefinedAt: true })}
|
|
150
149
|
|
|
151
150
|
## Pipelines and their Execution
|
|
152
151
|
|
|
153
|
-
At the core of every analysis done via a ${
|
|
152
|
+
At the core of every analysis done via a ${ctx.link(flowr_analyzer_1.FlowrAnalyzer)} is the ${ctx.link(pipeline_executor_1.PipelineExecutor)} class which takes a sequence of analysis steps (in the form of a ${ctx.link('Pipeline')}) and executes it
|
|
154
153
|
on a given input. In general, these pipeline steps are analysis agnostic and may use arbitrary input and ordering. However, two important and predefined pipelines,
|
|
155
|
-
the ${
|
|
154
|
+
the ${ctx.link('DEFAULT_DATAFLOW_PIPELINE')} and the ${ctx.link('TREE_SITTER_DATAFLOW_PIPELINE')} adequately cover the most common analysis steps
|
|
156
155
|
(differentiated only by the [Engine](${doc_files_1.FlowrWikiBaseRef}/Engines) used).
|
|
157
156
|
|
|
158
157
|
${(0, doc_structure_1.block)({
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
type: 'TIP',
|
|
159
|
+
content: `
|
|
161
160
|
You can hover over most links within these wiki pages to get access to the tsdoc comment of the respective element.
|
|
162
161
|
The links should direct you to the up-to-date implementation.
|
|
163
162
|
`
|
|
164
|
-
|
|
163
|
+
})}
|
|
165
164
|
|
|
166
165
|
Using the [\`tree-sitter\` engine](${doc_files_1.FlowrWikiBaseRef}/Engines) you can request a dataflow analysis of a sample piece of R code like the following:
|
|
167
166
|
|
|
168
167
|
${(0, doc_code_1.codeBlock)('typescript', `
|
|
169
168
|
const executor = new PipelineExecutor(TREE_SITTER_DATAFLOW_PIPELINE, {
|
|
170
169
|
parser: new TreeSitterExecutor(),
|
|
171
|
-
|
|
170
|
+
context: contextFromInput('x <- 1; y <- x; print(y);')
|
|
172
171
|
});
|
|
173
172
|
const result = await executor.allRemainingSteps();
|
|
174
173
|
`)}
|
|
175
174
|
|
|
176
|
-
This is, roughly, what the ${
|
|
177
|
-
We create a new ${
|
|
175
|
+
This is, roughly, what the ${ctx.link('dataflow')} function does when using the [\`tree-sitter\` engine](${doc_files_1.FlowrWikiBaseRef}/Engines).
|
|
176
|
+
We create a new ${ctx.link(pipeline_executor_1.PipelineExecutor)} with the ${ctx.link('TREE_SITTER_DATAFLOW_PIPELINE')} and then use
|
|
177
|
+
${ctx.link(`${pipeline_executor_1.PipelineExecutor.name}::${pipeline_executor_1.PipelineExecutor.prototype.allRemainingSteps.name}`)}
|
|
178
178
|
to cause the execution of all contained steps (in general, pipelines can be executed step-by-step, but this is usually not required if you just want the result).
|
|
179
179
|
|
|
180
|
-
In general, however, most flowR-internal functions which are tasked with generating dataflow prefer the use of ${
|
|
180
|
+
In general, however, most flowR-internal functions which are tasked with generating dataflow prefer the use of ${ctx.link(default_pipelines_1.createDataflowPipeline)} as this function
|
|
181
181
|
automatically selects the correct pipeline based on the engine used.
|
|
182
182
|
|
|
183
183
|
### Understanding Pipeline Steps
|
|
184
184
|
|
|
185
|
-
Everything that complies to the ${
|
|
185
|
+
Everything that complies to the ${ctx.link('IPipelineStep')} interface can be used as a step in a pipeline, with the most important definition being the
|
|
186
186
|
\`processor\` function, which refers to the actual work performed by the step.
|
|
187
|
-
For example, the ${
|
|
187
|
+
For example, the ${ctx.link('STATIC_DATAFLOW')} step ultimately relies on the ${ctx.link(extractor_1.produceDataFlowGraph)} function to create a [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph)
|
|
188
188
|
using the [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST) of the program.
|
|
189
189
|
|
|
190
190
|
### Shape of a Pipeline Step
|
|
191
191
|
|
|
192
|
-
Using code, you can provide an arbitrary pipeline step to the executor, as long as it implements the ${
|
|
192
|
+
Using code, you can provide an arbitrary pipeline step to the executor, as long as it implements the ${ctx.link('IPipelineStep')} interface:
|
|
193
193
|
|
|
194
|
-
${
|
|
194
|
+
${ctx.hierarchy('IPipelineStep', { maxDepth: 0 })}
|
|
195
195
|
|
|
196
|
-
Every step may specify required inputs, ways of visualizing the output, and its dependencies using the ${
|
|
196
|
+
Every step may specify required inputs, ways of visualizing the output, and its dependencies using the ${ctx.link('IPipelineStepOrder')} interface.
|
|
197
197
|
As the types may seem to be somewhat confusing or over-complicated, we recommend you to look at some existing steps, like
|
|
198
|
-
the ${
|
|
199
|
-
The pipeline executor should do a good job of scheduling these steps (usually using a topological sort), and inferring the required inputs in the type system (have a look at the ${
|
|
198
|
+
the ${ctx.link('PARSE_WITH_R_SHELL_STEP')} or the ${ctx.link('STATIC_DATAFLOW')} step.
|
|
199
|
+
The pipeline executor should do a good job of scheduling these steps (usually using a topological sort), and inferring the required inputs in the type system (have a look at the ${ctx.link(pipeline_1.createPipeline)} function if you want to know more).
|
|
200
200
|
|
|
201
201
|
${(0, doc_structure_1.block)({
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
type: 'NOTE',
|
|
203
|
+
content: `
|
|
204
204
|
Under the hood there is a step-subtype called a decoration. Such a step can be added to a pipeline to decorate the output of another one (e.g., making it more precise, re-adding debug info, ...).
|
|
205
|
-
To mark a step as a decoration, you can use the \`decorates\` field in the ${
|
|
205
|
+
To mark a step as a decoration, you can use the \`decorates\` field in the ${ctx.link('IPipelineStepOrder')} interface.
|
|
206
206
|
However, as such steps are currently not relevant for any of flowR's core analyses we will not go into detail here. It suffices to know how "real" steps work.
|
|
207
207
|
`
|
|
208
|
-
|
|
208
|
+
})}
|
|
209
209
|
|
|
210
210
|
## How flowR Produces Dataflow Graphs
|
|
211
211
|
|
|
212
212
|
This section focuses on the generation of a [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph) from a given R program, using the [RShell Engine](${doc_files_1.FlowrWikiBaseRef}/Engines) and hence the
|
|
213
|
-
${
|
|
213
|
+
${ctx.link('DEFAULT_DATAFLOW_PIPELINE')}. The [\`tree-sitter\` engine](${doc_files_1.FlowrWikiBaseRef}/Engines) uses the ${ctx.link('TREE_SITTER_DATAFLOW_PIPELINE')}),
|
|
214
214
|
which replaces the parser with the integrated tree-sitter parser and hence uses a slightly adapted normalization step to produce a similar [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST).
|
|
215
215
|
The [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph) should be the same for both engines (although [\`tree-sitter\`](${doc_files_1.FlowrWikiBaseRef}/Engines) is faster and may be able to parse more files).
|
|
216
216
|
|
|
@@ -218,73 +218,72 @@ The [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph) should be t
|
|
|
218
218
|
|
|
219
219
|
Let's have a look at the definition of the pipeline:
|
|
220
220
|
|
|
221
|
-
${
|
|
221
|
+
${ctx.hierarchy('DEFAULT_DATAFLOW_PIPELINE', { maxDepth: 0 })}
|
|
222
222
|
|
|
223
223
|
We can see that it relies on three steps:
|
|
224
224
|
|
|
225
|
-
1. **${
|
|
226
|
-
_Its main function linked as the processor is the ${
|
|
227
|
-
2. **${
|
|
228
|
-
_Its main function linked as the processor is the ${
|
|
229
|
-
3. **${
|
|
230
|
-
_Its main function linked as the processor is the ${
|
|
225
|
+
1. **${ctx.link('PARSE_WITH_R_SHELL_STEP', { codeFont: false })}** ([parsing](#parsing)): Uses the ${ctx.link(shell_1.RShell)} to parse the input program.\\
|
|
226
|
+
_Its main function linked as the processor is the ${ctx.link(parser_1.parseRequests, { codeFont: false })} function._
|
|
227
|
+
2. **${ctx.link('NORMALIZE', { codeFont: false })}** ([normalization](#normalization)): Normalizes the AST produced by the parser (to create a [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST)).\\
|
|
228
|
+
_Its main function linked as the processor is the ${ctx.link(parser_2.normalize, { codeFont: false })} function._
|
|
229
|
+
3. **${ctx.link('STATIC_DATAFLOW', { codeFont: false })}** ([dataflow](#dataflow-graph-generation)): Produces the actual [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph) from the normalized AST.\\
|
|
230
|
+
_Its main function linked as the processor is the ${ctx.link(extractor_1.produceDataFlowGraph, { codeFont: false })} function._
|
|
231
231
|
|
|
232
232
|
To explore these steps, let's use the REPL with the (very simple and contrived) R code: \`${sampleCode}\`.
|
|
233
233
|
|
|
234
234
|
${await (0, doc_repl_1.documentReplSession)(shell, [{
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
235
|
+
command: `:parse "${sampleCode}"`,
|
|
236
|
+
description: `This shows the ASCII-Art representation of the parse-tree of the R code \`${sampleCode}\`, as it is provided by the ${ctx.link(shell_1.RShell)}. See the ${ctx.link(init_1.initCommand)} function for more information on how we request a parse.`
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
command: `:normalize* "${sampleCode}"`,
|
|
240
|
+
description: `Following the link output should show the following:\n${await (0, doc_normalized_ast_1.printNormalizedAstForCode)(shell, sampleCode, { showCode: false })}`
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
command: `:dataflow* "${sampleCode}"`,
|
|
244
|
+
description: `Following the link output should show the following:\n${await (0, doc_dfg_1.printDfGraphForCode)(shell, sampleCode, { showCode: false })}`
|
|
245
|
+
}
|
|
246
|
+
], { openOutput: false })}
|
|
247
247
|
|
|
248
248
|
${(0, doc_structure_1.block)({
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
type: 'TIP',
|
|
250
|
+
content: `
|
|
251
251
|
All of these commands accept file paths as well, so you can write longer R code within a file, and then pass
|
|
252
252
|
the file path prefixed with \`${retriever_1.fileProtocol}\` (e.g., \`${retriever_1.fileProtocol}test/testfiles/example.R\`) to the commands.`
|
|
253
|
-
|
|
253
|
+
})}
|
|
254
254
|
|
|
255
255
|
Especially when you are just starting with flowR, we recommend using the REPL to explore the output of the different steps.
|
|
256
256
|
|
|
257
257
|
${(0, doc_structure_1.block)({
|
|
258
|
-
|
|
259
|
-
|
|
258
|
+
type: 'NOTE',
|
|
259
|
+
content: 'Maybe you are left with the question: What is tree-sitter doing differently? Expand the following to get more information!\n\n' + (0, doc_structure_1.details)('And what changes with tree-sitter?', `
|
|
260
260
|
|
|
261
261
|
Essentially not much (from a user perspective, it does essentially everything and all differently under the hood)! Have a look at the [Engines](${doc_files_1.FlowrWikiBaseRef}/Engines) wiki page for more information on the differences between the engines.
|
|
262
262
|
Below you can see the Repl commands for the tree-sitter engine (using ${(0, doc_cli_option_1.getCliLongOptionOf)('flowr', 'default-engine')} to set the engine to tree-sitter):
|
|
263
263
|
|
|
264
264
|
${await (async () => {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
})()}
|
|
265
|
+
return await (0, doc_repl_1.documentReplSession)(treeSitter, [{
|
|
266
|
+
command: `:parse "${sampleCode}"`,
|
|
267
|
+
description: `This shows the ASCII-Art representation of the parse-tree of the R code \`${sampleCode}\`, as it is provided by the ${ctx.link(tree_sitter_executor_1.TreeSitterExecutor)}. See the [Engines](${doc_files_1.FlowrWikiBaseRef}/Engines) wiki page for more information on the differences between the engines.`
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
command: `:normalize* "${sampleCode}"`,
|
|
271
|
+
description: `Following the link output should show the following:\n${await (0, doc_normalized_ast_1.printNormalizedAstForCode)(treeSitter, sampleCode, { showCode: false })}`
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
command: `:dataflow* "${sampleCode}"`,
|
|
275
|
+
description: `Following the link output should show the following:\n${await (0, doc_dfg_1.printDfGraphForCode)(treeSitter, sampleCode, { showCode: false })}`
|
|
276
|
+
}], { openOutput: false, args: '--default-engine tree-sitter' });
|
|
277
|
+
})()}
|
|
279
278
|
`)
|
|
280
|
-
|
|
279
|
+
})}
|
|
281
280
|
|
|
282
281
|
### Parsing
|
|
283
282
|
|
|
284
|
-
The parsing step uses the ${
|
|
285
|
-
To speed up the process, we use the ${
|
|
283
|
+
The parsing step uses the ${ctx.link(shell_1.RShell)} to parse the input program (or, of course, the ${ctx.link(tree_sitter_executor_1.TreeSitterExecutor)} when using the [\`tree-sitter\` engine](${doc_files_1.FlowrWikiBaseRef}/Engines)).
|
|
284
|
+
To speed up the process, we use the ${ctx.link(init_1.initCommand)} function to compile the parsing function and rely on a
|
|
286
285
|
custom serialization, which outputs the information in a CSV-like format.
|
|
287
|
-
This means, that the ${(0, doc_cli_option_1.getReplCommand)('parse')} command actually kind-of lies to you, as it does pretty print the serialized version which looks more like the following (this uses the ${
|
|
286
|
+
This means, that the ${(0, doc_cli_option_1.getReplCommand)('parse')} command actually kind-of lies to you, as it does pretty print the serialized version which looks more like the following (this uses the ${ctx.link(retriever_1.retrieveParseDataFromRCode.name)} function with the sample code \`${sampleCode}\`):
|
|
288
287
|
|
|
289
288
|
${(0, doc_structure_1.details)(`Raw parse output for <code>${sampleCode}</code>`, `For the code \`${sampleCode}\`:\n\n` + (0, doc_code_1.codeBlock)('csv', await (0, retriever_1.retrieveParseDataFromRCode)((0, retriever_1.requestFromInput)(sampleCode), shell)))}
|
|
290
289
|
|
|
@@ -304,108 +303,108 @@ ${await (0, retriever_1.retrieveParseDataFromRCode)((0, retriever_1.requestFromI
|
|
|
304
303
|
In fact, this data is merely what R's [\`base::parse\`](https://stat.ethz.ch/R-manual/R-devel/library/base/html/parse.html) and [\`utils::getParseData\`](https://stat.ethz.ch/R-manual/R-devel/library/utils/html/getParseData.html) functions provide.
|
|
305
304
|
We then use this data in the [normalization](#normalization) step to create a [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST).
|
|
306
305
|
|
|
307
|
-
If you are interested in the raw token types that we may encounter, have a look at the ${
|
|
306
|
+
If you are interested in the raw token types that we may encounter, have a look at the ${ctx.link('RawRType')} enum.
|
|
308
307
|
|
|
309
308
|
### Normalization
|
|
310
309
|
|
|
311
|
-
The normalization function ${
|
|
312
|
-
${
|
|
313
|
-
Next, ${
|
|
314
|
-
While looking at the mermaid visualization of such an AST is nice and usually sufficient, looking at the objects themselves shows you the full range of information the AST provides (all encompassed within the ${
|
|
310
|
+
The normalization function ${ctx.link(parser_2.normalize)} takes the output from the previous steps and uses the ${ctx.link(format_1.prepareParsedData)} and
|
|
311
|
+
${ctx.link(format_1.convertPreparedParsedData)} functions to first transform the serialized parsing output to an object.
|
|
312
|
+
Next, ${ctx.link(normalize_root_1.normalizeRootObjToAst)} transforms this object to a normalized AST and ${ctx.link(decorate_1.decorateAst)} adds additional information to the AST (like roles, ids, depth, etc.).
|
|
313
|
+
While looking at the mermaid visualization of such an AST is nice and usually sufficient, looking at the objects themselves shows you the full range of information the AST provides (all encompassed within the ${ctx.link('RNode')} type).
|
|
315
314
|
|
|
316
315
|
Let's have a look at the normalized AST for the sample code \`${sampleCode}\` (please refer to the [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST) wiki page for more information):
|
|
317
316
|
|
|
318
|
-
${(0, doc_structure_1.details)('Normalized AST for <code>x <- 1; print(x)</code>', (0, doc_code_1.codeBlock)('json', JSON.stringify((await (0, default_pipelines_1.createNormalizePipeline)(shell, {
|
|
317
|
+
${(0, doc_structure_1.details)('Normalized AST for <code>x <- 1; print(x)</code>', (0, doc_code_1.codeBlock)('json', JSON.stringify((await (0, default_pipelines_1.createNormalizePipeline)(shell, { context: (0, flowr_analyzer_context_1.contextFromInput)(sampleCode) }).allRemainingSteps()).normalize.ast, json_1.jsonReplacer, 4)))}
|
|
319
318
|
|
|
320
|
-
This is… a lot! We get the type from the ${
|
|
319
|
+
This is… a lot! We get the type from the ${ctx.link('RType')} enum, the lexeme, location information, an id, the children of the node, and their parents.
|
|
321
320
|
While the [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST) wiki page provides you with information on how to interpret this data, we will focus on how we get it from the
|
|
322
321
|
table provided by the [parsing](#parsing) step.
|
|
323
322
|
|
|
324
|
-
There are two important functions: ${
|
|
325
|
-
and ${
|
|
323
|
+
There are two important functions: ${ctx.link(normalize_root_1.normalizeRootObjToAst)}, which operates on the parse-output already transformed into a tree-like structure,
|
|
324
|
+
and ${ctx.link(decorate_1.decorateAst)}, which adds additional information to the AST.
|
|
326
325
|
Both follow a [fold](https://en.wikipedia.org/wiki/Fold_(higher-order_function)) pattern.
|
|
327
|
-
The fold is explicit for ${
|
|
328
|
-
while ${
|
|
326
|
+
The fold is explicit for ${ctx.link(decorate_1.decorateAst)}, which directly relies on the ${ctx.link(stateful_fold_1.foldAstStateful)} function,
|
|
327
|
+
while ${ctx.link(normalize_root_1.normalizeRootObjToAst)} uses the fold-idiom but deviates in cases in which (for example) we require more information on other nodes to know what it should be normalized too.
|
|
329
328
|
|
|
330
329
|
#### Normalizing the Object
|
|
331
330
|
|
|
332
|
-
We have a handler for everything. For example ${
|
|
333
|
-
All of these handlers contain many sanity checks to be sure that we talk to an ${(
|
|
331
|
+
We have a handler for everything. For example ${ctx.link(normalize_if_then_1.tryNormalizeIfThen)} or ${ctx.link(normalize_for_1.tryNormalizeFor)} to handle \`if(x) y\` or \`for(i in 1:10) x\` constructs.
|
|
332
|
+
All of these handlers contain many sanity checks to be sure that we talk to an ${ctx.link(shell_1.RShell)} which we can handle (as assumptions may break with newer versions).
|
|
334
333
|
These functions contain the keyword \`try\` as they may fail. For example, whenever they notice late into normalization that they should actually be a different construct (R is great).
|
|
335
|
-
For single nodes, we use ${
|
|
334
|
+
For single nodes, we use ${ctx.link(normalize_single_node_1.normalizeSingleNode)} which contains a catch-all for some edge-cases in the R grammar.
|
|
336
335
|
|
|
337
|
-
The output of just this pass is listed below (using the ${
|
|
336
|
+
The output of just this pass is listed below (using the ${ctx.link(parser_2.normalizeButNotDecorated)} function):
|
|
338
337
|
|
|
339
|
-
${(0, doc_structure_1.details)('Ast for <code>x <- 1; print(x)</code> after the first normalization', (0, doc_code_1.codeBlock)('json', JSON.stringify((0, parser_2.normalizeButNotDecorated)((await (0, default_pipelines_1.createParsePipeline)(shell, {
|
|
338
|
+
${(0, doc_structure_1.details)('Ast for <code>x <- 1; print(x)</code> after the first normalization', (0, doc_code_1.codeBlock)('json', JSON.stringify((0, parser_2.normalizeButNotDecorated)((await (0, default_pipelines_1.createParsePipeline)(shell, { context: (0, flowr_analyzer_context_1.contextFromInput)(sampleCode) }).allRemainingSteps()).parse.files[0]), json_1.jsonReplacer, 4)))}
|
|
340
339
|
|
|
341
340
|
|
|
342
341
|
#### Decorating the AST
|
|
343
342
|
|
|
344
|
-
The decoration is comparatively trivial. We take the AST throw it into the ${
|
|
343
|
+
The decoration is comparatively trivial. We take the AST throw it into the ${ctx.link(decorate_1.decorateAst.name)} function (which again, handles each normalized node type) and
|
|
345
344
|
get:
|
|
346
345
|
|
|
347
346
|
1. The AST with ids, roles, and depth information (see the [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST) wiki page for more information).
|
|
348
|
-
2. A mapping of ids to nodes in the form of a ${
|
|
347
|
+
2. A mapping of ids to nodes in the form of a ${ctx.link('AstIdMap')} object. This allows us to quickly access nodes by their id.
|
|
349
348
|
|
|
350
|
-
The ids used for the AST generation are arbitrary (usually created by the ${
|
|
349
|
+
The ids used for the AST generation are arbitrary (usually created by the ${ctx.link(decorate_1.deterministicCountingIdGenerator.name)}) function) but unique and intentionally
|
|
351
350
|
separated from the ids used by the R parser. For one, this detaches us from the [Engine](${doc_files_1.FlowrWikiBaseRef}/Engines) used, and secondly, it allows for much easier
|
|
352
351
|
extension of the AST (e.g., when R files use [\`base::source\`](https://stat.ethz.ch/R-manual/R-devel/library/base/html/source.html) to include other R files).
|
|
353
|
-
All ids conform to the ${
|
|
352
|
+
All ids conform to the ${ctx.link('NodeId')} type.
|
|
354
353
|
|
|
355
354
|
### Dataflow Graph Generation
|
|
356
355
|
|
|
357
356
|
The core of the dataflow graph generation works as a "stateful [fold](https://en.wikipedia.org/wiki/Fold_(higher-order_function))",
|
|
358
357
|
which uses the tree-like structure of the AST to combine the dataflow information of the children, while tracking the currently active variables and control flow
|
|
359
358
|
information as a “backpack” (state).
|
|
360
|
-
We use the ${
|
|
361
|
-
The function is mainly backed by its ${
|
|
359
|
+
We use the ${ctx.link(extractor_1.produceDataFlowGraph)} function as an entry point to the dataflow generation (the actual fold entry is in ${ctx.link(processor_1.processDataflowFor)}).
|
|
360
|
+
The function is mainly backed by its ${ctx.link('processors')} object which maps each type in the normalized AST to an appropriate handler ("fold-function").
|
|
362
361
|
|
|
363
|
-
To understand these handlers, let's start with the simplest one, ${
|
|
364
|
-
we do not care about this node and just produce an empty dataflow information (using ${
|
|
362
|
+
To understand these handlers, let's start with the simplest one, ${ctx.link(process_uninteresting_leaf_1.processUninterestingLeaf)} signals that
|
|
363
|
+
we do not care about this node and just produce an empty dataflow information (using ${ctx.link(info_1.initializeCleanDataflowInformation)}).
|
|
365
364
|
Looking at the function showcases the general structure of a processor:
|
|
366
365
|
|
|
367
|
-
${(
|
|
366
|
+
${ctx.hierarchy(process_uninteresting_leaf_1.processUninterestingLeaf, { maxDepth: 2, openTop: true })}
|
|
368
367
|
|
|
369
368
|
Every processor has the same shape. It takes the normalized node (see the [normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST) for more information),
|
|
370
|
-
and a ${
|
|
369
|
+
and a ${ctx.link('DataflowProcessorInformation')} object which, as some kind of "backpack" carries global information
|
|
371
370
|
to every handler.
|
|
372
|
-
This information is to be used to create a ${
|
|
371
|
+
This information is to be used to create a ${ctx.link('DataflowInformation')}:
|
|
373
372
|
|
|
374
|
-
${
|
|
373
|
+
${ctx.hierarchy('DataflowInformation', { maxDepth: 2 })}
|
|
375
374
|
|
|
376
375
|
Essentially, these processors should use the dataflow information from their children combined with their own semantics
|
|
377
|
-
to produce a new dataflow information to pass upwards in the fold. The ${
|
|
376
|
+
to produce a new dataflow information to pass upwards in the fold. The ${ctx.link('DataflowInformation')} contains:
|
|
378
377
|
|
|
379
|
-
* the ${(
|
|
380
|
-
* the currently active ${
|
|
381
|
-
* control flow information in ${
|
|
382
|
-
* and sets of currently ingoing (read), outgoing (write) and unknown ${
|
|
378
|
+
* the ${ctx.link(graph_1.DataflowGraph)} of the current subtree
|
|
379
|
+
* the currently active ${ctx.link('REnvironmentInformation')} as an abstraction of all active definitions linking to potential definition locations (see [Advanced R::Environments](https://adv-r.hadley.nz/environments.html))
|
|
380
|
+
* control flow information in ${ctx.link('DataflowCfgInformation')} which is used to enrich the dataflow information with control flow information
|
|
381
|
+
* and sets of currently ingoing (read), outgoing (write) and unknown ${ctx.link('IdentifierReference')}s.
|
|
383
382
|
|
|
384
|
-
While all of them are essentially empty when processing an “uninteresting leaf”, handling a constant is slightly more interesting with ${(
|
|
383
|
+
While all of them are essentially empty when processing an “uninteresting leaf”, handling a constant is slightly more interesting with ${ctx.link(process_value_1.processValue)}:
|
|
385
384
|
|
|
386
|
-
${(
|
|
385
|
+
${ctx.hierarchy(process_value_1.processValue, { maxDepth: 2, openTop: true })}
|
|
387
386
|
|
|
388
387
|
Please note, that we add the [value vertex](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph#value-vertex) to the newly created dataflow graph,
|
|
389
|
-
which holds a reference to the constant. If you are confused with the use of the ${
|
|
390
|
-
this stems from the [AST decoration](#normalization) and signals that we have a decorated ${
|
|
388
|
+
which holds a reference to the constant. If you are confused with the use of the ${ctx.link('ParentInformation')} type,
|
|
389
|
+
this stems from the [AST decoration](#normalization) and signals that we have a decorated ${ctx.link('RNode')} (which may have additional information in \`OtherInfo\`).
|
|
391
390
|
|
|
392
|
-
Yet again, this is not very interesting. When looking at the ${
|
|
393
|
-
many lines just mapping the node to the ${(
|
|
391
|
+
Yet again, this is not very interesting. When looking at the ${ctx.link('processors')} object you may be confused by
|
|
392
|
+
many lines just mapping the node to the ${ctx.link(process_named_call_1.processAsNamedCall)} function.
|
|
394
393
|
This is because during the dataflow analysis we actually "desugar" the AST, and treat syntax constructs like binary operators (e.g., \`x + y\`) as function calls (e.g. \`\` \`+\`(x, y) \`\`).
|
|
395
394
|
We do this, because R does it the same way, and allows to even overwrite these operators (including \`if\`, \`<-\`, etc.) by their name.
|
|
396
395
|
By treating them like R, as function calls, we get support for these overwrites for free, courtesy of flowR's call resolution.
|
|
397
396
|
|
|
398
397
|
But where are all the interesting things handled then?
|
|
399
398
|
For that, we want to have a look at the built-in environment, which can be freely configured using flowR's [configuration system](${doc_files_1.FlowrWikiBaseRef}/Interface#configuring-flowr).
|
|
400
|
-
FlowR's heart and soul resides in the ${
|
|
401
|
-
by mapping function names to ${
|
|
402
|
-
There you can find functions like ${
|
|
403
|
-
or ${
|
|
399
|
+
FlowR's heart and soul resides in the ${ctx.link('DefaultBuiltinConfig')} object, which is used to configure the built-in environment
|
|
400
|
+
by mapping function names to ${ctx.link('BuiltInProcessorMapper')} functions.
|
|
401
|
+
There you can find functions like ${ctx.link(built_in_access_1.processAccess)} which handles the (subset) access to a variable,
|
|
402
|
+
or ${ctx.link(built_in_for_loop_1.processForLoop)} which handles the primitive for loop construct (whenever it is not overwritten).
|
|
404
403
|
|
|
405
|
-
Just as an example, we want to have a look at the ${
|
|
404
|
+
Just as an example, we want to have a look at the ${ctx.link(built_in_repeat_loop_1.processRepeatLoop)} function, as it is one of the simplest built-in processors
|
|
406
405
|
we have:
|
|
407
406
|
|
|
408
|
-
${(
|
|
407
|
+
${ctx.hierarchy(built_in_repeat_loop_1.processRepeatLoop, { maxDepth: 2, openTop: true })}
|
|
409
408
|
|
|
410
409
|
Similar to any other built-in processor, we get the name of the function call which caused us to land here,
|
|
411
410
|
as well as the passed arguments. The \`rootId\` refers to what caused the call to happen (and is usually just the function call),
|
|
@@ -418,7 +417,7 @@ For just the repeat loop the stitching is actually not necessary, but this way t
|
|
|
418
417
|
|
|
419
418
|
Afterward, we take the \`processedArguments\`, perform another round of sanity checks and then use two special functions to apply the
|
|
420
419
|
semantic effects of the repeat loop. We first use one of flowR's linkers to
|
|
421
|
-
${
|
|
420
|
+
${ctx.link(linker_1.linkCircularRedefinitionsWithinALoop.name)} and then retrieve the active exit points with ${ctx.link(info_1.filterOutLoopExitPoints.name)}.
|
|
422
421
|
|
|
423
422
|
Feel free to have a look around and explore the other handlers for now. Each of them uses the results of its children alongside the active backpack
|
|
424
423
|
to produce a new dataflow information.
|
|
@@ -427,48 +426,38 @@ to produce a new dataflow information.
|
|
|
427
426
|
|
|
428
427
|
Given the [dataflow graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph), you can do a lot more!
|
|
429
428
|
You can issue [queries](${doc_files_1.FlowrWikiBaseRef}/Query-API) to explore the graph, [search](${doc_files_1.FlowrWikiBaseRef}/Search-API) for specific elements, or, for example, request a [static backward slice](#static-backward-slicing).
|
|
430
|
-
Of course, all of these endeavors work not just with the ${
|
|
429
|
+
Of course, all of these endeavors work not just with the ${ctx.link(shell_1.RShell.name)} but also with the [\`tree-sitter\` engine](${doc_files_1.FlowrWikiBaseRef}/Engines).
|
|
431
430
|
|
|
432
431
|
### Static Backward Slicing
|
|
433
432
|
|
|
434
|
-
The slicing is available as an extra step as you can see by inspecting he ${
|
|
435
|
-
Besides ${
|
|
433
|
+
The slicing is available as an extra step as you can see by inspecting he ${ctx.link('DEFAULT_SLICING_PIPELINE')}.
|
|
434
|
+
Besides ${ctx.link('STATIC_SLICE')} it contains a ${ctx.link('NAIVE_RECONSTRUCT')} to print the slice as (executable) R code.
|
|
436
435
|
|
|
437
|
-
Your main point of interesting here is the ${
|
|
436
|
+
Your main point of interesting here is the ${ctx.link(static_slicer_1.staticSlice.name)} function which relies on a modified
|
|
438
437
|
breadth-first search to collect all nodes which are part of the slice.
|
|
439
438
|
For more information on how the slicing works, please refer to the [tool demonstration (Section 3.2)](https://doi.org/10.1145/3691620.3695359),
|
|
440
439
|
or the [original master's thesis (Chapter 4)](https://doi.org/10.18725/OPARU-50107).
|
|
441
440
|
|
|
442
441
|
You can explore the slicing using the REPL with the ${(0, doc_cli_option_1.getReplCommand)('slicer')} command:
|
|
443
442
|
|
|
444
|
-
${await (0, doc_repl_1.documentReplSession)(
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
443
|
+
${await (0, doc_repl_1.documentReplSession)(treeSitter, [{
|
|
444
|
+
command: ':query @static-slice (12@product) file://test/testfiles/example.R',
|
|
445
|
+
description: 'Slice for the example file for the variable "prod" in line 12.'
|
|
446
|
+
}], { openOutput: true })}
|
|
448
447
|
|
|
449
448
|
## Helpful Things
|
|
450
449
|
|
|
451
450
|
### Getting flowR to Talk
|
|
452
451
|
|
|
453
452
|
When using flowR from the CLI, you can use the ${(0, doc_cli_option_1.getCliLongOptionOf)('flowr', 'verbose')} option to get more information about what flowR is doing.
|
|
454
|
-
While coding, however, you can use the ${
|
|
455
|
-
In general, you can configure the levels of individual logs, such as the general \`log\` (obtained with ${
|
|
453
|
+
While coding, however, you can use the ${ctx.link(log_1.setMinLevelOfAllLogs)} function to set the minimum level of logs to be displayed (this works with the ${ctx.link(log_2.FlowrLogger)} abstraction).
|
|
454
|
+
In general, you can configure the levels of individual logs, such as the general \`log\` (obtained with ${ctx.link('getActiveLog')}) or the ${ctx.link('parseLog')}.
|
|
456
455
|
Please note that flowR makes no guarantees that log outputs are persistent across versions, and it is up to the implementors to provide sensible logging.
|
|
457
456
|
If you are an implementor and want to add logging, please make sure there are no larger runtime impliciations when logging is disabled.
|
|
458
|
-
Have a look at the ${
|
|
457
|
+
Have a look at the ${ctx.link(log_2.expensiveTrace)} function for example, which uses a function to generate the log message only when the log level is reached.
|
|
459
458
|
|
|
460
459
|
`;
|
|
460
|
+
}
|
|
461
461
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
void tree_sitter_executor_1.TreeSitterExecutor.initTreeSitter().then(() => {
|
|
465
|
-
(0, log_1.setMinLevelOfAllLogs)(6 /* LogLevel.Fatal */);
|
|
466
|
-
const shell = new shell_1.RShell();
|
|
467
|
-
void getText(shell).then(str => {
|
|
468
|
-
console.log(str);
|
|
469
|
-
}).finally(() => {
|
|
470
|
-
shell.close();
|
|
471
|
-
});
|
|
472
|
-
});
|
|
473
|
-
}
|
|
474
|
-
//# sourceMappingURL=print-core-wiki.js.map
|
|
462
|
+
exports.WikiCore = WikiCore;
|
|
463
|
+
//# sourceMappingURL=wiki-core.js.map
|