@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
|
@@ -35,7 +35,7 @@ export declare const FILE_PATH_VALIDITY: {
|
|
|
35
35
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
36
36
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
37
37
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
38
|
-
|
|
38
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
39
39
|
}) => {
|
|
40
40
|
results: FilePathValidityResult[];
|
|
41
41
|
".meta": FilePathValidityMetadata;
|
|
@@ -7,7 +7,6 @@ const dfg_1 = require("../../util/mermaid/dfg");
|
|
|
7
7
|
const dependencies_query_format_1 = require("../../queries/catalog/dependencies-query/dependencies-query-format");
|
|
8
8
|
const built_in_source_1 = require("../../dataflow/internal/process/functions/call/built-in/built-in-source");
|
|
9
9
|
const logic_1 = require("../../util/logic");
|
|
10
|
-
const retriever_1 = require("../../r-bridge/retriever");
|
|
11
10
|
const happens_before_1 = require("../../control-flow/happens-before");
|
|
12
11
|
const linter_tags_1 = require("../linter-tags");
|
|
13
12
|
const search_enrichers_1 = require("../../search/search-executor/search-enrichers");
|
|
@@ -50,15 +49,16 @@ exports.FILE_PATH_VALIDITY = {
|
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
// check if any write to the same file happens before the read, and exclude this case if so
|
|
53
|
-
const writesToFile = results.write.filter(r => samePath(r.value, matchingRead.value, data.
|
|
52
|
+
const writesToFile = results.write.filter(r => samePath(r.value, matchingRead.value, data.analyzer.flowrConfig.solver.resolveSource?.ignoreCapitalization));
|
|
54
53
|
const writesBefore = writesToFile.map(w => (0, happens_before_1.happensBefore)(cfg, w.nodeId, element.node.info.id));
|
|
55
54
|
if (writesBefore.some(w => w === logic_1.Ternary.Always)) {
|
|
56
55
|
metadata.totalWritesBeforeAlways++;
|
|
57
56
|
return [];
|
|
58
57
|
}
|
|
59
58
|
// check if the file exists!
|
|
60
|
-
const paths = (0, built_in_source_1.findSource)(data.
|
|
61
|
-
referenceChain: element.node.info.file ? [
|
|
59
|
+
const paths = (0, built_in_source_1.findSource)(data.analyzer.flowrConfig.solver.resolveSource, matchingRead.value, {
|
|
60
|
+
referenceChain: element.node.info.file ? [element.node.info.file] : [],
|
|
61
|
+
ctx: data.analyzer.inspectContext()
|
|
62
62
|
});
|
|
63
63
|
if (paths && paths.length) {
|
|
64
64
|
metadata.totalValid++;
|
|
@@ -5,8 +5,8 @@ import type { FlowrSearchElement, FlowrSearchElements } from '../../search/flowr
|
|
|
5
5
|
import type { NormalizedAst, ParentInformation } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
6
6
|
import type { MergeableRecord } from '../../util/objects';
|
|
7
7
|
import type { DataflowInformation } from '../../dataflow/info';
|
|
8
|
-
import type { FlowrConfigOptions } from '../../config';
|
|
9
8
|
import type { FunctionInfo } from '../../queries/catalog/dependencies-query/function-info/function-info';
|
|
9
|
+
import type { ReadonlyFlowrAnalysisProvider } from '../../project/flowr-analyzer';
|
|
10
10
|
export interface FunctionsResult extends LintingResult {
|
|
11
11
|
function: string;
|
|
12
12
|
range: SourceRange;
|
|
@@ -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;
|
|
@@ -45,6 +41,6 @@ export declare const functionFinderUtil: {
|
|
|
45
41
|
requireArgumentValue(element: FlowrSearchElement<ParentInformation>, pool: readonly FunctionInfo[], data: {
|
|
46
42
|
normalize: NormalizedAst;
|
|
47
43
|
dataflow: DataflowInformation;
|
|
48
|
-
|
|
44
|
+
analyzer: ReadonlyFlowrAnalysisProvider;
|
|
49
45
|
}, requireValue: RegExp | string | undefined): boolean;
|
|
50
46
|
};
|
|
@@ -65,7 +65,7 @@ exports.functionFinderUtil = {
|
|
|
65
65
|
}
|
|
66
66
|
const vert = data.dataflow.graph.getVertex(element.node.info.id);
|
|
67
67
|
if ((0, vertex_1.isFunctionCallVertex)(vert)) {
|
|
68
|
-
const args = (0, resolve_argument_1.getArgumentStringValue)(data.
|
|
68
|
+
const args = (0, resolve_argument_1.getArgumentStringValue)(data.analyzer.flowrConfig.solver.variables, data.dataflow.graph, vert, info.argIdx, info.argName, info.resolveValue, data.analyzer.inspectContext());
|
|
69
69
|
// we obtain all values, at least one of them has to trigger for the request
|
|
70
70
|
const argValues = args ? args.values().flatMap(v => [...v]).filter(assert_1.isNotUndefined).toArray() : [];
|
|
71
71
|
/* if there are no arguments we assume they may access the network, otherwise we check for the flag */
|
|
@@ -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, { analyzer: d.analyzer, 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,17 +27,18 @@ 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>[]>>>;
|
|
33
|
-
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>[]>, config: SeededRandomnessConfig, { dataflow }: {
|
|
34
|
+
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>[]>, config: SeededRandomnessConfig, { dataflow, analyzer }: {
|
|
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 })
|
|
@@ -30,14 +31,15 @@ exports.SEEDED_RANDOMNESS = {
|
|
|
30
31
|
{ callName: config.randomnessProducers.filter(p => p.type === 'function').map(p => p.name) },
|
|
31
32
|
{ callName: getDefaultAssignments().flatMap(b => b.names), cascadeIf: () => cascade_action_1.CascadeAction.Continue }
|
|
32
33
|
]),
|
|
33
|
-
processSearchResult: (elements, config, { dataflow }) => {
|
|
34
|
+
processSearchResult: (elements, config, { dataflow, analyzer }) => {
|
|
34
35
|
const assignmentProducers = new Set(config.randomnessProducers.filter(p => p.type == 'assignment').map(p => p.name));
|
|
35
36
|
const assignmentArgIndexes = new Map(getDefaultAssignments().flatMap(a => a.names.map(n => ([n, a.config?.swapSourceAndTarget ? 1 : 0]))));
|
|
36
37
|
const metadata = {
|
|
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
|
-
if (isConstantArgument(dataflow.graph, f, 0)) {
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
if (isConstantArgument(dataflow.graph, f, 0, analyzer.inspectContext())) {
|
|
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))) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
85
|
+
// we either have arg index 0 or 1 for the assignmentProducers destination, so we select the assignment value as 1-argIdx here
|
|
86
|
+
if (isConstantArgument(dataflow.graph, a, 1 - argIdx, analyzer.inspectContext())) {
|
|
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
|
},
|
|
@@ -112,9 +132,9 @@ exports.SEEDED_RANDOMNESS = {
|
|
|
112
132
|
function getDefaultAssignments() {
|
|
113
133
|
return default_builtin_config_1.DefaultBuiltinConfig.filter(b => b.type === 'function' && b.processor == 'builtin:assignment');
|
|
114
134
|
}
|
|
115
|
-
function isConstantArgument(graph, call, argIndex) {
|
|
135
|
+
function isConstantArgument(graph, call, argIndex, ctx) {
|
|
116
136
|
const args = call.args.filter(arg => arg !== r_function_call_1.EmptyArgument && !arg.name).map(graph_1.getReferenceOfArgument);
|
|
117
|
-
const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(args[argIndex], { graph: graph, resolve: config_1.VariableResolve.Alias }));
|
|
137
|
+
const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(args[argIndex], { graph: graph, resolve: config_1.VariableResolve.Alias, ctx }));
|
|
118
138
|
return values?.elements.every(v => v.type === 'number' ||
|
|
119
139
|
v.type === 'logical' ||
|
|
120
140
|
v.type === 'string' ||
|
|
@@ -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.
|
|
3
|
+
"version": "2.7.0",
|
|
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,9 @@
|
|
|
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:query-api": "ts-node src/documentation/print-query-wiki.ts",
|
|
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",
|
|
44
31
|
"build": "tsc --project .",
|
|
45
32
|
"build-dev": "npm run build && npm run build:copy-wasm",
|
|
46
33
|
"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 +197,7 @@
|
|
|
210
197
|
},
|
|
211
198
|
"dependencies": {
|
|
212
199
|
"@eagleoutice/tree-sitter-r": "^1.1.2",
|
|
200
|
+
"@jupyterlab/nbformat": "^4.5.0",
|
|
213
201
|
"@xmldom/xmldom": "^0.9.7",
|
|
214
202
|
"clipboardy": "^4.0.0",
|
|
215
203
|
"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
|