@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
|
@@ -26,11 +26,7 @@ export interface FunctionsToDetectConfig extends MergeableRecord {
|
|
|
26
26
|
*/
|
|
27
27
|
export declare const functionFinderUtil: {
|
|
28
28
|
createSearch: (functions: readonly string[]) => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "filter"], ParentInformation, Promise<FlowrSearchElements<ParentInformation, [] | FlowrSearchElement<ParentInformation>[]>>>;
|
|
29
|
-
processSearchResult: <T extends FlowrSearchElement<ParentInformation>[]>(elements: FlowrSearchElements<ParentInformation, T>, _config:
|
|
30
|
-
normalize: NormalizedAst;
|
|
31
|
-
dataflow: DataflowInformation;
|
|
32
|
-
config: FlowrConfigOptions;
|
|
33
|
-
}, refineSearch?: (elements: T) => T) => {
|
|
29
|
+
processSearchResult: <T extends FlowrSearchElement<ParentInformation>[]>(elements: FlowrSearchElements<ParentInformation, T>, _config: unknown, _data: unknown, refineSearch?: (elements: T) => T) => {
|
|
34
30
|
results: {
|
|
35
31
|
certainty: LintingResultCertainty;
|
|
36
32
|
function: Identifier;
|
|
@@ -57,7 +57,7 @@ export declare const NAMING_CONVENTION: {
|
|
|
57
57
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
58
58
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
59
59
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
60
|
-
|
|
60
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
61
61
|
}) => {
|
|
62
62
|
results: {
|
|
63
63
|
quickFix: LintQuickFixReplacement[] | undefined;
|
|
@@ -78,7 +78,7 @@ export declare const NAMING_CONVENTION: {
|
|
|
78
78
|
readonly info: {
|
|
79
79
|
readonly name: "Naming Convention";
|
|
80
80
|
readonly certainty: LintingRuleCertainty.OverApproximative;
|
|
81
|
-
readonly description: "Checks
|
|
81
|
+
readonly description: "Checks whether the symbols conform to a certain naming convention";
|
|
82
82
|
readonly tags: readonly [LintingRuleTag.Style, LintingRuleTag.QuickFix];
|
|
83
83
|
readonly defaultConfig: {
|
|
84
84
|
readonly caseing: "auto";
|
|
@@ -187,7 +187,7 @@ exports.NAMING_CONVENTION = {
|
|
|
187
187
|
name: 'Naming Convention',
|
|
188
188
|
// detects casing heuristically so correctness is not ensured using default config, but checks all identifiers in the code for naming convention match
|
|
189
189
|
certainty: linter_format_1.LintingRuleCertainty.OverApproximative,
|
|
190
|
-
description: 'Checks
|
|
190
|
+
description: 'Checks whether the symbols conform to a certain naming convention',
|
|
191
191
|
tags: [linter_tags_1.LintingRuleTag.Style, linter_tags_1.LintingRuleTag.QuickFix],
|
|
192
192
|
defaultConfig: {
|
|
193
193
|
caseing: 'auto',
|
|
@@ -14,7 +14,7 @@ export declare const NETWORK_FUNCTIONS: {
|
|
|
14
14
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
15
15
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
16
16
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
17
|
-
|
|
17
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
18
18
|
}) => {
|
|
19
19
|
results: {
|
|
20
20
|
certainty: import("../linter-format").LintingResultCertainty;
|
|
@@ -7,7 +7,7 @@ const linter_tags_1 = require("../linter-tags");
|
|
|
7
7
|
const read_functions_1 = require("../../queries/catalog/dependencies-query/function-info/read-functions");
|
|
8
8
|
exports.NETWORK_FUNCTIONS = {
|
|
9
9
|
createSearch: (config) => function_finder_util_1.functionFinderUtil.createSearch(config.fns),
|
|
10
|
-
processSearchResult: (e, c, d) => function_finder_util_1.functionFinderUtil.processSearchResult(e, c, d, es => es.filter(e => function_finder_util_1.functionFinderUtil.requireArgumentValue(e, read_functions_1.ReadFunctions, d, c.onlyTriggerWithArgument))),
|
|
10
|
+
processSearchResult: (e, c, d) => function_finder_util_1.functionFinderUtil.processSearchResult(e, c, d, es => es.filter(e => function_finder_util_1.functionFinderUtil.requireArgumentValue(e, read_functions_1.ReadFunctions, { config: d.analyzer.flowrConfig, dataflow: d.dataflow, normalize: d.normalize }, c.onlyTriggerWithArgument))),
|
|
11
11
|
prettyPrint: function_finder_util_1.functionFinderUtil.prettyPrint('network operations'),
|
|
12
12
|
info: {
|
|
13
13
|
name: 'Network Functions',
|
|
@@ -27,6 +27,7 @@ export interface SeededRandomnessMeta extends MergeableRecord {
|
|
|
27
27
|
callsWithFunctionProducers: number;
|
|
28
28
|
callsWithAssignmentProducers: number;
|
|
29
29
|
callsWithNonConstantProducers: number;
|
|
30
|
+
callsWithOtherBranchProducers: number;
|
|
30
31
|
}
|
|
31
32
|
export declare const SEEDED_RANDOMNESS: {
|
|
32
33
|
readonly createSearch: (config: SeededRandomnessConfig) => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "filter", "with"], import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, Promise<import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>>;
|
|
@@ -34,10 +35,10 @@ export declare const SEEDED_RANDOMNESS: {
|
|
|
34
35
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
35
36
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
36
37
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
37
|
-
|
|
38
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
38
39
|
}) => {
|
|
39
40
|
results: {
|
|
40
|
-
certainty: LintingResultCertainty
|
|
41
|
+
certainty: LintingResultCertainty;
|
|
41
42
|
function: Identifier;
|
|
42
43
|
range: SourceRange;
|
|
43
44
|
}[];
|
|
@@ -16,6 +16,7 @@ const general_1 = require("../../dataflow/eval/values/general");
|
|
|
16
16
|
const config_1 = require("../../config");
|
|
17
17
|
const r_function_call_1 = require("../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
|
|
18
18
|
const r_value_1 = require("../../dataflow/eval/values/r-value");
|
|
19
|
+
const info_1 = require("../../dataflow/info");
|
|
19
20
|
exports.SEEDED_RANDOMNESS = {
|
|
20
21
|
createSearch: (config) => flowr_search_builder_1.Q.all()
|
|
21
22
|
.with(search_enrichers_1.Enrichment.CallTargets, { onlyBuiltin: true })
|
|
@@ -37,7 +38,8 @@ exports.SEEDED_RANDOMNESS = {
|
|
|
37
38
|
consumerCalls: 0,
|
|
38
39
|
callsWithFunctionProducers: 0,
|
|
39
40
|
callsWithAssignmentProducers: 0,
|
|
40
|
-
callsWithNonConstantProducers: 0
|
|
41
|
+
callsWithNonConstantProducers: 0,
|
|
42
|
+
callsWithOtherBranchProducers: 0
|
|
41
43
|
};
|
|
42
44
|
return {
|
|
43
45
|
results: elements.getElements()
|
|
@@ -51,16 +53,25 @@ exports.SEEDED_RANDOMNESS = {
|
|
|
51
53
|
};
|
|
52
54
|
}))
|
|
53
55
|
// filter by calls that aren't preceded by a randomness producer
|
|
54
|
-
.
|
|
56
|
+
.flatMap(element => {
|
|
57
|
+
const dfgElement = dataflow.graph.getVertex(element.searchElement.node.info.id);
|
|
58
|
+
const cds = dfgElement ? new Set(dfgElement.cds) : new Set();
|
|
55
59
|
const producers = (0, search_enrichers_1.enrichmentContent)(element.searchElement, search_enrichers_1.Enrichment.LastCall).linkedIds
|
|
56
60
|
.map(e => dataflow.graph.getVertex(e.node.info.id));
|
|
57
61
|
const { assignment, func } = Object.groupBy(producers, f => assignmentArgIndexes.has(f.name) ? 'assignment' : 'func');
|
|
58
62
|
let nonConstant = false;
|
|
63
|
+
let otherBranch = false;
|
|
59
64
|
// function calls are already taken care of through the LastCall enrichment itself
|
|
60
65
|
for (const f of func ?? []) {
|
|
61
66
|
if (isConstantArgument(dataflow.graph, f, 0)) {
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
const fCds = new Set(f.cds).difference(cds);
|
|
68
|
+
if (fCds.size <= 0 || (0, info_1.happensInEveryBranchSet)(fCds)) {
|
|
69
|
+
metadata.callsWithFunctionProducers++;
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
otherBranch = true;
|
|
74
|
+
}
|
|
64
75
|
}
|
|
65
76
|
else {
|
|
66
77
|
nonConstant = true;
|
|
@@ -71,9 +82,16 @@ exports.SEEDED_RANDOMNESS = {
|
|
|
71
82
|
const argIdx = assignmentArgIndexes.get(a.name);
|
|
72
83
|
const dest = (0, graph_1.getReferenceOfArgument)(a.args[argIdx]);
|
|
73
84
|
if (dest !== undefined && assignmentProducers.has((0, node_id_1.recoverName)(dest, dataflow.graph.idMap))) {
|
|
85
|
+
// we either have arg index 0 or 1 for the assignmentProducers destination, so we select the assignment value as 1-argIdx here
|
|
74
86
|
if (isConstantArgument(dataflow.graph, a, 1 - argIdx)) {
|
|
75
|
-
|
|
76
|
-
|
|
87
|
+
const aCds = new Set(a.cds).difference(cds);
|
|
88
|
+
if (aCds.size <= 0 || (0, info_1.happensInEveryBranchSet)(aCds)) {
|
|
89
|
+
metadata.callsWithAssignmentProducers++;
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
otherBranch = true;
|
|
94
|
+
}
|
|
77
95
|
}
|
|
78
96
|
else {
|
|
79
97
|
nonConstant = true;
|
|
@@ -83,13 +101,15 @@ exports.SEEDED_RANDOMNESS = {
|
|
|
83
101
|
if (nonConstant) {
|
|
84
102
|
metadata.callsWithNonConstantProducers++;
|
|
85
103
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
104
|
+
if (otherBranch) {
|
|
105
|
+
metadata.callsWithOtherBranchProducers++;
|
|
106
|
+
}
|
|
107
|
+
return [{
|
|
108
|
+
certainty: otherBranch ? linter_format_1.LintingResultCertainty.Uncertain : linter_format_1.LintingResultCertainty.Certain,
|
|
109
|
+
function: element.target,
|
|
110
|
+
range: element.range
|
|
111
|
+
}];
|
|
112
|
+
}),
|
|
93
113
|
'.meta': metadata
|
|
94
114
|
};
|
|
95
115
|
},
|
|
@@ -22,7 +22,7 @@ export declare const UNUSED_DEFINITION: {
|
|
|
22
22
|
normalize: NormalizedAst;
|
|
23
23
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
24
24
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
25
|
-
|
|
25
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
26
26
|
}) => {
|
|
27
27
|
results: UnusedDefinitionResult[];
|
|
28
28
|
".meta": UnusedDefinitionMetadata;
|
|
@@ -16,11 +16,11 @@ export interface UselessLoopMetadata extends MergeableRecord {
|
|
|
16
16
|
}
|
|
17
17
|
export declare const USELESS_LOOP: {
|
|
18
18
|
readonly createSearch: () => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["filter"], import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, Promise<import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>>;
|
|
19
|
-
readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, useLessLoopConfig: UselessLoopConfig, {
|
|
19
|
+
readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, useLessLoopConfig: UselessLoopConfig, { analyzer, dataflow, normalize, cfg }: {
|
|
20
20
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
21
21
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
22
22
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
23
|
-
|
|
23
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
24
24
|
}) => {
|
|
25
25
|
results: {
|
|
26
26
|
certainty: LintingResultCertainty.Certain;
|
|
@@ -9,14 +9,14 @@ const linter_format_1 = require("../linter-format");
|
|
|
9
9
|
const linter_tags_1 = require("../linter-tags");
|
|
10
10
|
exports.USELESS_LOOP = {
|
|
11
11
|
createSearch: () => flowr_search_builder_1.Q.all().filter(vertex_1.VertexType.FunctionCall),
|
|
12
|
-
processSearchResult: (elements, useLessLoopConfig, {
|
|
12
|
+
processSearchResult: (elements, useLessLoopConfig, { analyzer, dataflow, normalize, cfg }) => {
|
|
13
13
|
const results = elements.getElements().filter(e => {
|
|
14
14
|
const vertex = dataflow.graph.getVertex(e.node.info.id);
|
|
15
15
|
return vertex
|
|
16
16
|
&& (0, vertex_1.isFunctionCallVertex)(vertex)
|
|
17
17
|
&& vertex.origin !== 'unnamed'
|
|
18
18
|
&& useLessLoopConfig.loopyFunctions.has(vertex.origin[0]);
|
|
19
|
-
}).filter(loop => (0, useless_loop_1.onlyLoopsOnce)(loop.node.info.id, dataflow.graph, cfg, normalize,
|
|
19
|
+
}).filter(loop => (0, useless_loop_1.onlyLoopsOnce)(loop.node.info.id, dataflow.graph, cfg, normalize, analyzer.inspectContext())).map(res => ({
|
|
20
20
|
certainty: linter_format_1.LintingResultCertainty.Certain,
|
|
21
21
|
name: res.node.lexeme,
|
|
22
22
|
range: res.node.info.fullRange
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eagleoutice/flowr",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.3",
|
|
4
4
|
"description": "Static Dataflow Analyzer and Program Slicer for the R Programming Language",
|
|
5
5
|
"types": "dist/src/index.d.ts",
|
|
6
6
|
"repository": {
|
|
@@ -25,22 +25,10 @@
|
|
|
25
25
|
"benchmark": "npm run build-dev && node dist/src/cli/benchmark-app.js",
|
|
26
26
|
"summarizer": "ts-node src/cli/summarizer-app.ts",
|
|
27
27
|
"export-quads": "ts-node src/cli/export-quads-app.ts",
|
|
28
|
-
"capabilities-markdown": "ts-node src/documentation/
|
|
29
|
-
"wiki
|
|
30
|
-
"wiki:
|
|
31
|
-
"wiki:
|
|
32
|
-
"wiki:core": "ts-node src/documentation/print-core-wiki.ts",
|
|
33
|
-
"wiki:analyzer": "ts-node src/documentation/print-analyzer-wiki.ts",
|
|
34
|
-
"wiki:engines": "ts-node src/documentation/print-engines-wiki.ts",
|
|
35
|
-
"wiki:search-api": "ts-node src/documentation/print-search-wiki.ts",
|
|
36
|
-
"wiki:linting-and-testing": "ts-node src/documentation/print-linting-and-testing-wiki.ts",
|
|
37
|
-
"wiki:interface": "ts-node src/documentation/print-interface-wiki.ts",
|
|
38
|
-
"wiki:onboarding": "ts-node src/documentation/print-onboarding-wiki.ts",
|
|
39
|
-
"wiki:faq": "ts-node src/documentation/print-faq-wiki.ts",
|
|
40
|
-
"wiki:cfg": "ts-node src/documentation/print-cfg-wiki.ts",
|
|
41
|
-
"wiki:linter": "ts-node src/documentation/print-linter-wiki.ts",
|
|
42
|
-
"gen:readme": "ts-node src/documentation/print-readme.ts",
|
|
43
|
-
"gen:linter-issue": "ts-node src/documentation/print-linter-issue.ts",
|
|
28
|
+
"capabilities-markdown": "ts-node src/documentation/doc-capabilities.ts",
|
|
29
|
+
"wiki": "ts-node src/cli/wiki.ts",
|
|
30
|
+
"wiki:watch": "ts-node-dev src/cli/wiki.ts -- --keep-alive",
|
|
31
|
+
"wiki:linter": "ts-node src/documentation/wiki-linter.ts",
|
|
44
32
|
"build": "tsc --project .",
|
|
45
33
|
"build-dev": "npm run build && npm run build:copy-wasm",
|
|
46
34
|
"build:bundle-flowr": "npm run build && esbuild --bundle dist/src/cli/flowr.js --platform=node --tree-shaking=true --bundle --minify --external:clipboardy --target=node22 --outfile=dist/src/cli/flowr.min.js && npm run build:copy-wasm",
|
|
@@ -210,6 +198,7 @@
|
|
|
210
198
|
},
|
|
211
199
|
"dependencies": {
|
|
212
200
|
"@eagleoutice/tree-sitter-r": "^1.1.2",
|
|
201
|
+
"@jupyterlab/nbformat": "^4.5.0",
|
|
213
202
|
"@xmldom/xmldom": "^0.9.7",
|
|
214
203
|
"clipboardy": "^4.0.0",
|
|
215
204
|
"command-line-args": "^6.0.1",
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import type { KnownParser } from '../../r-bridge/parser';
|
|
2
2
|
import { type CacheInvalidationEvent, FlowrCache } from './flowr-cache';
|
|
3
3
|
import { type DEFAULT_DATAFLOW_PIPELINE, type TREE_SITTER_DATAFLOW_PIPELINE } from '../../core/steps/pipeline/default-pipelines';
|
|
4
|
-
import type { FlowrConfigOptions } from '../../config';
|
|
5
|
-
import type { RParseRequests } from '../../r-bridge/retriever';
|
|
6
4
|
import type { IdGenerator } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
7
5
|
import type { NoInfo } from '../../r-bridge/lang-4.x/ast/model/model';
|
|
8
6
|
import type { TreeSitterExecutor } from '../../r-bridge/lang-4.x/tree-sitter/tree-sitter-executor';
|
|
9
7
|
import type { PipelineOutput } from '../../core/steps/pipeline/pipeline';
|
|
10
8
|
import type { CfgSimplificationPassName } from '../../control-flow/cfg-simplification';
|
|
11
9
|
import type { ControlFlowInformation } from '../../control-flow/control-flow-graph';
|
|
12
|
-
import { CfgKind } from '../cfg-kind';
|
|
10
|
+
import type { CfgKind } from '../cfg-kind';
|
|
11
|
+
import type { FlowrAnalyzerContext } from '../context/flowr-analyzer-context';
|
|
13
12
|
interface FlowrAnalyzerCacheOptions<Parser extends KnownParser> {
|
|
14
13
|
parser: Parser;
|
|
15
|
-
|
|
16
|
-
request: RParseRequests;
|
|
14
|
+
context: FlowrAnalyzerContext;
|
|
17
15
|
getId?: IdGenerator<NoInfo>;
|
|
18
|
-
overwriteFilePath?: string;
|
|
19
16
|
}
|
|
20
17
|
export type AnalyzerCacheType<Parser extends KnownParser> = Parser extends TreeSitterExecutor ? Partial<PipelineOutput<typeof TREE_SITTER_DATAFLOW_PIPELINE>> : Partial<PipelineOutput<typeof DEFAULT_DATAFLOW_PIPELINE>>;
|
|
21
18
|
/**
|
|
@@ -71,14 +68,14 @@ export declare class FlowrAnalyzerCache<Parser extends KnownParser> extends Flow
|
|
|
71
68
|
peekDataflow(): NonNullable<AnalyzerCacheType<Parser>['dataflow']> | undefined;
|
|
72
69
|
/**
|
|
73
70
|
* Get the control flow graph (CFG) for the request, computing if necessary.
|
|
74
|
-
* @param force
|
|
75
|
-
* @param kind
|
|
71
|
+
* @param force - Do not use the cache, instead force new analyses.
|
|
72
|
+
* @param kind - The kind of CFG that is requested.
|
|
76
73
|
* @param simplifications - Simplification passes to be applied to the CFG.
|
|
77
74
|
*/
|
|
78
|
-
controlflow(force: boolean | undefined, kind: CfgKind, simplifications
|
|
75
|
+
controlflow(force: boolean | undefined, kind: CfgKind, simplifications?: readonly CfgSimplificationPassName[]): Promise<ControlFlowInformation>;
|
|
79
76
|
/**
|
|
80
77
|
* Get the control flow graph (CFG) for the request if already available, otherwise return `undefined`.
|
|
81
|
-
* @param kind
|
|
78
|
+
* @param kind - The kind of CFG that is requested.
|
|
82
79
|
* @param simplifications - Simplification passes to be applied to the CFG.
|
|
83
80
|
* @see {@link FlowrAnalyzerCache#controlflow} - to get the control flow graph, computing if necessary.
|
|
84
81
|
*/
|
|
@@ -4,9 +4,7 @@ exports.FlowrAnalyzerCache = void 0;
|
|
|
4
4
|
const flowr_cache_1 = require("./flowr-cache");
|
|
5
5
|
const default_pipelines_1 = require("../../core/steps/pipeline/default-pipelines");
|
|
6
6
|
const assert_1 = require("../../util/assert");
|
|
7
|
-
const
|
|
8
|
-
const extract_cfg_1 = require("../../control-flow/extract-cfg");
|
|
9
|
-
const cfg_kind_1 = require("../cfg-kind");
|
|
7
|
+
const flowr_analyzer_controlflow_cache_1 = require("./flowr-analyzer-controlflow-cache");
|
|
10
8
|
/**
|
|
11
9
|
* This provides the full analyzer caching layer, please avoid using this directly
|
|
12
10
|
* and prefer the {@link FlowrAnalyzer}.
|
|
@@ -22,13 +20,10 @@ class FlowrAnalyzerCache extends flowr_cache_1.FlowrCache {
|
|
|
22
20
|
}
|
|
23
21
|
initCacheProviders() {
|
|
24
22
|
this.pipeline = (0, default_pipelines_1.createDataflowPipeline)(this.args.parser, {
|
|
25
|
-
|
|
26
|
-
getId: this.args.getId
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
this.controlFlowCache = {
|
|
30
|
-
simplified: new objectmap_1.ObjectMap(),
|
|
31
|
-
};
|
|
23
|
+
context: this.args.context,
|
|
24
|
+
getId: this.args.getId
|
|
25
|
+
});
|
|
26
|
+
this.controlFlowCache = new flowr_analyzer_controlflow_cache_1.FlowrAnalyzerControlFlowCache();
|
|
32
27
|
}
|
|
33
28
|
static create(data) {
|
|
34
29
|
return new FlowrAnalyzerCache(data);
|
|
@@ -51,7 +46,7 @@ class FlowrAnalyzerCache extends flowr_cache_1.FlowrCache {
|
|
|
51
46
|
this.receive({ type: "full" /* CacheInvalidationEventType.Full */ });
|
|
52
47
|
}
|
|
53
48
|
async runTapeUntil(force, until) {
|
|
54
|
-
(0, assert_1.guard)(this.args.
|
|
49
|
+
(0, assert_1.guard)(this.args.context.files.loadingOrder.getUnorderedRequests().length > 0, 'At least one request must be set to run the analysis pipeline');
|
|
55
50
|
if (force) {
|
|
56
51
|
this.reset();
|
|
57
52
|
}
|
|
@@ -115,43 +110,27 @@ class FlowrAnalyzerCache extends flowr_cache_1.FlowrCache {
|
|
|
115
110
|
}
|
|
116
111
|
/**
|
|
117
112
|
* Get the control flow graph (CFG) for the request, computing if necessary.
|
|
118
|
-
* @param force
|
|
119
|
-
* @param kind
|
|
113
|
+
* @param force - Do not use the cache, instead force new analyses.
|
|
114
|
+
* @param kind - The kind of CFG that is requested.
|
|
120
115
|
* @param simplifications - Simplification passes to be applied to the CFG.
|
|
121
116
|
*/
|
|
122
117
|
async controlflow(force, kind, simplifications) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
const normalized = await this.normalize(force);
|
|
132
|
-
let result;
|
|
133
|
-
switch (kind) {
|
|
134
|
-
case cfg_kind_1.CfgKind.WithDataflow:
|
|
135
|
-
result = (0, extract_cfg_1.extractCfg)(normalized, this.args.config, (await this.dataflow()).graph, simplifications);
|
|
136
|
-
break;
|
|
137
|
-
case cfg_kind_1.CfgKind.NoDataflow:
|
|
138
|
-
result = (0, extract_cfg_1.extractCfg)(normalized, this.args.config, undefined, simplifications);
|
|
139
|
-
break;
|
|
140
|
-
case cfg_kind_1.CfgKind.Quick:
|
|
141
|
-
result = this.peekDataflow()?.cfgQuick ?? (0, extract_cfg_1.extractCfgQuick)(normalized);
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
this.controlFlowCache.simplified.set([simplifications, kind], result);
|
|
145
|
-
return result;
|
|
118
|
+
const cfgInfo = {
|
|
119
|
+
ctx: this.args.context,
|
|
120
|
+
cfgQuick: this.peekDataflow()?.cfgQuick,
|
|
121
|
+
ast: async () => await this.normalize(),
|
|
122
|
+
dfg: async () => await this.dataflow()
|
|
123
|
+
};
|
|
124
|
+
return this.controlFlowCache.get(force, kind, cfgInfo, simplifications);
|
|
146
125
|
}
|
|
147
126
|
/**
|
|
148
127
|
* Get the control flow graph (CFG) for the request if already available, otherwise return `undefined`.
|
|
149
|
-
* @param kind
|
|
128
|
+
* @param kind - The kind of CFG that is requested.
|
|
150
129
|
* @param simplifications - Simplification passes to be applied to the CFG.
|
|
151
130
|
* @see {@link FlowrAnalyzerCache#controlflow} - to get the control flow graph, computing if necessary.
|
|
152
131
|
*/
|
|
153
132
|
peekControlflow(kind, simplifications) {
|
|
154
|
-
return this.controlFlowCache.
|
|
133
|
+
return this.controlFlowCache.peek(kind, simplifications);
|
|
155
134
|
}
|
|
156
135
|
}
|
|
157
136
|
exports.FlowrAnalyzerCache = FlowrAnalyzerCache;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { CfgSimplificationPassName } from '../../control-flow/cfg-simplification';
|
|
2
|
+
import { CfgKind } from '../cfg-kind';
|
|
3
|
+
import type { ControlFlowInformation } from '../../control-flow/control-flow-graph';
|
|
4
|
+
import type { NormalizedAst } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
5
|
+
import type { DataflowInformation } from '../../dataflow/info';
|
|
6
|
+
import type { FlowrAnalyzerContext } from '../context/flowr-analyzer-context';
|
|
7
|
+
interface CfgInfo {
|
|
8
|
+
ctx: FlowrAnalyzerContext;
|
|
9
|
+
cfgQuick: ControlFlowInformation | undefined;
|
|
10
|
+
dfg: () => Promise<DataflowInformation>;
|
|
11
|
+
ast: () => Promise<NormalizedAst>;
|
|
12
|
+
}
|
|
13
|
+
export declare class FlowrAnalyzerControlFlowCache {
|
|
14
|
+
private readonly cache;
|
|
15
|
+
peek(kind: CfgKind, simplifications: readonly CfgSimplificationPassName[] | undefined): ControlFlowInformation | undefined;
|
|
16
|
+
get(force: boolean | undefined, kind: CfgKind, cfgCacheInfo: CfgInfo, simplifications?: readonly CfgSimplificationPassName[]): Promise<ControlFlowInformation>;
|
|
17
|
+
/**
|
|
18
|
+
* Create and cache the base CFG without simplifications.
|
|
19
|
+
*/
|
|
20
|
+
private createAndCacheBaseCfg;
|
|
21
|
+
/**
|
|
22
|
+
* Try to get a cached CFG with some of the requested simplifications already applied.
|
|
23
|
+
* Matches the longest prefix of simplifications available.
|
|
24
|
+
* @returns The cached CFG and the missing simplifications to be applied, or `undefined` if no cached CFG is available.
|
|
25
|
+
*/
|
|
26
|
+
private tryGetCachedCfg;
|
|
27
|
+
/**
|
|
28
|
+
* Normalize the order of simplification passes.
|
|
29
|
+
* Is currently an identity function, but may be extended in the future to enforce a specific order using heuristics.
|
|
30
|
+
* @param simplifications - the requested simplification passes.
|
|
31
|
+
*/
|
|
32
|
+
private normalizeSimplificationOrder;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlowrAnalyzerControlFlowCache = void 0;
|
|
4
|
+
const objectmap_1 = require("../../util/collections/objectmap");
|
|
5
|
+
const cfg_simplification_1 = require("../../control-flow/cfg-simplification");
|
|
6
|
+
const cfg_kind_1 = require("../cfg-kind");
|
|
7
|
+
const assert_1 = require("../../util/assert");
|
|
8
|
+
const extract_cfg_1 = require("../../control-flow/extract-cfg");
|
|
9
|
+
class FlowrAnalyzerControlFlowCache {
|
|
10
|
+
cache = new objectmap_1.ObjectMap();
|
|
11
|
+
peek(kind, simplifications) {
|
|
12
|
+
return this.cache.get([simplifications ?? [], kind]);
|
|
13
|
+
}
|
|
14
|
+
async get(force, kind, cfgCacheInfo, simplifications) {
|
|
15
|
+
(0, assert_1.guard)(kind === cfg_kind_1.CfgKind.Quick ? simplifications === undefined : true, 'Cannot apply simplifications to quick CFG');
|
|
16
|
+
simplifications ??= [];
|
|
17
|
+
const orderedSimplifications = this.normalizeSimplificationOrder(simplifications);
|
|
18
|
+
const cached = force ?
|
|
19
|
+
{ cfg: undefined, missingSimplifications: orderedSimplifications }
|
|
20
|
+
: this.tryGetCachedCfg(orderedSimplifications, kind);
|
|
21
|
+
let cfg = cached.cfg;
|
|
22
|
+
if (!cfg) {
|
|
23
|
+
cfg = await this.createAndCacheBaseCfg(kind, cfgCacheInfo);
|
|
24
|
+
}
|
|
25
|
+
if (cached.missingSimplifications.length > 0) {
|
|
26
|
+
const cfgPassInfo = { dfg: (await cfgCacheInfo.dfg()).graph, ctx: cfgCacheInfo.ctx, ast: await cfgCacheInfo.ast() };
|
|
27
|
+
cfg = (0, cfg_simplification_1.simplifyControlFlowInformation)(cfg, cfgPassInfo, cached.missingSimplifications);
|
|
28
|
+
}
|
|
29
|
+
this.cache.set([orderedSimplifications, kind], cfg);
|
|
30
|
+
return cfg;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create and cache the base CFG without simplifications.
|
|
34
|
+
*/
|
|
35
|
+
async createAndCacheBaseCfg(kind, { cfgQuick, dfg, ctx, ast }) {
|
|
36
|
+
let result;
|
|
37
|
+
switch (kind) {
|
|
38
|
+
case cfg_kind_1.CfgKind.WithDataflow:
|
|
39
|
+
result = (0, extract_cfg_1.extractCfg)(await ast(), ctx, (await dfg()).graph);
|
|
40
|
+
break;
|
|
41
|
+
case cfg_kind_1.CfgKind.NoDataflow:
|
|
42
|
+
result = (0, extract_cfg_1.extractCfg)(await ast(), ctx);
|
|
43
|
+
break;
|
|
44
|
+
case cfg_kind_1.CfgKind.Quick:
|
|
45
|
+
result = cfgQuick ?? (0, extract_cfg_1.extractCfgQuick)(await ast());
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
this.cache.set([[], kind], result);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Try to get a cached CFG with some of the requested simplifications already applied.
|
|
53
|
+
* Matches the longest prefix of simplifications available.
|
|
54
|
+
* @returns The cached CFG and the missing simplifications to be applied, or `undefined` if no cached CFG is available.
|
|
55
|
+
*/
|
|
56
|
+
tryGetCachedCfg(simplifications, kind) {
|
|
57
|
+
for (let prefixLen = simplifications.length; prefixLen >= 0; prefixLen--) {
|
|
58
|
+
const prefix = simplifications.slice(0, prefixLen);
|
|
59
|
+
const cached = this.cache.get([prefix, kind]);
|
|
60
|
+
if (cached !== undefined) {
|
|
61
|
+
return {
|
|
62
|
+
cfg: cached,
|
|
63
|
+
missingSimplifications: simplifications.slice(prefixLen)
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { cfg: undefined, missingSimplifications: simplifications };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Normalize the order of simplification passes.
|
|
71
|
+
* Is currently an identity function, but may be extended in the future to enforce a specific order using heuristics.
|
|
72
|
+
* @param simplifications - the requested simplification passes.
|
|
73
|
+
*/
|
|
74
|
+
normalizeSimplificationOrder(simplifications) {
|
|
75
|
+
return simplifications;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.FlowrAnalyzerControlFlowCache = FlowrAnalyzerControlFlowCache;
|
|
79
|
+
//# sourceMappingURL=flowr-analyzer-controlflow-cache.js.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { type RAnalysisRequest, type ReadOnlyFlowrAnalyzerFilesContext
|
|
2
|
-
import { type ReadOnlyFlowrAnalyzerDependenciesContext
|
|
1
|
+
import { FlowrAnalyzerFilesContext, type RAnalysisRequest, type ReadOnlyFlowrAnalyzerFilesContext } from './flowr-analyzer-files-context';
|
|
2
|
+
import { FlowrAnalyzerDependenciesContext, type ReadOnlyFlowrAnalyzerDependenciesContext } from './flowr-analyzer-dependencies-context';
|
|
3
3
|
import { type FlowrAnalyzerPlugin, PluginType } from '../plugins/flowr-analyzer-plugin';
|
|
4
|
+
import type { fileProtocol, RParseRequestFromFile, RParseRequests } from '../../r-bridge/retriever';
|
|
5
|
+
import type { FlowrConfigOptions } from '../../config';
|
|
6
|
+
import type { FlowrFileProvider } from './flowr-file';
|
|
4
7
|
/**
|
|
5
8
|
* This is a read-only interface to the {@link FlowrAnalyzerContext}.
|
|
6
9
|
* It prevents you from modifying the context, but allows you to inspect it (which is probably what you want when using the {@link FlowrAnalyzer}).
|
|
@@ -15,6 +18,10 @@ export interface ReadOnlyFlowrAnalyzerContext {
|
|
|
15
18
|
* The dependencies context provides access to the identified dependencies and their versions.
|
|
16
19
|
*/
|
|
17
20
|
readonly deps: ReadOnlyFlowrAnalyzerDependenciesContext;
|
|
21
|
+
/**
|
|
22
|
+
* The configuration options used by the analyzer.
|
|
23
|
+
*/
|
|
24
|
+
readonly config: FlowrConfigOptions;
|
|
18
25
|
}
|
|
19
26
|
/**
|
|
20
27
|
* This summarizes the other context layers used by the {@link FlowrAnalyzer}.
|
|
@@ -31,11 +38,12 @@ export interface ReadOnlyFlowrAnalyzerContext {
|
|
|
31
38
|
export declare class FlowrAnalyzerContext implements ReadOnlyFlowrAnalyzerContext {
|
|
32
39
|
readonly files: FlowrAnalyzerFilesContext;
|
|
33
40
|
readonly deps: FlowrAnalyzerDependenciesContext;
|
|
34
|
-
|
|
41
|
+
readonly config: FlowrConfigOptions;
|
|
42
|
+
constructor(config: FlowrConfigOptions, plugins: ReadonlyMap<PluginType, readonly FlowrAnalyzerPlugin[]>);
|
|
35
43
|
/** delegate request addition */
|
|
36
44
|
addRequests(requests: readonly RAnalysisRequest[]): void;
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
addFile(f: string | FlowrFileProvider | RParseRequestFromFile): void;
|
|
46
|
+
addFiles(f: (string | FlowrFileProvider | RParseRequestFromFile)[]): void;
|
|
39
47
|
/** this conducts all the step that can be done before the main analysis run */
|
|
40
48
|
resolvePreAnalysis(): void;
|
|
41
49
|
/**
|
|
@@ -49,3 +57,20 @@ export declare class FlowrAnalyzerContext implements ReadOnlyFlowrAnalyzerContex
|
|
|
49
57
|
*/
|
|
50
58
|
reset(): void;
|
|
51
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Lifting {@link requestFromInput} to create a full {@link FlowrAnalyzerContext} from input requests.
|
|
62
|
+
* Please use this only for a "quick" setup, or to have compatibility with the pre-project flowR era.
|
|
63
|
+
* Otherwise, refer to a {@link FlowrAnalyzerBuilder} to create a fully customized {@link FlowrAnalyzer} instance.
|
|
64
|
+
* @see {@link requestFromInput} - for details on how inputs are processed into requests.
|
|
65
|
+
* @see {@link contextFromSources} - to create a context from source code strings directly.
|
|
66
|
+
*/
|
|
67
|
+
export declare function contextFromInput(input: `${typeof fileProtocol}${string}` | string | readonly string[] | RParseRequests, config?: FlowrConfigOptions, plugins?: FlowrAnalyzerPlugin[]): FlowrAnalyzerContext;
|
|
68
|
+
/**
|
|
69
|
+
* Create a {@link FlowrAnalyzerContext} from a set of source code strings.
|
|
70
|
+
* @param sources - A record mapping file paths to their source code content.
|
|
71
|
+
* @param config - Configuration options for the analyzer.
|
|
72
|
+
* @param plugins - Optional plugins to extend the analyzer's functionality.
|
|
73
|
+
* @see {@link contextFromInput} - to create a context from input requests.
|
|
74
|
+
* @see {@link FlowrInlineTextFile} - to create inline text files for the sources.
|
|
75
|
+
*/
|
|
76
|
+
export declare function contextFromSources(sources: Record<string, string>, config?: FlowrConfigOptions, plugins?: FlowrAnalyzerPlugin[]): FlowrAnalyzerContext;
|