@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
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
3
|
+
exports.WikiQuery = void 0;
|
|
7
4
|
const doc_dfg_1 = require("./doc-util/doc-dfg");
|
|
8
|
-
const log_1 = require("../../test/functionality/_helper/log");
|
|
9
5
|
const query_1 = require("../queries/query");
|
|
10
6
|
const doc_files_1 = require("./doc-util/doc-files");
|
|
11
7
|
const doc_query_1 = require("./doc-util/doc-query");
|
|
@@ -13,7 +9,6 @@ const schema_1 = require("../util/schema");
|
|
|
13
9
|
const ansi_1 = require("../util/text/ansi");
|
|
14
10
|
const call_context_query_executor_1 = require("../queries/catalog/call-context-query/call-context-query-executor");
|
|
15
11
|
const compound_query_1 = require("../queries/virtual-query/compound-query");
|
|
16
|
-
const doc_auto_gen_1 = require("./doc-util/doc-auto-gen");
|
|
17
12
|
const example_query_code_1 = require("./data/query/example-query-code");
|
|
18
13
|
const doc_structure_1 = require("./doc-util/doc-structure");
|
|
19
14
|
const doc_code_1 = require("./doc-util/doc-code");
|
|
@@ -31,14 +26,14 @@ const config_query_executor_1 = require("../queries/catalog/config-query/config-
|
|
|
31
26
|
const search_query_executor_1 = require("../queries/catalog/search-query/search-query-executor");
|
|
32
27
|
const flowr_search_builder_1 = require("../search/flowr-search-builder");
|
|
33
28
|
const vertex_1 = require("../dataflow/graph/vertex");
|
|
34
|
-
const doc_types_1 = require("./doc-util/doc-types");
|
|
35
|
-
const path_1 = __importDefault(require("path"));
|
|
36
29
|
const control_flow_query_executor_1 = require("../queries/catalog/control-flow-query/control-flow-query-executor");
|
|
37
30
|
const doc_cfg_1 = require("./doc-util/doc-cfg");
|
|
38
31
|
const df_shape_query_executor_1 = require("../queries/catalog/df-shape-query/df-shape-query-executor");
|
|
39
32
|
const _00_slice_1 = require("../core/steps/all/static-slicing/00-slice");
|
|
40
33
|
const doc_repl_1 = require("./doc-util/doc-repl");
|
|
41
34
|
const inspect_higher_order_query_executor_1 = require("../queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor");
|
|
35
|
+
const doc_escape_1 = require("./doc-util/doc-escape");
|
|
36
|
+
const doc_maker_1 = require("./wiki-mk/doc-maker");
|
|
42
37
|
(0, doc_query_1.registerQueryDocumentation)('call-context', {
|
|
43
38
|
name: 'Call-Context Query',
|
|
44
39
|
type: 'active',
|
|
@@ -199,16 +194,17 @@ ${await (0, doc_query_1.showQuery)(shell, example_query_code_1.exampleQueryCode,
|
|
|
199
194
|
functionName: search_query_executor_1.executeSearch.name,
|
|
200
195
|
functionFile: '../queries/catalog/resolve-value-query/resolve-value-query-executor.ts',
|
|
201
196
|
buildExplanation: async (shell) => {
|
|
202
|
-
const exampleCode = 'x <- 1\nprint(x)';
|
|
197
|
+
const exampleCode = 'x <- 1\ny <-2\nprint(x)\nprint(y)';
|
|
198
|
+
const criteria = ['3@x', '4@y'];
|
|
203
199
|
return `
|
|
204
200
|
With this query you can use flowR's value-tracking capabilities to resolve identifiers to all potential values they may have at runtime (if possible).
|
|
205
201
|
The extent to which flowR traces values (e.g., built-ins vs. constants) can be configured in flowR's Configuration file (see the [Interface](${doc_files_1.FlowrWikiBaseRef}/Interface) wiki page for more information).
|
|
206
202
|
|
|
207
|
-
Using the example code \`${exampleCode}\` (with
|
|
203
|
+
Using the example code \`${exampleCode}\` (with newlines), the following query returns all values of \`x\` in the code:
|
|
208
204
|
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
209
205
|
type: 'resolve-value',
|
|
210
|
-
criteria:
|
|
211
|
-
}], { showCode: true })}
|
|
206
|
+
criteria: criteria
|
|
207
|
+
}], { showCode: true, shorthand: (0, doc_query_1.sliceQueryShorthand)(criteria, (0, doc_escape_1.escapeNewline)(exampleCode)) })}
|
|
212
208
|
`;
|
|
213
209
|
}
|
|
214
210
|
});
|
|
@@ -239,6 +235,7 @@ ${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
|
239
235
|
functionFile: '../queries/catalog/origin-query/origin-query-executor.ts',
|
|
240
236
|
buildExplanation: async (shell) => {
|
|
241
237
|
const exampleCode = 'x <- 1\nprint(x)';
|
|
238
|
+
const criterion = '2@x';
|
|
242
239
|
return `
|
|
243
240
|
With this query you can use flowR's origin tracking to find out the read origins of a variable,
|
|
244
241
|
the functions called by a call, and more.
|
|
@@ -246,8 +243,8 @@ the functions called by a call, and more.
|
|
|
246
243
|
Using the example code \`${exampleCode}\` (with the \`print(x)\` in the second line), the following query returns the origins of \`x\` in the code:
|
|
247
244
|
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
248
245
|
type: 'origin',
|
|
249
|
-
criterion:
|
|
250
|
-
}], { showCode: true })}
|
|
246
|
+
criterion: criterion
|
|
247
|
+
}], { showCode: true, shorthand: (0, doc_query_1.sliceQueryShorthand)([criterion], (0, doc_escape_1.escapeNewline)(exampleCode)) })}
|
|
251
248
|
`;
|
|
252
249
|
}
|
|
253
250
|
});
|
|
@@ -329,7 +326,7 @@ ${await (0, doc_query_1.showQuery)(shell, '', [{
|
|
|
329
326
|
}
|
|
330
327
|
}], { showCode: false, collapseQuery: true, collapseResult: true })}
|
|
331
328
|
|
|
332
|
-
Please note that, in the
|
|
329
|
+
Please note that, in the REPL, a special syntax starting with \`+\` (which should be autocompleted) can be used to update the configuration on the fly:
|
|
333
330
|
|
|
334
331
|
${await (0, doc_repl_1.documentReplSession)(shell, [
|
|
335
332
|
{
|
|
@@ -348,11 +345,18 @@ ${await (0, doc_repl_1.documentReplSession)(shell, [
|
|
|
348
345
|
functionFile: '../queries/catalog/df-shape-query/df-shape-query-format.ts',
|
|
349
346
|
buildExplanation: async (shell) => {
|
|
350
347
|
const exampleCode = 'x <- data.frame(a=1:3)\nfilter(x, FALSE)';
|
|
348
|
+
const criterion = '2@x';
|
|
351
349
|
return `
|
|
352
350
|
This query infers all shapes of dataframes within the code. For example, you can use:
|
|
353
351
|
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
354
352
|
type: 'df-shape'
|
|
355
353
|
}], { showCode: true, collapseQuery: true })}
|
|
354
|
+
|
|
355
|
+
The query also accepts an optional slice criterion to narrow the results to a specific node. For example:
|
|
356
|
+
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
357
|
+
type: 'df-shape',
|
|
358
|
+
criterion: criterion
|
|
359
|
+
}], { showCode: true, collapseQuery: true, shorthand: (0, doc_query_1.sliceQueryShorthand)([criterion], (0, doc_escape_1.escapeNewline)(exampleCode)) })}
|
|
356
360
|
`;
|
|
357
361
|
}
|
|
358
362
|
});
|
|
@@ -417,7 +421,8 @@ Now, the results no longer contain calls to \`plot\` that are not defined locall
|
|
|
417
421
|
functionName: static_slice_query_executor_1.executeStaticSliceQuery.name,
|
|
418
422
|
functionFile: '../queries/catalog/static-slice-query/static-slice-query-executor.ts',
|
|
419
423
|
buildExplanation: async (shell) => {
|
|
420
|
-
const exampleCode = 'x <- 1\ny <- 2\nx';
|
|
424
|
+
const exampleCode = 'x <- 1\ny <- 2\nz <- 3\nx';
|
|
425
|
+
const criteria = ['3@z', '4@x'];
|
|
421
426
|
return `
|
|
422
427
|
To slice, _flowR_ needs one thing from you: a variable or a list of variables (function calls are supported to, referring to the anonymous
|
|
423
428
|
return of the call) that you want to slice the dataflow graph for (additionally, you have to tell flowR if you want to have a forward slice).
|
|
@@ -430,15 +435,15 @@ If you are interested in the parts required for the use of \`x\` in the last lin
|
|
|
430
435
|
|
|
431
436
|
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
432
437
|
type: 'static-slice',
|
|
433
|
-
criteria:
|
|
434
|
-
}], { showCode: false })}
|
|
438
|
+
criteria: criteria
|
|
439
|
+
}], { showCode: false, shorthand: (0, doc_query_1.sliceQueryShorthand)(criteria, (0, doc_escape_1.escapeNewline)(exampleCode)) })}
|
|
435
440
|
|
|
436
441
|
In general, you may be uninterested in seeing the reconstructed version and want to save some computation time, for this,
|
|
437
442
|
you can use the \`noReconstruction\` flag.
|
|
438
443
|
|
|
439
444
|
${(0, doc_structure_1.details)('No Reconstruction Example', await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
440
445
|
type: 'static-slice',
|
|
441
|
-
criteria: ['
|
|
446
|
+
criteria: ['4@x'],
|
|
442
447
|
noReconstruction: true
|
|
443
448
|
}], { showCode: false }))}
|
|
444
449
|
|
|
@@ -448,7 +453,7 @@ ${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
|
448
453
|
type: 'static-slice',
|
|
449
454
|
criteria: ['1@x'],
|
|
450
455
|
direction: _00_slice_1.SliceDirection.Forward
|
|
451
|
-
}], { showCode: false })}
|
|
456
|
+
}], { showCode: false, shorthand: (0, doc_query_1.sliceQueryShorthand)(['1@x'], (0, doc_escape_1.escapeNewline)(exampleCode), true) })}
|
|
452
457
|
|
|
453
458
|
You can disable [magic comments](${doc_files_1.FlowrWikiBaseRef}/Interface#slice-magic-comments) using the \`noMagicComments\` flag.
|
|
454
459
|
This query replaces the old [\`request-slice\`](${doc_files_1.FlowrWikiBaseRef}/Interface#message-request-slice) message.
|
|
@@ -524,7 +529,16 @@ ${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
|
524
529
|
type: 'linter'
|
|
525
530
|
}], { showCode: false, collapseQuery: true })}
|
|
526
531
|
|
|
527
|
-
You can also configure which rules to apply and what settings to use for these rules
|
|
532
|
+
You can also configure which rules to apply and what settings to use for these rules:
|
|
533
|
+
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
534
|
+
type: 'linter',
|
|
535
|
+
rules: ['file-path-validity'],
|
|
536
|
+
}], {
|
|
537
|
+
showCode: false,
|
|
538
|
+
collapseQuery: true,
|
|
539
|
+
shorthand: `rules:file-path-validity "${exampleCode}"`
|
|
540
|
+
})}
|
|
541
|
+
|
|
528
542
|
We welcome any feedback and suggestions for new rules on this (consider opening a [new issue](${doc_issue_1.NewIssueUrl})).
|
|
529
543
|
`;
|
|
530
544
|
}
|
|
@@ -592,11 +606,9 @@ ${await (0, doc_cfg_1.printCfgCode)(shell, exampleCode, { showCode: false, prefi
|
|
|
592
606
|
shortDescription: 'Returns a simple mapping of ids to their location in the source file',
|
|
593
607
|
functionName: location_map_query_executor_1.executeLocationMapQuery.name,
|
|
594
608
|
functionFile: '../queries/catalog/location-map-query/location-map-query-executor.ts',
|
|
595
|
-
buildExplanation: async (shell) => {
|
|
596
|
-
const types = (0, doc_types_1.getTypesFromFolder)({
|
|
597
|
-
files: [path_1.default.resolve('./src/util/range.ts')],
|
|
598
|
-
});
|
|
609
|
+
buildExplanation: async (shell, ctx) => {
|
|
599
610
|
const exampleCode = 'x + 1\nx * 2';
|
|
611
|
+
const criteria = ['1@x', '2@x'];
|
|
600
612
|
return `
|
|
601
613
|
A query like the ${(0, doc_query_1.linkToQueryOfName)('id-map')} query can return a huge result, especially for larger scripts.
|
|
602
614
|
If you are not interested in all of the information contained within the full map, you can use the location map query to get a simple mapping of ids to their location in the source file.
|
|
@@ -611,28 +623,40 @@ ${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
|
611
623
|
type: 'location-map'
|
|
612
624
|
}], { showCode: false, collapseQuery: true })}
|
|
613
625
|
|
|
614
|
-
|
|
626
|
+
The query also accepts a list of slice criteria to filter the results to only include the locations of specific nodes. For example:
|
|
627
|
+
|
|
628
|
+
${await (0, doc_query_1.showQuery)(shell, exampleCode, [{
|
|
629
|
+
type: 'location-map',
|
|
630
|
+
ids: criteria
|
|
631
|
+
}], { showCode: false, collapseQuery: true, shorthand: (0, doc_query_1.sliceQueryShorthand)(criteria, (0, doc_escape_1.escapeNewline)(exampleCode)) })}
|
|
632
|
+
|
|
633
|
+
All locations are given as a ${ctx.link('SourceRange')} paired with the file id in the format \`[file-id, [start-line, start-column, end-line, end-column]]\`.
|
|
615
634
|
|
|
616
635
|
`;
|
|
617
636
|
}
|
|
618
637
|
});
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
638
|
+
/**
|
|
639
|
+
* https://github.com/flowr-analysis/flowr/wiki/Query-API
|
|
640
|
+
*/
|
|
641
|
+
class WikiQuery extends doc_maker_1.DocMaker {
|
|
642
|
+
constructor() {
|
|
643
|
+
super('wiki/Query API.md', module.filename, 'query API');
|
|
644
|
+
}
|
|
645
|
+
async text({ ctx, shell }) {
|
|
646
|
+
return `
|
|
623
647
|
This page briefly summarizes flowR's query API, represented by the ${query_1.executeQueries.name} function in ${(0, doc_files_1.getFilePathMd)('../queries/query.ts')}.
|
|
624
648
|
Please see the [Interface](${doc_files_1.FlowrWikiBaseRef}/Interface) wiki page for more information on how to access this API.
|
|
625
649
|
|
|
626
650
|
${(0, doc_structure_1.block)({
|
|
627
|
-
|
|
628
|
-
|
|
651
|
+
type: 'NOTE',
|
|
652
|
+
content: `
|
|
629
653
|
There are many ways to query a dataflow graph created by flowR.
|
|
630
654
|
For example, you can use the [\`request-query\`](${doc_files_1.FlowrWikiBaseRef}/Interface#message-request-query) message
|
|
631
655
|
with a running flowR server, or the ${(0, doc_cli_option_1.getReplCommand)('query')} command in the flowR [REPL](${doc_files_1.FlowrWikiBaseRef}/Interface#repl).
|
|
632
656
|
|
|
633
657
|
Also, check out the [${doc_files_1.FlowrGithubGroupName}/sample-analyzer-project-query](${doc_files_1.FlowrGithubBaseRef}/sample-analyzer-project-query) repository for a complete example project using the query API.
|
|
634
658
|
`.trim()
|
|
635
|
-
|
|
659
|
+
})}
|
|
636
660
|
|
|
637
661
|
## The Query Format
|
|
638
662
|
|
|
@@ -693,20 +717,11 @@ Just as an example, the following ${(0, doc_query_1.linkToQueryOfName)('call-con
|
|
|
693
717
|
|
|
694
718
|
${await (0, doc_query_1.showQuery)(shell, example_query_code_1.exampleQueryCode, [{ type: 'call-context', callName: '^read_csv$', callTargets: identify_link_to_last_call_relation_1.CallTargets.OnlyGlobal, kind: 'input', subkind: 'csv-file' }], { showCode: false })}
|
|
695
719
|
|
|
696
|
-
${await (0, doc_query_1.explainQueries)(shell, 'active')}
|
|
697
|
-
|
|
698
|
-
${await (0, doc_query_1.explainQueries)(shell, 'virtual')}
|
|
720
|
+
${await (0, doc_query_1.explainQueries)(shell, ctx, 'active')}
|
|
699
721
|
|
|
722
|
+
${await (0, doc_query_1.explainQueries)(shell, ctx, 'virtual')}
|
|
700
723
|
`;
|
|
724
|
+
}
|
|
701
725
|
}
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
(0, log_1.setMinLevelOfAllLogs)(6 /* LogLevel.Fatal */);
|
|
705
|
-
const shell = new shell_1.RShell();
|
|
706
|
-
void getText(shell).then(str => {
|
|
707
|
-
console.log(str);
|
|
708
|
-
}).finally(() => {
|
|
709
|
-
shell.close();
|
|
710
|
-
});
|
|
711
|
-
}
|
|
712
|
-
//# sourceMappingURL=print-query-wiki.js.map
|
|
726
|
+
exports.WikiQuery = WikiQuery;
|
|
727
|
+
//# sourceMappingURL=wiki-query.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DocMakerArgs } from './wiki-mk/doc-maker';
|
|
2
|
+
import { DocMaker } from './wiki-mk/doc-maker';
|
|
3
|
+
/**
|
|
4
|
+
* https://github.com/flowr-analysis/flowr/wiki/Search-API
|
|
5
|
+
*/
|
|
6
|
+
export declare class WikiSearch extends DocMaker {
|
|
7
|
+
constructor();
|
|
8
|
+
text({ ctx, shell }: DocMakerArgs): Promise<string>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WikiSearch = void 0;
|
|
4
|
+
const doc_files_1 = require("./doc-util/doc-files");
|
|
5
|
+
const doc_search_1 = require("./doc-util/doc-search");
|
|
6
|
+
const flowr_search_builder_1 = require("../search/flowr-search-builder");
|
|
7
|
+
const vertex_1 = require("../dataflow/graph/vertex");
|
|
8
|
+
const flowr_search_executor_1 = require("../search/flowr-search-executor");
|
|
9
|
+
const doc_maker_1 = require("./wiki-mk/doc-maker");
|
|
10
|
+
const flowr_search_1 = require("../search/flowr-search");
|
|
11
|
+
/**
|
|
12
|
+
* https://github.com/flowr-analysis/flowr/wiki/Search-API
|
|
13
|
+
*/
|
|
14
|
+
class WikiSearch extends doc_maker_1.DocMaker {
|
|
15
|
+
constructor() {
|
|
16
|
+
super('wiki/Search API.md', module.filename, 'search API');
|
|
17
|
+
}
|
|
18
|
+
async text({ ctx, shell }) {
|
|
19
|
+
return `
|
|
20
|
+
This page briefly summarizes flowR's search API which provides a set of functions to search for nodes in the [Dataflow Graph](${doc_files_1.FlowrWikiBaseRef}/Dataflow-Graph) and the
|
|
21
|
+
[Normalized AST](${doc_files_1.FlowrWikiBaseRef}/Normalized-AST) of a given R code (the search will always consider both, with respect to your search query).
|
|
22
|
+
Please see the [Interface](${doc_files_1.FlowrWikiBaseRef}/Interface) wiki page for more information on how to access this API.
|
|
23
|
+
Within code, you can execute a search using the ${ctx.link(flowr_search_executor_1.runSearch)} function.
|
|
24
|
+
|
|
25
|
+
For an initial motivation, let's have a look at the following example:
|
|
26
|
+
|
|
27
|
+
${await (0, doc_search_1.showSearch)(shell, 'x <- x * x', flowr_search_builder_1.Q.var('x'))}
|
|
28
|
+
|
|
29
|
+
This returns all references to the variable \`x\` in the code.
|
|
30
|
+
However, the search API is not limited to simple variable references and can do much more.
|
|
31
|
+
|
|
32
|
+
For example, let's have every definition of \`x\` in the code but the first one:
|
|
33
|
+
|
|
34
|
+
${await (0, doc_search_1.showSearch)(shell, 'x <- x * x\nprint(x)\nx <- y <- 3\nprint(x)\nx <- 2', flowr_search_builder_1.Q.var('x').filter(vertex_1.VertexType.VariableDefinition).skip(1))}
|
|
35
|
+
|
|
36
|
+
In summary, every search has two parts. It is initialized with a _generator_ (such as \`Q.var('x')\`)
|
|
37
|
+
and can be further refined with _transformers_ or _modifiers_.
|
|
38
|
+
Such queries can be constructed starting from the ${ctx.link('Q')} object (backed by ${ctx.link('FlowrSearchGenerator')}) and
|
|
39
|
+
are fully serializable so you can use them when communicating with the [Query API](${doc_files_1.FlowrWikiBaseRef}/Query%20API).
|
|
40
|
+
|
|
41
|
+
We offer the following generators:
|
|
42
|
+
|
|
43
|
+
${Object.keys(flowr_search_builder_1.Q).sort().map(key => `- ${ctx.link(`FlowrSearchGenerator::${key}`)}\\\n${ctx.doc(`FlowrSearchGenerator::${key}`)}`).join('\n')}
|
|
44
|
+
|
|
45
|
+
Likewise, we have a palette of _transformers_ and _modifiers_:
|
|
46
|
+
|
|
47
|
+
${
|
|
48
|
+
/* let's iterate over all methods of FlowrSearchBuilder */
|
|
49
|
+
Object.getOwnPropertyNames(Object.getPrototypeOf(new flowr_search_builder_1.FlowrSearchBuilder(undefined)))
|
|
50
|
+
.filter(n => n !== 'constructor').sort().map(key => `- ${ctx.link(`FlowrSearchBuilder::${key}`)}\\\n${ctx.doc(`FlowrSearchBuilder::${key}`)}`).join('\n')}
|
|
51
|
+
|
|
52
|
+
Every search (and consequently the search pipeline) works with an array of ${ctx.link('FlowrSearchElement')} (neatly wrapped in ${ctx.link(flowr_search_1.FlowrSearchElements)}).
|
|
53
|
+
Hence, even operations such as \`.first\` or \`.last\` return an array of elements (albeit with a single or no element).
|
|
54
|
+
The search API does its best to stay typesafe wrt. to the return type and the transformers in use.
|
|
55
|
+
In addition, it offers optimizer passes to optimize the search pipeline before execution.
|
|
56
|
+
They are executed with \`.build\` which may happen automatically, whenever you want to run a search using ${ctx.link(flowr_search_executor_1.runSearch)}.
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.WikiSearch = WikiSearch;
|
|
61
|
+
//# sourceMappingURL=wiki-search.js.map
|
|
@@ -17,10 +17,11 @@ async function executeLintingRule(ruleName, input, lintingRuleConfig) {
|
|
|
17
17
|
const searchTime = Date.now() - searchStart;
|
|
18
18
|
const processStart = Date.now();
|
|
19
19
|
const result = await rule.processSearchResult(searchResult, fullConfig, {
|
|
20
|
-
|
|
20
|
+
/* we currently await them here for simplicity (no redundant awaits in the linting rules), but they could be passed as promises too */
|
|
21
21
|
dataflow: await input.dataflow(),
|
|
22
|
+
normalize: await input.normalize(),
|
|
22
23
|
cfg: await input.controlflow(),
|
|
23
|
-
|
|
24
|
+
analyzer: input
|
|
24
25
|
});
|
|
25
26
|
const processTime = Date.now() - processStart;
|
|
26
27
|
return {
|
|
@@ -9,8 +9,8 @@ import type { AsyncOrSync, DeepPartial, DeepReadonly } from 'ts-essentials';
|
|
|
9
9
|
import type { LintingRuleTag } from './linter-tags';
|
|
10
10
|
import type { SourceRange } from '../util/range';
|
|
11
11
|
import type { DataflowInformation } from '../dataflow/info';
|
|
12
|
-
import type { FlowrConfigOptions } from '../config';
|
|
13
12
|
import type { ControlFlowInformation } from '../control-flow/control-flow-graph';
|
|
13
|
+
import type { ReadonlyFlowrAnalysisProvider } from '../project/flowr-analyzer';
|
|
14
14
|
export interface LinterRuleInformation<Config extends MergeableRecord = never> {
|
|
15
15
|
/** Human-Readable name of the linting rule. */
|
|
16
16
|
readonly name: string;
|
|
@@ -51,7 +51,7 @@ export interface LintingRule<Result extends LintingResult, Metadata extends Merg
|
|
|
51
51
|
normalize: NormalizedAst;
|
|
52
52
|
dataflow: DataflowInformation;
|
|
53
53
|
cfg: ControlFlowInformation;
|
|
54
|
-
|
|
54
|
+
analyzer: ReadonlyFlowrAnalysisProvider;
|
|
55
55
|
}) => AsyncOrSync<{
|
|
56
56
|
results: Result[];
|
|
57
57
|
'.meta': Metadata;
|
package/linter/linter-rules.d.ts
CHANGED
|
@@ -6,11 +6,7 @@ import type { LintingRule } from './linter-format';
|
|
|
6
6
|
export declare const LintingRules: {
|
|
7
7
|
readonly 'deprecated-functions': {
|
|
8
8
|
readonly createSearch: (config: import("./rules/function-finder-util").FunctionsToDetectConfig) => import("../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "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>[]>>>;
|
|
9
|
-
readonly processSearchResult: <T extends import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>(elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, T>, _config:
|
|
10
|
-
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
11
|
-
dataflow: import("../dataflow/info").DataflowInformation;
|
|
12
|
-
config: import("../config").FlowrConfigOptions;
|
|
13
|
-
}, refineSearch?: (elements: T) => T) => {
|
|
9
|
+
readonly processSearchResult: <T extends import("../search/flowr-search").FlowrSearchElement<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>(elements: import("../search/flowr-search").FlowrSearchElements<import("../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, T>, _config: unknown, _data: unknown, refineSearch?: (elements: T) => T) => {
|
|
14
10
|
results: {
|
|
15
11
|
certainty: import("./linter-format").LintingResultCertainty;
|
|
16
12
|
function: import("../dataflow/environments/identifier").Identifier;
|
|
@@ -38,7 +34,7 @@ export declare const LintingRules: {
|
|
|
38
34
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
39
35
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
40
36
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
41
|
-
|
|
37
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
42
38
|
}) => {
|
|
43
39
|
results: import("./rules/file-path-validity").FilePathValidityResult[];
|
|
44
40
|
".meta": import("./rules/file-path-validity").FilePathValidityMetadata;
|
|
@@ -65,10 +61,10 @@ export declare const LintingRules: {
|
|
|
65
61
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
66
62
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
67
63
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
68
|
-
|
|
64
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
69
65
|
}) => {
|
|
70
66
|
results: {
|
|
71
|
-
certainty: import("./linter-format").LintingResultCertainty
|
|
67
|
+
certainty: import("./linter-format").LintingResultCertainty;
|
|
72
68
|
function: import("../dataflow/environments/identifier").Identifier;
|
|
73
69
|
range: import("../util/range").SourceRange;
|
|
74
70
|
}[];
|
|
@@ -101,7 +97,7 @@ export declare const LintingRules: {
|
|
|
101
97
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
102
98
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
103
99
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
104
|
-
|
|
100
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
105
101
|
}) => {
|
|
106
102
|
results: import("./rules/absolute-path").AbsoluteFilePathResult[];
|
|
107
103
|
".meta": import("./rules/absolute-path").AbsoluteFilePathMetadata;
|
|
@@ -132,7 +128,7 @@ export declare const LintingRules: {
|
|
|
132
128
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
133
129
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
134
130
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
135
|
-
|
|
131
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
136
132
|
}) => {
|
|
137
133
|
results: import("./rules/unused-definition").UnusedDefinitionResult[];
|
|
138
134
|
".meta": import("./rules/unused-definition").UnusedDefinitionMetadata;
|
|
@@ -157,7 +153,7 @@ export declare const LintingRules: {
|
|
|
157
153
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
158
154
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
159
155
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
160
|
-
|
|
156
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
161
157
|
}) => {
|
|
162
158
|
results: {
|
|
163
159
|
quickFix: import("./linter-format").LintQuickFixReplacement[] | undefined;
|
|
@@ -178,7 +174,7 @@ export declare const LintingRules: {
|
|
|
178
174
|
readonly info: {
|
|
179
175
|
readonly name: "Naming Convention";
|
|
180
176
|
readonly certainty: import("./linter-format").LintingRuleCertainty.OverApproximative;
|
|
181
|
-
readonly description: "Checks
|
|
177
|
+
readonly description: "Checks whether the symbols conform to a certain naming convention";
|
|
182
178
|
readonly tags: readonly [import("./linter-tags").LintingRuleTag.Style, import("./linter-tags").LintingRuleTag.QuickFix];
|
|
183
179
|
readonly defaultConfig: {
|
|
184
180
|
readonly caseing: "auto";
|
|
@@ -192,7 +188,7 @@ export declare const LintingRules: {
|
|
|
192
188
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
193
189
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
194
190
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
195
|
-
|
|
191
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
196
192
|
}) => {
|
|
197
193
|
results: {
|
|
198
194
|
certainty: import("./linter-format").LintingResultCertainty;
|
|
@@ -222,7 +218,7 @@ export declare const LintingRules: {
|
|
|
222
218
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
223
219
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
224
220
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
225
|
-
|
|
221
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
226
222
|
}) => {
|
|
227
223
|
results: import("./rules/dataframe-access-validation").DataFrameAccessValidationResult[];
|
|
228
224
|
'.meta': import("./rules/dataframe-access-validation").DataFrameAccessValidationMetadata;
|
|
@@ -247,7 +243,7 @@ export declare const LintingRules: {
|
|
|
247
243
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
248
244
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
249
245
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
250
|
-
|
|
246
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
251
247
|
}) => {
|
|
252
248
|
results: {
|
|
253
249
|
certainty: import("./linter-format").LintingResultCertainty.Certain;
|
|
@@ -269,11 +265,11 @@ export declare const LintingRules: {
|
|
|
269
265
|
};
|
|
270
266
|
readonly 'useless-loop': {
|
|
271
267
|
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>[]>>>;
|
|
272
|
-
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: import("./rules/useless-loop").UselessLoopConfig, {
|
|
268
|
+
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: import("./rules/useless-loop").UselessLoopConfig, { analyzer, dataflow, normalize, cfg }: {
|
|
273
269
|
normalize: import("../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
274
270
|
dataflow: import("../dataflow/info").DataflowInformation;
|
|
275
271
|
cfg: import("../control-flow/control-flow-graph").ControlFlowInformation;
|
|
276
|
-
|
|
272
|
+
analyzer: import("../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
277
273
|
}) => {
|
|
278
274
|
results: {
|
|
279
275
|
certainty: import("./linter-format").LintingResultCertainty.Certain;
|
|
@@ -3,7 +3,6 @@ import { type MergeableRecord } from '../../util/objects';
|
|
|
3
3
|
import { type SourceRange } from '../../util/range';
|
|
4
4
|
import { LintingRuleTag } from '../linter-tags';
|
|
5
5
|
import type { FunctionInfo } from '../../queries/catalog/dependencies-query/function-info/function-info';
|
|
6
|
-
import type { FlowrConfigOptions } from '../../config';
|
|
7
6
|
export interface AbsoluteFilePathResult extends LintingResult {
|
|
8
7
|
filePath: string;
|
|
9
8
|
range: SourceRange;
|
|
@@ -40,7 +39,7 @@ export declare const ABSOLUTE_PATH: {
|
|
|
40
39
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
41
40
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
42
41
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
43
|
-
|
|
42
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
44
43
|
}) => {
|
|
45
44
|
results: AbsoluteFilePathResult[];
|
|
46
45
|
".meta": AbsoluteFilePathMetadata;
|
|
@@ -52,7 +52,7 @@ const PathFunctions = {
|
|
|
52
52
|
'file.path': (df, vtx, config) => {
|
|
53
53
|
const fsep = (0, resolve_argument_1.getArgumentStringValue)(config.solver.variables, df, vtx, undefined, 'fsep', true);
|
|
54
54
|
// in the future we can access `.Platform$file.sep` here
|
|
55
|
-
const sepValues =
|
|
55
|
+
const sepValues = fsep?.values()?.flatMap(s => s.values().filter(assert_1.isNotUndefined)).toArray() ?? [path_1.default.sep];
|
|
56
56
|
if (sepValues.some(s => s === dependencies_query_format_1.Unknown || (0, assert_1.isUndefined)(s))) {
|
|
57
57
|
// if we have no fsep, we cannot construct a path
|
|
58
58
|
return undefined;
|
|
@@ -139,7 +139,7 @@ exports.ABSOLUTE_PATH = {
|
|
|
139
139
|
const dfNode = data.dataflow.graph.getVertex(node.info.id);
|
|
140
140
|
if ((0, vertex_1.isFunctionCallVertex)(dfNode)) {
|
|
141
141
|
const handler = PathFunctions[dfNode.name ?? ''];
|
|
142
|
-
const strings = handler ? handler(data.dataflow.graph, dfNode, data.
|
|
142
|
+
const strings = handler ? handler(data.dataflow.graph, dfNode, data.analyzer.flowrConfig) : [];
|
|
143
143
|
if (strings) {
|
|
144
144
|
return strings.filter(s => (0, strings_1.isAbsolutePath)(s, regex)).map(str => ({
|
|
145
145
|
certainty: linter_format_1.LintingResultCertainty.Uncertain,
|
|
@@ -34,7 +34,7 @@ export declare const DATA_FRAME_ACCESS_VALIDATION: {
|
|
|
34
34
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
35
35
|
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
36
36
|
cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
|
|
37
|
-
|
|
37
|
+
analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
|
|
38
38
|
}) => {
|
|
39
39
|
results: DataFrameAccessValidationResult[];
|
|
40
40
|
'.meta': DataFrameAccessValidationMetadata;
|
|
@@ -17,14 +17,18 @@ const linter_tags_1 = require("../linter-tags");
|
|
|
17
17
|
exports.DATA_FRAME_ACCESS_VALIDATION = {
|
|
18
18
|
createSearch: () => flowr_search_builder_1.Q.all().with(search_enrichers_1.Enrichment.CallTargets, { onlyBuiltin: true }),
|
|
19
19
|
processSearchResult: (elements, config, data) => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
let ctx = data.analyzer.inspectContext();
|
|
21
|
+
ctx = {
|
|
22
|
+
...ctx,
|
|
23
|
+
config: (0, config_1.amendConfig)(data.analyzer.flowrConfig, flowrConfig => {
|
|
24
|
+
if (config.readLoadedData !== undefined) {
|
|
25
|
+
flowrConfig.abstractInterpretation.dataFrame.readLoadedData.readExternalFiles = config.readLoadedData;
|
|
26
|
+
}
|
|
27
|
+
return flowrConfig;
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
const cfg = (0, extract_cfg_1.extractCfg)(data.normalize, ctx, data.dataflow.graph);
|
|
31
|
+
(0, shape_inference_1.inferDataFrameShapes)(cfg, data.dataflow.graph, data.normalize, ctx);
|
|
28
32
|
const accessOperations = getAccessOperations(elements);
|
|
29
33
|
const accesses = [];
|
|
30
34
|
for (const [nodeId, operations] of accessOperations) {
|
|
@@ -22,7 +22,7 @@ export declare const DEAD_CODE: {
|
|
|
22
22
|
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").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: {
|
|
28
28
|
certainty: LintingResultCertainty.Certain;
|
|
@@ -3,11 +3,7 @@ import { LintingRuleTag } from '../linter-tags';
|
|
|
3
3
|
import { type FunctionsMetadata, type FunctionsResult, type FunctionsToDetectConfig } from './function-finder-util';
|
|
4
4
|
export declare const DEPRECATED_FUNCTIONS: {
|
|
5
5
|
readonly createSearch: (config: FunctionsToDetectConfig) => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "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>[]>>>;
|
|
6
|
-
readonly processSearchResult: <T extends import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>(elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, T>, _config:
|
|
7
|
-
normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
|
|
8
|
-
dataflow: import("../../dataflow/info").DataflowInformation;
|
|
9
|
-
config: import("../../config").FlowrConfigOptions;
|
|
10
|
-
}, refineSearch?: (elements: T) => T) => {
|
|
6
|
+
readonly processSearchResult: <T extends import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>(elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, T>, _config: unknown, _data: unknown, refineSearch?: (elements: T) => T) => {
|
|
11
7
|
results: {
|
|
12
8
|
certainty: import("../linter-format").LintingResultCertainty;
|
|
13
9
|
function: import("../../dataflow/environments/identifier").Identifier;
|
|
@@ -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++;
|