@eagleoutice/flowr 1.3.11
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/LICENSE +674 -0
- package/README.md +27 -0
- package/benchmark/benchmark-slicer.js +223 -0
- package/benchmark/index.d.ts +3 -0
- package/benchmark/index.js +20 -0
- package/benchmark/slicer.d.ts +100 -0
- package/benchmark/slicer.js +223 -0
- package/benchmark/stats/index.d.ts +10 -0
- package/benchmark/stats/index.js +27 -0
- package/benchmark/stats/print.d.ts +7 -0
- package/benchmark/stats/print.js +157 -0
- package/benchmark/stats/stats.d.ts +41 -0
- package/benchmark/stats/stats.js +6 -0
- package/benchmark/stopwatch.d.ts +35 -0
- package/benchmark/stopwatch.js +79 -0
- package/cli/benchmark-app.d.ts +9 -0
- package/cli/benchmark-app.js +52 -0
- package/cli/benchmark-helper-app.d.ts +7 -0
- package/cli/benchmark-helper-app.js +60 -0
- package/cli/common/features.d.ts +3 -0
- package/cli/common/features.js +30 -0
- package/cli/common/index.d.ts +2 -0
- package/cli/common/index.js +19 -0
- package/cli/common/options.d.ts +20 -0
- package/cli/common/options.js +82 -0
- package/cli/common/script.d.ts +21 -0
- package/cli/common/script.js +61 -0
- package/cli/common/scripts-info.d.ts +24 -0
- package/cli/common/scripts-info.js +69 -0
- package/cli/export-quads-app.d.ts +7 -0
- package/cli/export-quads-app.js +46 -0
- package/cli/repl/commands/cfg.d.ts +3 -0
- package/cli/repl/commands/cfg.js +37 -0
- package/cli/repl/commands/commands.d.ts +11 -0
- package/cli/repl/commands/commands.js +103 -0
- package/cli/repl/commands/dataflow.d.ts +3 -0
- package/cli/repl/commands/dataflow.js +34 -0
- package/cli/repl/commands/execute.d.ts +4 -0
- package/cli/repl/commands/execute.js +27 -0
- package/cli/repl/commands/index.d.ts +2 -0
- package/cli/repl/commands/index.js +19 -0
- package/cli/repl/commands/main.d.ts +39 -0
- package/cli/repl/commands/main.js +14 -0
- package/cli/repl/commands/normalize.d.ts +3 -0
- package/cli/repl/commands/normalize.js +34 -0
- package/cli/repl/commands/parse.d.ts +2 -0
- package/cli/repl/commands/parse.js +109 -0
- package/cli/repl/commands/quit.d.ts +2 -0
- package/cli/repl/commands/quit.js +12 -0
- package/cli/repl/commands/version.d.ts +16 -0
- package/cli/repl/commands/version.js +33 -0
- package/cli/repl/core.d.ts +41 -0
- package/cli/repl/core.js +89 -0
- package/cli/repl/execute.d.ts +28 -0
- package/cli/repl/execute.js +79 -0
- package/cli/repl/index.d.ts +5 -0
- package/cli/repl/index.js +22 -0
- package/cli/repl/prompt.d.ts +2 -0
- package/cli/repl/prompt.js +9 -0
- package/cli/repl/server/connection.d.ts +21 -0
- package/cli/repl/server/connection.js +217 -0
- package/cli/repl/server/messages/analysis.d.ts +71 -0
- package/cli/repl/server/messages/analysis.js +21 -0
- package/cli/repl/server/messages/error.d.ts +11 -0
- package/cli/repl/server/messages/error.js +3 -0
- package/cli/repl/server/messages/hello.d.ts +20 -0
- package/cli/repl/server/messages/hello.js +3 -0
- package/cli/repl/server/messages/index.d.ts +1 -0
- package/cli/repl/server/messages/index.js +3 -0
- package/cli/repl/server/messages/messages.d.ts +35 -0
- package/cli/repl/server/messages/messages.js +20 -0
- package/cli/repl/server/messages/repl.d.ts +33 -0
- package/cli/repl/server/messages/repl.js +17 -0
- package/cli/repl/server/messages/slice.d.ts +25 -0
- package/cli/repl/server/messages/slice.js +17 -0
- package/cli/repl/server/net.d.ts +33 -0
- package/cli/repl/server/net.js +24 -0
- package/cli/repl/server/send.d.ts +4 -0
- package/cli/repl/server/send.js +18 -0
- package/cli/repl/server/server.d.ts +20 -0
- package/cli/repl/server/server.js +66 -0
- package/cli/repl/server/validate.d.ts +15 -0
- package/cli/repl/server/validate.js +34 -0
- package/cli/slicer-app.d.ts +11 -0
- package/cli/slicer-app.js +81 -0
- package/cli/statistics-app.d.ts +11 -0
- package/cli/statistics-app.js +98 -0
- package/cli/statistics-helper-app.d.ts +11 -0
- package/cli/statistics-helper-app.js +83 -0
- package/cli/summarizer-app.d.ts +18 -0
- package/cli/summarizer-app.js +67 -0
- package/core/index.d.ts +4 -0
- package/core/index.js +23 -0
- package/core/input.d.ts +42 -0
- package/core/input.js +3 -0
- package/core/output.d.ts +15 -0
- package/core/output.js +3 -0
- package/core/pipeline-executor.js +221 -0
- package/core/print/dataflow-printer.d.ts +8 -0
- package/core/print/dataflow-printer.js +62 -0
- package/core/print/normalize-printer.d.ts +7 -0
- package/core/print/normalize-printer.js +31 -0
- package/core/print/parse-printer.d.ts +3 -0
- package/core/print/parse-printer.js +29 -0
- package/core/print/print.d.ts +47 -0
- package/core/print/print.js +13 -0
- package/core/print/slice-diff-ansi.d.ts +2 -0
- package/core/print/slice-diff-ansi.js +49 -0
- package/core/slicer.d.ts +123 -0
- package/core/slicer.js +227 -0
- package/core/stepping-slicer.js +160 -0
- package/core/steps/all/00-parse.js +19 -0
- package/core/steps/all/10-normalize.js +21 -0
- package/core/steps/all/20-dataflow.js +21 -0
- package/core/steps/all/30-slice.js +16 -0
- package/core/steps/all/40-reconstruct.js +16 -0
- package/core/steps/all/core/00-parse.js +24 -0
- package/core/steps/all/core/10-normalize.js +46 -0
- package/core/steps/all/core/20-dataflow.js +39 -0
- package/core/steps/all/static-slicing/00-slice.js +21 -0
- package/core/steps/all/static-slicing/10-reconstruct.js +21 -0
- package/core/steps/index.js +21 -0
- package/core/steps/input.js +3 -0
- package/core/steps/output.js +3 -0
- package/core/steps/pipeline/create.js +130 -0
- package/core/steps/pipeline/default.js +15 -0
- package/core/steps/pipeline/dependency-checker.js +76 -0
- package/core/steps/pipeline/index.js +20 -0
- package/core/steps/pipeline/invalid-pipeline-error.js +14 -0
- package/core/steps/pipeline/pipeline.js +28 -0
- package/core/steps/step.js +8 -0
- package/core/steps/steps-provider.js +3 -0
- package/core/steps/steps.js +35 -0
- package/core/steps.d.ts +166 -0
- package/core/steps.js +99 -0
- package/dataflow/common/environments/append.js +48 -0
- package/dataflow/common/environments/environment.js +165 -0
- package/dataflow/common/environments/index.js +23 -0
- package/dataflow/common/environments/overwrite.js +82 -0
- package/dataflow/common/environments/register.js +49 -0
- package/dataflow/common/environments/resolve-by-name.js +35 -0
- package/dataflow/common/environments/scopes.js +6 -0
- package/dataflow/common/environments/scoping.js +27 -0
- package/dataflow/environments/append.d.ts +8 -0
- package/dataflow/environments/append.js +48 -0
- package/dataflow/environments/environment.d.ts +78 -0
- package/dataflow/environments/environment.js +161 -0
- package/dataflow/environments/index.d.ts +7 -0
- package/dataflow/environments/index.js +23 -0
- package/dataflow/environments/overwrite.d.ts +6 -0
- package/dataflow/environments/overwrite.js +82 -0
- package/dataflow/environments/register.d.ts +7 -0
- package/dataflow/environments/register.js +39 -0
- package/dataflow/environments/resolve-by-name.d.ts +12 -0
- package/dataflow/environments/resolve-by-name.js +35 -0
- package/dataflow/environments/scopes.d.ts +6 -0
- package/dataflow/environments/scopes.js +6 -0
- package/dataflow/environments/scoping.d.ts +4 -0
- package/dataflow/environments/scoping.js +27 -0
- package/dataflow/extractor.d.ts +6 -0
- package/dataflow/extractor.js +60 -0
- package/dataflow/graph/diff.d.ts +18 -0
- package/dataflow/graph/diff.js +206 -0
- package/dataflow/graph/edge.d.ts +37 -0
- package/dataflow/graph/edge.js +32 -0
- package/dataflow/graph/equal.js +127 -0
- package/dataflow/graph/graph.d.ts +120 -0
- package/dataflow/graph/graph.js +298 -0
- package/dataflow/graph/index.d.ts +4 -0
- package/dataflow/graph/index.js +21 -0
- package/dataflow/graph/quads.d.ts +8 -0
- package/dataflow/graph/quads.js +27 -0
- package/dataflow/graph/vertex.d.ts +86 -0
- package/dataflow/graph/vertex.js +3 -0
- package/dataflow/index.d.ts +5 -0
- package/dataflow/index.js +24 -0
- package/dataflow/internal/info.d.ts +21 -0
- package/dataflow/internal/info.js +16 -0
- package/dataflow/internal/linker.d.ts +41 -0
- package/dataflow/internal/linker.js +255 -0
- package/dataflow/internal/process/access.d.ts +4 -0
- package/dataflow/internal/process/access.js +53 -0
- package/dataflow/internal/process/expression-list.d.ts +8 -0
- package/dataflow/internal/process/expression-list.js +148 -0
- package/dataflow/internal/process/functions/argument.d.ts +8 -0
- package/dataflow/internal/process/functions/argument.js +46 -0
- package/dataflow/internal/process/functions/exit-points.d.ts +2 -0
- package/dataflow/internal/process/functions/exit-points.js +121 -0
- package/dataflow/internal/process/functions/function-call.d.ts +5 -0
- package/dataflow/internal/process/functions/function-call.js +99 -0
- package/dataflow/internal/process/functions/function-definition.d.ts +4 -0
- package/dataflow/internal/process/functions/function-definition.js +176 -0
- package/dataflow/internal/process/functions/parameter.d.ts +4 -0
- package/dataflow/internal/process/functions/parameter.js +47 -0
- package/dataflow/internal/process/if-then-else.d.ts +4 -0
- package/dataflow/internal/process/if-then-else.js +56 -0
- package/dataflow/internal/process/loops/for-loop.d.ts +4 -0
- package/dataflow/internal/process/loops/for-loop.js +54 -0
- package/dataflow/internal/process/loops/repeat-loop.d.ts +4 -0
- package/dataflow/internal/process/loops/repeat-loop.js +21 -0
- package/dataflow/internal/process/loops/while-loop.d.ts +4 -0
- package/dataflow/internal/process/loops/while-loop.js +31 -0
- package/dataflow/internal/process/operators/assignment.d.ts +4 -0
- package/dataflow/internal/process/operators/assignment.js +129 -0
- package/dataflow/internal/process/operators/non-assignment-binary-op.d.ts +4 -0
- package/dataflow/internal/process/operators/non-assignment-binary-op.js +25 -0
- package/dataflow/internal/process/operators/pipe.d.ts +4 -0
- package/dataflow/internal/process/operators/pipe.js +46 -0
- package/dataflow/internal/process/operators/unary-op.d.ts +4 -0
- package/dataflow/internal/process/operators/unary-op.js +10 -0
- package/dataflow/internal/process/symbol.d.ts +4 -0
- package/dataflow/internal/process/symbol.js +21 -0
- package/dataflow/internal/process/uninteresting-leaf.d.ts +3 -0
- package/dataflow/internal/process/uninteresting-leaf.js +9 -0
- package/dataflow/processor.d.ts +47 -0
- package/dataflow/processor.js +20 -0
- package/dataflow/v1/extractor.js +60 -0
- package/dataflow/v1/graph/diff.js +206 -0
- package/dataflow/v1/graph/edge.js +32 -0
- package/dataflow/v1/graph/graph.js +298 -0
- package/dataflow/v1/graph/index.js +21 -0
- package/dataflow/v1/graph/quads.js +27 -0
- package/dataflow/v1/graph/vertex.js +3 -0
- package/dataflow/v1/index.js +24 -0
- package/dataflow/v1/internal/info.js +16 -0
- package/dataflow/v1/internal/linker.js +255 -0
- package/dataflow/v1/internal/process/access.js +54 -0
- package/dataflow/v1/internal/process/expression-list.js +154 -0
- package/dataflow/v1/internal/process/functions/argument.js +46 -0
- package/dataflow/v1/internal/process/functions/exit-points.js +125 -0
- package/dataflow/v1/internal/process/functions/function-call.js +99 -0
- package/dataflow/v1/internal/process/functions/function-definition.js +176 -0
- package/dataflow/v1/internal/process/functions/parameter.js +47 -0
- package/dataflow/v1/internal/process/if-then-else.js +57 -0
- package/dataflow/v1/internal/process/loops/for-loop.js +54 -0
- package/dataflow/v1/internal/process/loops/repeat-loop.js +21 -0
- package/dataflow/v1/internal/process/loops/while-loop.js +31 -0
- package/dataflow/v1/internal/process/operators/assignment.js +129 -0
- package/dataflow/v1/internal/process/operators/non-assignment-binary-op.js +25 -0
- package/dataflow/v1/internal/process/operators/pipe.js +46 -0
- package/dataflow/v1/internal/process/operators/unary-op.js +10 -0
- package/dataflow/v1/internal/process/symbol.js +21 -0
- package/dataflow/v1/internal/process/uninteresting-leaf.js +9 -0
- package/dataflow/v1/processor.js +20 -0
- package/dataflow/v2/entry.js +11 -0
- package/flowr-1.3.7.tgz +0 -0
- package/flowr.d.ts +26 -0
- package/flowr.js +135 -0
- package/index.d.ts +6 -0
- package/index.js +23 -0
- package/package.json +384 -0
- package/r-bridge/index.d.ts +11 -0
- package/r-bridge/index.js +28 -0
- package/r-bridge/lang-4.x/ast/index.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/index.js +19 -0
- package/r-bridge/lang-4.x/ast/model/collect.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/model/collect.js +23 -0
- package/r-bridge/lang-4.x/ast/model/index.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/model/index.js +23 -0
- package/r-bridge/lang-4.x/ast/model/model.d.ts +127 -0
- package/r-bridge/lang-4.x/ast/model/model.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/index.d.ts +21 -0
- package/r-bridge/lang-4.x/ast/model/nodes/index.js +38 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/index.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/index.js +27 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/r-delimiter.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/r-delimiter.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-access.d.ts +24 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-access.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-argument.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-argument.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-binary-op.d.ts +25 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-binary-op.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-break.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-break.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-comment.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-comment.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-expression-list.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-expression-list.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-for-loop.d.ts +18 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-for-loop.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.d.ts +31 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-if-then-else.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-if-then-else.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-line-directive.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-line-directive.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-logical.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-logical.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-next.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-next.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-number.d.ts +8 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-number.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-parameter.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-parameter.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-pipe.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-pipe.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-repeat-loop.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-repeat-loop.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-string.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-string.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-symbol.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-symbol.js +9 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-unary-op.d.ts +18 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-unary-op.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-while-loop.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-while-loop.js +3 -0
- package/r-bridge/lang-4.x/ast/model/operators.d.ts +46 -0
- package/r-bridge/lang-4.x/ast/model/operators.js +67 -0
- package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +81 -0
- package/r-bridge/lang-4.x/ast/model/processing/decorate.js +342 -0
- package/r-bridge/lang-4.x/ast/model/processing/fold.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/model/processing/fold.js +20 -0
- package/r-bridge/lang-4.x/ast/model/processing/index.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/model/processing/index.js +22 -0
- package/r-bridge/lang-4.x/ast/model/processing/role.d.ts +41 -0
- package/r-bridge/lang-4.x/ast/model/processing/role.js +17 -0
- package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.d.ts +61 -0
- package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.js +87 -0
- package/r-bridge/lang-4.x/ast/model/processing/visitor.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/processing/visitor.js +109 -0
- package/r-bridge/lang-4.x/ast/model/type.d.ts +206 -0
- package/r-bridge/lang-4.x/ast/model/type.js +18 -0
- package/r-bridge/lang-4.x/ast/model/versions.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/model/versions.js +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/config.js +16 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/input-format.js +42 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/meta.js +118 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/xml-to-json.js +58 -0
- package/r-bridge/lang-4.x/ast/parser/xml/config.d.ts +25 -0
- package/r-bridge/lang-4.x/ast/parser/xml/config.js +16 -0
- package/r-bridge/lang-4.x/ast/parser/xml/data.d.ts +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/data.js +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/hooks.d.ts +292 -0
- package/r-bridge/lang-4.x/ast/parser/xml/hooks.js +136 -0
- package/r-bridge/lang-4.x/ast/parser/xml/index.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/parser/xml/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/input-format.d.ts +32 -0
- package/r-bridge/lang-4.x/ast/parser/xml/input-format.js +33 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/access.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/access.js +107 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then-else.d.ts +15 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then-else.js +32 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then.js +46 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.js +19 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.js +65 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.d.ts +1 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/argument.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/argument.js +74 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/call.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/call.js +149 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.js +60 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/parameter.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/parameter.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/index.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/index.js +27 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.js +72 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.js +42 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.js +45 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/meta.d.ts +50 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/meta.js +118 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/binary.d.ts +8 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/binary.js +162 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.js +59 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.d.ts +1 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.js +55 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.js +159 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.js +41 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/symbol.d.ts +14 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/symbol.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/xml-to-json.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/xml-to-json.js +51 -0
- package/r-bridge/lang-4.x/ast/parser/xml/parser.d.ts +17 -0
- package/r-bridge/lang-4.x/ast/parser/xml/parser.js +30 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/data.js +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/hooks.js +136 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/access.js +107 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/control/if-then-else.js +32 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/control/if-then.js +46 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/control/index.js +19 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/expression/expression.js +65 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/expression/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/argument.js +74 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/call.js +149 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/definition.js +60 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/parameter.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/index.js +27 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/break.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/for.js +72 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/next.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/repeat.js +42 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/while.js +45 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/binary.js +162 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/special.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/unary.js +59 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/other/comment.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/other/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/other/line-directive.js +55 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/elements.js +159 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/root.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/single-element.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/number.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/string.js +41 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/symbol.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/normalize.js +30 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/data.js +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/access.js +95 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/expression.js +99 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/functions/argument.js +71 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/operators/binary.js +30 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/operators/index.js +19 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/operators/unary.js +35 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/other/comment.js +25 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/other/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/other/line-directive.js +38 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/root.js +26 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/single-element.js +63 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/number.js +46 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/string.js +33 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/symbol.js +63 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/normalize.js +25 -0
- package/r-bridge/lang-4.x/index.d.ts +2 -0
- package/r-bridge/lang-4.x/index.js +19 -0
- package/r-bridge/lang-4.x/values.d.ts +39 -0
- package/r-bridge/lang-4.x/values.js +149 -0
- package/r-bridge/retriever.d.ts +48 -0
- package/r-bridge/retriever.js +71 -0
- package/r-bridge/shell.d.ts +147 -0
- package/r-bridge/shell.js +423 -0
- package/reconstruct/reconstruct.d.ts +28 -0
- package/reconstruct/reconstruct.js +448 -0
- package/slicing/criterion/collect-all.d.ts +36 -0
- package/slicing/criterion/collect-all.js +23 -0
- package/slicing/criterion/filters/all-variables.d.ts +2 -0
- package/slicing/criterion/filters/all-variables.js +63 -0
- package/slicing/criterion/filters/index.d.ts +1 -0
- package/slicing/criterion/filters/index.js +18 -0
- package/slicing/criterion/index.d.ts +3 -0
- package/slicing/criterion/index.js +20 -0
- package/slicing/criterion/parse.d.ts +20 -0
- package/slicing/criterion/parse.js +79 -0
- package/slicing/index.d.ts +3 -0
- package/slicing/index.js +20 -0
- package/slicing/static/index.d.ts +1 -0
- package/slicing/static/index.js +18 -0
- package/slicing/static/static-slicer.d.ts +29 -0
- package/slicing/static/static-slicer.js +186 -0
- package/statistics/features/common-syntax-probability.d.ts +30 -0
- package/statistics/features/common-syntax-probability.js +159 -0
- package/statistics/features/feature.d.ts +175 -0
- package/statistics/features/feature.js +30 -0
- package/statistics/features/index.d.ts +1 -0
- package/statistics/features/index.js +18 -0
- package/statistics/features/post-processing.d.ts +12 -0
- package/statistics/features/post-processing.js +21 -0
- package/statistics/features/supported/assignments/assignments.d.ts +11 -0
- package/statistics/features/supported/assignments/assignments.js +53 -0
- package/statistics/features/supported/assignments/index.d.ts +1 -0
- package/statistics/features/supported/assignments/index.js +6 -0
- package/statistics/features/supported/assignments/post-process.d.ts +3 -0
- package/statistics/features/supported/assignments/post-process.js +125 -0
- package/statistics/features/supported/comments/comments.d.ts +18 -0
- package/statistics/features/supported/comments/comments.js +133 -0
- package/statistics/features/supported/comments/index.d.ts +1 -0
- package/statistics/features/supported/comments/index.js +6 -0
- package/statistics/features/supported/comments/post-process.d.ts +3 -0
- package/statistics/features/supported/comments/post-process.js +50 -0
- package/statistics/features/supported/control-flow/control-flow.d.ts +17 -0
- package/statistics/features/supported/control-flow/control-flow.js +67 -0
- package/statistics/features/supported/control-flow/index.d.ts +1 -0
- package/statistics/features/supported/control-flow/index.js +6 -0
- package/statistics/features/supported/control-flow/post-process.d.ts +3 -0
- package/statistics/features/supported/control-flow/post-process.js +65 -0
- package/statistics/features/supported/data-access/data-access.d.ts +15 -0
- package/statistics/features/supported/data-access/data-access.js +118 -0
- package/statistics/features/supported/data-access/index.d.ts +1 -0
- package/statistics/features/supported/data-access/index.js +6 -0
- package/statistics/features/supported/data-access/post-process.d.ts +3 -0
- package/statistics/features/supported/data-access/post-process.js +107 -0
- package/statistics/features/supported/defined-functions/defined-functions.d.ts +35 -0
- package/statistics/features/supported/defined-functions/defined-functions.js +139 -0
- package/statistics/features/supported/defined-functions/index.d.ts +1 -0
- package/statistics/features/supported/defined-functions/index.js +6 -0
- package/statistics/features/supported/defined-functions/post-process.d.ts +6 -0
- package/statistics/features/supported/defined-functions/post-process.js +177 -0
- package/statistics/features/supported/expression-list/expression-list.d.ts +9 -0
- package/statistics/features/supported/expression-list/expression-list.js +36 -0
- package/statistics/features/supported/expression-list/index.d.ts +1 -0
- package/statistics/features/supported/expression-list/index.js +6 -0
- package/statistics/features/supported/expression-list/post-process.d.ts +3 -0
- package/statistics/features/supported/expression-list/post-process.js +44 -0
- package/statistics/features/supported/index.d.ts +10 -0
- package/statistics/features/supported/index.js +27 -0
- package/statistics/features/supported/loops/index.d.ts +1 -0
- package/statistics/features/supported/loops/index.js +6 -0
- package/statistics/features/supported/loops/loops.d.ts +20 -0
- package/statistics/features/supported/loops/loops.js +79 -0
- package/statistics/features/supported/loops/post-process.d.ts +3 -0
- package/statistics/features/supported/loops/post-process.js +72 -0
- package/statistics/features/supported/used-functions/index.d.ts +1 -0
- package/statistics/features/supported/used-functions/index.js +6 -0
- package/statistics/features/supported/used-functions/post-process.d.ts +6 -0
- package/statistics/features/supported/used-functions/post-process.js +179 -0
- package/statistics/features/supported/used-functions/used-functions.d.ts +24 -0
- package/statistics/features/supported/used-functions/used-functions.js +95 -0
- package/statistics/features/supported/used-packages/index.d.ts +1 -0
- package/statistics/features/supported/used-packages/index.js +6 -0
- package/statistics/features/supported/used-packages/post-process.d.ts +3 -0
- package/statistics/features/supported/used-packages/post-process.js +121 -0
- package/statistics/features/supported/used-packages/used-packages.d.ts +16 -0
- package/statistics/features/supported/used-packages/used-packages.js +130 -0
- package/statistics/features/supported/values/index.d.ts +1 -0
- package/statistics/features/supported/values/index.js +6 -0
- package/statistics/features/supported/values/post-process.d.ts +3 -0
- package/statistics/features/supported/values/post-process.js +72 -0
- package/statistics/features/supported/values/values.d.ts +14 -0
- package/statistics/features/supported/values/values.js +101 -0
- package/statistics/features/supported/variables/index.d.ts +1 -0
- package/statistics/features/supported/variables/index.js +6 -0
- package/statistics/features/supported/variables/post-process.d.ts +9 -0
- package/statistics/features/supported/variables/post-process.js +122 -0
- package/statistics/features/supported/variables/variables.d.ts +15 -0
- package/statistics/features/supported/variables/variables.js +70 -0
- package/statistics/index.d.ts +6 -0
- package/statistics/index.js +24 -0
- package/statistics/meta-statistics.d.ts +33 -0
- package/statistics/meta-statistics.js +17 -0
- package/statistics/output/ansi.d.ts +50 -0
- package/statistics/output/ansi.js +58 -0
- package/statistics/output/file-provider.d.ts +37 -0
- package/statistics/output/file-provider.js +97 -0
- package/statistics/output/index.d.ts +4 -0
- package/statistics/output/index.js +21 -0
- package/statistics/output/print-stats.d.ts +17 -0
- package/statistics/output/print-stats.js +69 -0
- package/statistics/output/statistics-file.d.ts +37 -0
- package/statistics/output/statistics-file.js +69 -0
- package/statistics/statistics.d.ts +24 -0
- package/statistics/statistics.js +109 -0
- package/util/args.d.ts +14 -0
- package/util/args.js +67 -0
- package/util/arrays.d.ts +44 -0
- package/util/arrays.js +145 -0
- package/util/assert.d.ts +11 -0
- package/util/assert.js +35 -0
- package/util/bimap.d.ts +24 -0
- package/util/bimap.js +71 -0
- package/util/cfg.d.ts +55 -0
- package/util/cfg.js +498 -0
- package/util/defaultmap.d.ts +34 -0
- package/util/defaultmap.js +65 -0
- package/util/diff.d.ts +43 -0
- package/util/diff.js +28 -0
- package/util/files.d.ts +54 -0
- package/util/files.js +144 -0
- package/util/json.d.ts +2 -0
- package/util/json.js +28 -0
- package/util/log.d.ts +22 -0
- package/util/log.js +48 -0
- package/util/mermaid/ast.d.ts +6 -0
- package/util/mermaid/ast.js +28 -0
- package/util/mermaid/cfg.d.ts +7 -0
- package/util/mermaid/cfg.js +44 -0
- package/util/mermaid/dfg.d.ts +21 -0
- package/util/mermaid/dfg.js +165 -0
- package/util/mermaid/index.d.ts +3 -0
- package/util/mermaid/index.js +20 -0
- package/util/mermaid/mermaid.d.ts +7 -0
- package/util/mermaid/mermaid.js +24 -0
- package/util/numbers.d.ts +1 -0
- package/util/numbers.js +9 -0
- package/util/objects.d.ts +17 -0
- package/util/objects.js +60 -0
- package/util/os.d.ts +2 -0
- package/util/os.js +25 -0
- package/util/parallel.d.ts +30 -0
- package/util/parallel.js +103 -0
- package/util/quads.d.ts +92 -0
- package/util/quads.js +189 -0
- package/util/random.d.ts +4 -0
- package/util/random.js +22 -0
- package/util/range.d.ts +32 -0
- package/util/range.js +61 -0
- package/util/set.d.ts +8 -0
- package/util/set.js +32 -0
- package/util/strings.d.ts +12 -0
- package/util/strings.js +41 -0
- package/util/summarizer/auto-detect.d.ts +2 -0
- package/util/summarizer/auto-detect.js +32 -0
- package/util/summarizer/benchmark/benchmark-summarizer.js +208 -0
- package/util/summarizer/benchmark/data.d.ts +66 -0
- package/util/summarizer/benchmark/data.js +13 -0
- package/util/summarizer/benchmark/first-phase/input.d.ts +2 -0
- package/util/summarizer/benchmark/first-phase/input.js +59 -0
- package/util/summarizer/benchmark/first-phase/process.d.ts +10 -0
- package/util/summarizer/benchmark/first-phase/process.js +208 -0
- package/util/summarizer/benchmark/second-phase/graph.d.ts +2 -0
- package/util/summarizer/benchmark/second-phase/graph.js +54 -0
- package/util/summarizer/benchmark/second-phase/process.d.ts +4 -0
- package/util/summarizer/benchmark/second-phase/process.js +89 -0
- package/util/summarizer/benchmark/summarizer.d.ts +34 -0
- package/util/summarizer/benchmark/summarizer.js +53 -0
- package/util/summarizer/statistics/first-phase/process.d.ts +6 -0
- package/util/summarizer/statistics/first-phase/process.js +81 -0
- package/util/summarizer/statistics/post-process/clusterer.d.ts +26 -0
- package/util/summarizer/statistics/post-process/clusterer.js +43 -0
- package/util/summarizer/statistics/post-process/file-based-count.d.ts +17 -0
- package/util/summarizer/statistics/post-process/file-based-count.js +49 -0
- package/util/summarizer/statistics/post-process/histogram.d.ts +59 -0
- package/util/summarizer/statistics/post-process/histogram.js +128 -0
- package/util/summarizer/statistics/post-process/index.d.ts +4 -0
- package/util/summarizer/statistics/post-process/index.js +21 -0
- package/util/summarizer/statistics/post-process/post-process-output.d.ts +16 -0
- package/util/summarizer/statistics/post-process/post-process-output.js +104 -0
- package/util/summarizer/statistics/second-phase/process.d.ts +11 -0
- package/util/summarizer/statistics/second-phase/process.js +117 -0
- package/util/summarizer/statistics/summarizer.d.ts +34 -0
- package/util/summarizer/statistics/summarizer.js +135 -0
- package/util/summarizer/summarizer.d.ts +25 -0
- package/util/summarizer/summarizer.js +13 -0
- package/util/time.d.ts +6 -0
- package/util/time.js +13 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.linkCircularRedefinitionsWithinALoop = exports.linkInputs = exports.getAllLinkedFunctionDefinitions = exports.linkFunctionCalls = exports.linkArgumentsOnCall = exports.linkReadVariablesInSameScopeWithNames = exports.produceNameSharedIdMap = exports.linkIngoingVariablesInSameScope = void 0;
|
|
4
|
+
const environments_1 = require("../environments");
|
|
5
|
+
const defaultmap_1 = require("../../util/defaultmap");
|
|
6
|
+
const assert_1 = require("../../util/assert");
|
|
7
|
+
const log_1 = require("../../util/log");
|
|
8
|
+
const slicing_1 = require("../../slicing");
|
|
9
|
+
const index_1 = require("../index");
|
|
10
|
+
const scopes_1 = require("../environments/scopes");
|
|
11
|
+
function linkIngoingVariablesInSameScope(graph, references) {
|
|
12
|
+
const nameIdShares = produceNameSharedIdMap(references);
|
|
13
|
+
linkReadVariablesInSameScopeWithNames(graph, nameIdShares);
|
|
14
|
+
}
|
|
15
|
+
exports.linkIngoingVariablesInSameScope = linkIngoingVariablesInSameScope;
|
|
16
|
+
function produceNameSharedIdMap(references) {
|
|
17
|
+
const nameIdShares = new defaultmap_1.DefaultMap(() => []);
|
|
18
|
+
for (const reference of references) {
|
|
19
|
+
nameIdShares.get(reference.name).push(reference);
|
|
20
|
+
}
|
|
21
|
+
return nameIdShares;
|
|
22
|
+
}
|
|
23
|
+
exports.produceNameSharedIdMap = produceNameSharedIdMap;
|
|
24
|
+
function linkReadVariablesInSameScopeWithNames(graph, nameIdShares) {
|
|
25
|
+
for (const ids of nameIdShares.values()) {
|
|
26
|
+
if (ids.length <= 1) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const base = ids[0];
|
|
30
|
+
for (let i = 1; i < ids.length; i++) {
|
|
31
|
+
graph.addEdge(base.nodeId, ids[i].nodeId, index_1.EdgeType.SameReadRead, 'always', true);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.linkReadVariablesInSameScopeWithNames = linkReadVariablesInSameScopeWithNames;
|
|
36
|
+
function specialReturnFunction(info, graph, id) {
|
|
37
|
+
if (info.args.length > 1) {
|
|
38
|
+
index_1.dataflowLogger.error(`expected up to one argument for return, but got ${info.args.length}`);
|
|
39
|
+
}
|
|
40
|
+
for (const arg of info.args) {
|
|
41
|
+
if (Array.isArray(arg)) {
|
|
42
|
+
if (arg[1] !== '<value>') {
|
|
43
|
+
graph.addEdge(id, arg[1], index_1.EdgeType.Returns, 'always');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (arg !== '<value>') {
|
|
47
|
+
graph.addEdge(id, arg, index_1.EdgeType.Returns, 'always');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function linkArgumentsOnCall(args, params, graph) {
|
|
52
|
+
const nameArgMap = new Map(args.filter(Array.isArray));
|
|
53
|
+
const nameParamMap = new Map(params.map(p => [p.name.content, p]));
|
|
54
|
+
const specialDotParameter = params.find(p => p.special);
|
|
55
|
+
// all parameters matched by name
|
|
56
|
+
const matchedParameters = new Set();
|
|
57
|
+
// first map names
|
|
58
|
+
for (const [name, arg] of nameArgMap) {
|
|
59
|
+
if (arg === '<value>') {
|
|
60
|
+
index_1.dataflowLogger.trace(`skipping value argument for ${name}`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const param = nameParamMap.get(name);
|
|
64
|
+
if (param !== undefined) {
|
|
65
|
+
index_1.dataflowLogger.trace(`mapping named argument "${name}" to parameter "${param.name.content}"`);
|
|
66
|
+
graph.addEdge(arg.nodeId, param.name.info.id, index_1.EdgeType.DefinesOnCall, 'always');
|
|
67
|
+
matchedParameters.add(name);
|
|
68
|
+
}
|
|
69
|
+
else if (specialDotParameter !== undefined) {
|
|
70
|
+
index_1.dataflowLogger.trace(`mapping named argument "${name}" to dot-dot-dot parameter`);
|
|
71
|
+
graph.addEdge(arg.nodeId, specialDotParameter.name.info.id, index_1.EdgeType.DefinesOnCall, 'always');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const remainingParameter = params.filter(p => !matchedParameters.has(p.name.content));
|
|
75
|
+
const remainingArguments = args.filter(a => !Array.isArray(a));
|
|
76
|
+
for (let i = 0; i < remainingArguments.length; i++) {
|
|
77
|
+
const arg = remainingArguments[i];
|
|
78
|
+
if (arg === '<value>' || arg === 'empty') {
|
|
79
|
+
index_1.dataflowLogger.trace(`skipping value argument for ${i}`);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (remainingParameter.length <= i) {
|
|
83
|
+
if (specialDotParameter !== undefined) {
|
|
84
|
+
index_1.dataflowLogger.trace(`mapping unnamed argument ${i} (id: ${arg.nodeId}) to dot-dot-dot parameter`);
|
|
85
|
+
graph.addEdge(arg.nodeId, specialDotParameter.name.info.id, index_1.EdgeType.DefinesOnCall, 'always');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
index_1.dataflowLogger.error(`skipping argument ${i} as there is no corresponding parameter - R should block that`);
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const param = remainingParameter[i];
|
|
93
|
+
index_1.dataflowLogger.trace(`mapping unnamed argument ${i} (id: ${arg.nodeId}) to parameter "${param.name.content}"`);
|
|
94
|
+
graph.addEdge(arg.nodeId, param.name.info.id, index_1.EdgeType.DefinesOnCall, 'always');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.linkArgumentsOnCall = linkArgumentsOnCall;
|
|
98
|
+
function linkFunctionCallArguments(targetId, idMap, functionCallName, functionRootId, callArgs, finalGraph) {
|
|
99
|
+
// we get them by just choosing the rhs of the definition
|
|
100
|
+
const linkedFunction = idMap.get(targetId);
|
|
101
|
+
if (linkedFunction === undefined) {
|
|
102
|
+
index_1.dataflowLogger.trace(`no function definition found for ${functionCallName} (${functionRootId})`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (linkedFunction.type !== "RFunctionDefinition" /* RType.FunctionDefinition */) {
|
|
106
|
+
index_1.dataflowLogger.trace(`function call definition base ${functionCallName} does not lead to a function definition (${functionRootId}) but got ${linkedFunction.type}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
index_1.dataflowLogger.trace(`linking arguments for ${functionCallName} (${functionRootId}) to ${JSON.stringify(linkedFunction.location)}`);
|
|
110
|
+
linkArgumentsOnCall(callArgs, linkedFunction.parameters, finalGraph);
|
|
111
|
+
}
|
|
112
|
+
function linkFunctionCall(graph, id, info, idMap, thisGraph, calledFunctionDefinitions) {
|
|
113
|
+
const edges = graph.get(id, true);
|
|
114
|
+
(0, assert_1.guard)(edges !== undefined, () => `id ${id} must be present in graph`);
|
|
115
|
+
const functionDefinitionReadIds = [...edges[1]].filter(([_, e]) => e.types.has(index_1.EdgeType.Reads) || e.types.has(index_1.EdgeType.Calls) || e.types.has(index_1.EdgeType.Relates)).map(([target, _]) => target);
|
|
116
|
+
const functionDefs = getAllLinkedFunctionDefinitions(new Set(functionDefinitionReadIds), graph);
|
|
117
|
+
for (const def of functionDefs.values()) {
|
|
118
|
+
(0, assert_1.guard)(def.tag === 'function-definition', () => `expected function definition, but got ${def.tag}`);
|
|
119
|
+
if (info.environment !== undefined) {
|
|
120
|
+
// for each open ingoing reference, try to resolve it here, and if so add a read edge from the call to signal that it reads it
|
|
121
|
+
for (const ingoing of def.subflow.in) {
|
|
122
|
+
const defs = (0, environments_1.resolveByName)(ingoing.name, scopes_1.LocalScope, info.environment);
|
|
123
|
+
if (defs === undefined) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
for (const def of defs) {
|
|
127
|
+
graph.addEdge(id, def, index_1.EdgeType.Reads, 'always');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const exitPoints = def.exitPoints;
|
|
132
|
+
for (const exitPoint of exitPoints) {
|
|
133
|
+
graph.addEdge(id, exitPoint, index_1.EdgeType.Returns, 'always');
|
|
134
|
+
}
|
|
135
|
+
index_1.dataflowLogger.trace(`recording expression-list-level call from ${info.name} to ${def.name}`);
|
|
136
|
+
graph.addEdge(id, def.id, index_1.EdgeType.Calls, 'always');
|
|
137
|
+
linkFunctionCallArguments(def.id, idMap, def.name, id, info.args, graph);
|
|
138
|
+
}
|
|
139
|
+
if (thisGraph.isRoot(id)) {
|
|
140
|
+
calledFunctionDefinitions.push({ functionCall: id, called: [...functionDefs.values()] });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Returns the called functions within the current graph, which can be used to merge the environments with the call.
|
|
145
|
+
* Furthermore, it links the corresponding arguments.
|
|
146
|
+
*/
|
|
147
|
+
function linkFunctionCalls(graph, idMap, functionCalls, thisGraph) {
|
|
148
|
+
const calledFunctionDefinitions = [];
|
|
149
|
+
for (const [id, info] of functionCalls) {
|
|
150
|
+
(0, assert_1.guard)(info.tag === 'function-call', () => `encountered non-function call in function call linkage ${JSON.stringify(info)}`);
|
|
151
|
+
if (info.name === 'return') {
|
|
152
|
+
specialReturnFunction(info, graph, id);
|
|
153
|
+
graph.addEdge(id, environments_1.BuiltIn, index_1.EdgeType.Calls, 'always');
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
linkFunctionCall(graph, id, info, idMap, thisGraph, calledFunctionDefinitions);
|
|
157
|
+
}
|
|
158
|
+
return calledFunctionDefinitions;
|
|
159
|
+
}
|
|
160
|
+
exports.linkFunctionCalls = linkFunctionCalls;
|
|
161
|
+
function getAllLinkedFunctionDefinitions(functionDefinitionReadIds, dataflowGraph) {
|
|
162
|
+
const potential = [...functionDefinitionReadIds];
|
|
163
|
+
const visited = new Set();
|
|
164
|
+
const result = new Map();
|
|
165
|
+
while (potential.length > 0) {
|
|
166
|
+
const currentId = potential.pop();
|
|
167
|
+
if (currentId === environments_1.BuiltIn) {
|
|
168
|
+
// do not traverse builtins
|
|
169
|
+
slicing_1.slicerLogger.trace('skipping builtin function definition during collection');
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const currentInfo = dataflowGraph.get(currentId, true);
|
|
173
|
+
if (currentInfo === undefined) {
|
|
174
|
+
slicing_1.slicerLogger.trace('skipping unknown link');
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
visited.add(currentId);
|
|
178
|
+
const outgoingEdges = [...currentInfo[1]];
|
|
179
|
+
const returnEdges = outgoingEdges.filter(([_, e]) => e.types.has(index_1.EdgeType.Returns));
|
|
180
|
+
if (returnEdges.length > 0) {
|
|
181
|
+
// only traverse return edges and do not follow calls etc. as this indicates that we have a function call which returns a result, and not the function call itself
|
|
182
|
+
potential.push(...returnEdges.map(([target]) => target).filter(id => !visited.has(id)));
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const followEdges = outgoingEdges.filter(([_, e]) => e.types.has(index_1.EdgeType.Reads) || e.types.has(index_1.EdgeType.DefinedBy) || e.types.has(index_1.EdgeType.DefinedByOnCall) || e.types.has(index_1.EdgeType.Relates));
|
|
186
|
+
if (currentInfo[0].subflow !== undefined) {
|
|
187
|
+
result.set(currentId, currentInfo[0]);
|
|
188
|
+
}
|
|
189
|
+
// trace all joined reads
|
|
190
|
+
potential.push(...followEdges.map(([target]) => target).filter(id => !visited.has(id)));
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
exports.getAllLinkedFunctionDefinitions = getAllLinkedFunctionDefinitions;
|
|
195
|
+
/**
|
|
196
|
+
* This method links a set of read variables to definitions in an environment.
|
|
197
|
+
*
|
|
198
|
+
* @param referencesToLinkAgainstEnvironment - The set of references to link against the environment
|
|
199
|
+
* @param scope - The scope in which the linking shall happen (probably the active scope of {@link DataflowProcessorInformation})
|
|
200
|
+
* @param environmentInformation - The environment information to link against
|
|
201
|
+
* @param givenInputs - The existing list of inputs that might be extended
|
|
202
|
+
* @param graph - The graph to enter the found links
|
|
203
|
+
* @param maybeForRemaining - Each input that can not be linked, will be added to `givenInputs`. If this flag is `true`, it will be marked as `maybe`.
|
|
204
|
+
*
|
|
205
|
+
* @returns the given inputs, possibly extended with the remaining inputs (those of `referencesToLinkAgainstEnvironment` that could not be linked against the environment)
|
|
206
|
+
*/
|
|
207
|
+
function linkInputs(referencesToLinkAgainstEnvironment, scope, environmentInformation, givenInputs, graph, maybeForRemaining) {
|
|
208
|
+
for (const bodyInput of referencesToLinkAgainstEnvironment) {
|
|
209
|
+
const probableTarget = (0, environments_1.resolveByName)(bodyInput.name, scope, environmentInformation);
|
|
210
|
+
if (probableTarget === undefined) {
|
|
211
|
+
log_1.log.trace(`found no target for ${bodyInput.name} in ${scope}`);
|
|
212
|
+
if (maybeForRemaining) {
|
|
213
|
+
bodyInput.used = 'maybe';
|
|
214
|
+
}
|
|
215
|
+
givenInputs.push(bodyInput);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
for (const target of probableTarget) {
|
|
219
|
+
// we can stick with maybe even if readId.attribute is always
|
|
220
|
+
graph.addEdge(bodyInput, target, index_1.EdgeType.Reads, undefined, true);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// data.graph.get(node.id).definedAtPosition = false
|
|
225
|
+
return givenInputs;
|
|
226
|
+
}
|
|
227
|
+
exports.linkInputs = linkInputs;
|
|
228
|
+
/** all loops variables which are open read (not already bound by a redefinition within the loop) get a maybe read marker to their last definition within the loop
|
|
229
|
+
* e.g. with:
|
|
230
|
+
* ```R
|
|
231
|
+
* for(i in 1:10) {
|
|
232
|
+
* x_1 <- x_2 + 1
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
* `x_2` must get a read marker to `x_1` as `x_1` is the active redefinition in the second loop iteration.
|
|
236
|
+
*/
|
|
237
|
+
function linkCircularRedefinitionsWithinALoop(graph, openIns, outgoing) {
|
|
238
|
+
// first we preprocess out so that only the last definition of a given identifier survives
|
|
239
|
+
// this implicitly assumes that the outgoing references are ordered
|
|
240
|
+
const lastOutgoing = new Map();
|
|
241
|
+
for (const out of outgoing) {
|
|
242
|
+
lastOutgoing.set(out.name, out);
|
|
243
|
+
}
|
|
244
|
+
for (const [name, targets] of openIns.entries()) {
|
|
245
|
+
for (const out of lastOutgoing.values()) {
|
|
246
|
+
if (out.name === name) {
|
|
247
|
+
for (const target of targets) {
|
|
248
|
+
graph.addEdge(target.nodeId, out.nodeId, index_1.EdgeType.Reads, 'maybe');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
exports.linkCircularRedefinitionsWithinALoop = linkCircularRedefinitionsWithinALoop;
|
|
255
|
+
//# sourceMappingURL=linker.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ParentInformation, RAccess } from '../../../r-bridge';
|
|
2
|
+
import { DataflowInformation } from '../info';
|
|
3
|
+
import { DataflowProcessorInformation } from '../../processor';
|
|
4
|
+
export declare function processAccess<OtherInfo>(node: RAccess<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processAccess = void 0;
|
|
4
|
+
const processor_1 = require("../../processor");
|
|
5
|
+
const environments_1 = require("../../environments");
|
|
6
|
+
const graph_1 = require("../../graph");
|
|
7
|
+
function processAccess(node, data) {
|
|
8
|
+
const processedAccessed = (0, processor_1.processDataflowFor)(node.accessed, data);
|
|
9
|
+
const nextGraph = processedAccessed.graph;
|
|
10
|
+
const outgoing = processedAccessed.out;
|
|
11
|
+
const ingoing = processedAccessed.in;
|
|
12
|
+
const environments = processedAccessed.environments;
|
|
13
|
+
const accessedNodes = processedAccessed.unknownReferences;
|
|
14
|
+
if (node.operator === '[' || node.operator === '[[') {
|
|
15
|
+
for (const access of node.access) {
|
|
16
|
+
if (access === null || access.value === undefined) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const processedAccess = (0, processor_1.processDataflowFor)(access, data);
|
|
20
|
+
nextGraph.mergeWith(processedAccess.graph);
|
|
21
|
+
// outgoing.push()
|
|
22
|
+
// we link to *out* instead of *in*, as access uses arguments for parsing and the arguments are defined
|
|
23
|
+
for (const newIn of [...processedAccess.out, ...processedAccess.unknownReferences]) {
|
|
24
|
+
for (const accessedNode of accessedNodes) {
|
|
25
|
+
nextGraph.addEdge(accessedNode, newIn, graph_1.EdgeType.Reads, 'always');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
ingoing.push(...processedAccess.in, ...processedAccess.unknownReferences);
|
|
29
|
+
(0, environments_1.overwriteEnvironments)(environments, processedAccess.environments);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
/*
|
|
34
|
+
* keep active nodes in case of assignments etc.
|
|
35
|
+
* We make them maybe as a kind of hack.
|
|
36
|
+
* This way when using
|
|
37
|
+
* ```ts
|
|
38
|
+
* a[[1]] <- 3
|
|
39
|
+
* a[[2]] <- 4
|
|
40
|
+
* a
|
|
41
|
+
* ```
|
|
42
|
+
* the read for a will use both accesses as potential definitions and not just the last one!
|
|
43
|
+
*/
|
|
44
|
+
unknownReferences: (0, environments_1.makeAllMaybe)(processedAccessed.unknownReferences, nextGraph, environments),
|
|
45
|
+
in: ingoing,
|
|
46
|
+
out: outgoing,
|
|
47
|
+
environments: environments,
|
|
48
|
+
scope: data.activeScope,
|
|
49
|
+
graph: nextGraph
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
exports.processAccess = processAccess;
|
|
53
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Processes a list of expressions joining their dataflow graphs accordingly.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { DataflowInformation } from '../info';
|
|
6
|
+
import { ParentInformation, RExpressionList } from '../../../r-bridge';
|
|
7
|
+
import { DataflowProcessorInformation } from '../../processor';
|
|
8
|
+
export declare function processExpressionList<OtherInfo>(exprList: RExpressionList<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processExpressionList = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Processes a list of expressions joining their dataflow graphs accordingly.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
const info_1 = require("../info");
|
|
9
|
+
const r_bridge_1 = require("../../../r-bridge");
|
|
10
|
+
const processor_1 = require("../../processor");
|
|
11
|
+
const environments_1 = require("../../environments");
|
|
12
|
+
const linker_1 = require("../linker");
|
|
13
|
+
const defaultmap_1 = require("../../../util/defaultmap");
|
|
14
|
+
const graph_1 = require("../../graph");
|
|
15
|
+
const index_1 = require("../../index");
|
|
16
|
+
const assert_1 = require("../../../util/assert");
|
|
17
|
+
const dotDotDotAccess = /\.\.\d+/;
|
|
18
|
+
function linkReadNameToWriteIfPossible(read, data, environments, listEnvironments, remainingRead, nextGraph) {
|
|
19
|
+
const readName = dotDotDotAccess.test(read.name) ? '...' : read.name;
|
|
20
|
+
const probableTarget = (0, environments_1.resolveByName)(readName, data.activeScope, environments);
|
|
21
|
+
// record if at least one has not been defined
|
|
22
|
+
if (probableTarget === undefined || probableTarget.some(t => !listEnvironments.has(t.nodeId))) {
|
|
23
|
+
if (remainingRead.has(readName)) {
|
|
24
|
+
remainingRead.get(readName)?.push(read);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
remainingRead.set(readName, [read]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// keep it, for we have no target, as read-ids are unique within same fold, this should work for same links
|
|
31
|
+
// we keep them if they are defined outside the current parent and maybe throw them away later
|
|
32
|
+
if (probableTarget === undefined) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const target of probableTarget) {
|
|
36
|
+
// we can stick with maybe even if readId.attribute is always
|
|
37
|
+
nextGraph.addEdge(read, target, index_1.EdgeType.Reads, undefined, true);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function processNextExpression(currentElement, data, environments, listEnvironments, remainingRead, nextGraph) {
|
|
41
|
+
// all inputs that have not been written until know, are read!
|
|
42
|
+
for (const read of [...currentElement.in, ...currentElement.unknownReferences]) {
|
|
43
|
+
linkReadNameToWriteIfPossible(read, data, environments, listEnvironments, remainingRead, nextGraph);
|
|
44
|
+
}
|
|
45
|
+
// add same variable reads for deferred if they are read previously but not dependent
|
|
46
|
+
for (const writeTarget of currentElement.out) {
|
|
47
|
+
const writeName = writeTarget.name;
|
|
48
|
+
const resolved = (0, environments_1.resolveByName)(writeName, data.activeScope, environments);
|
|
49
|
+
if (resolved !== undefined) {
|
|
50
|
+
// write-write
|
|
51
|
+
for (const target of resolved) {
|
|
52
|
+
nextGraph.addEdge(target, writeTarget, index_1.EdgeType.SameDefDef, undefined, true);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function updateSideEffectsForCalledFunctions(calledEnvs, environments, nextGraph) {
|
|
58
|
+
for (const { functionCall, called } of calledEnvs) {
|
|
59
|
+
for (const calledFn of called) {
|
|
60
|
+
(0, assert_1.guard)(calledFn.tag === 'function-definition', 'called function must call a function definition');
|
|
61
|
+
// only merge the environments they have in common
|
|
62
|
+
let environment = calledFn.environment;
|
|
63
|
+
while (environment.level > environments.level) {
|
|
64
|
+
environment = (0, environments_1.popLocalEnvironment)(environment);
|
|
65
|
+
}
|
|
66
|
+
// update alle definitions to be defined at this function call
|
|
67
|
+
let current = environment.current;
|
|
68
|
+
while (current !== undefined) {
|
|
69
|
+
for (const definitions of current.memory.values()) {
|
|
70
|
+
for (const def of definitions) {
|
|
71
|
+
if (def.kind !== 'built-in-function') {
|
|
72
|
+
nextGraph.addEdge(def.nodeId, functionCall, index_1.EdgeType.SideEffectOnCall, def.used);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
current = current.parent;
|
|
77
|
+
}
|
|
78
|
+
// we update all definitions to be linked with teh corresponding function call
|
|
79
|
+
environments = (0, environments_1.overwriteEnvironments)(environments, environment);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return environments;
|
|
83
|
+
}
|
|
84
|
+
function processExpressionList(exprList, data) {
|
|
85
|
+
const expressions = exprList.children;
|
|
86
|
+
index_1.dataflowLogger.trace(`processing expression list with ${expressions.length} expressions`);
|
|
87
|
+
if (expressions.length === 0) {
|
|
88
|
+
return (0, info_1.initializeCleanInfo)(data);
|
|
89
|
+
}
|
|
90
|
+
let environments = data.environments;
|
|
91
|
+
// used to detect if a "write" happens within the same expression list
|
|
92
|
+
const listEnvironments = new Set();
|
|
93
|
+
const remainingRead = new Map();
|
|
94
|
+
const nextGraph = new graph_1.DataflowGraph();
|
|
95
|
+
const out = [];
|
|
96
|
+
let expressionCounter = 0;
|
|
97
|
+
let foundNextOrBreak = false;
|
|
98
|
+
for (const expression of expressions) {
|
|
99
|
+
index_1.dataflowLogger.trace(`processing expression ${++expressionCounter} of ${expressions.length}`);
|
|
100
|
+
// use the current environments for processing
|
|
101
|
+
data = { ...data, environments };
|
|
102
|
+
const processed = (0, processor_1.processDataflowFor)(expression, data);
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- seems to be a bug in eslint
|
|
104
|
+
if (!foundNextOrBreak) {
|
|
105
|
+
(0, r_bridge_1.visitAst)(expression, n => {
|
|
106
|
+
if (n.type === "RNext" /* RType.Next */ || n.type === "RBreak" /* RType.Break */) {
|
|
107
|
+
foundNextOrBreak = true;
|
|
108
|
+
}
|
|
109
|
+
return n.type === "RForLoop" /* RType.ForLoop */ || n.type === "RWhileLoop" /* RType.WhileLoop */ || n.type === "RRepeatLoop" /* RType.RepeatLoop */ || n.type === "RFunctionDefinition" /* RType.FunctionDefinition */;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// if the expression contained next or break anywhere before the next loop, the overwrite should be an append because we do not know if the rest is executed
|
|
113
|
+
// update the environments for the next iteration with the previous writes
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- seems to be a bug in eslint
|
|
115
|
+
if (foundNextOrBreak) {
|
|
116
|
+
processed.out = (0, environments_1.makeAllMaybe)(processed.out, nextGraph, processed.environments);
|
|
117
|
+
processed.in = (0, environments_1.makeAllMaybe)(processed.in, nextGraph, processed.environments);
|
|
118
|
+
processed.unknownReferences = (0, environments_1.makeAllMaybe)(processed.unknownReferences, nextGraph, processed.environments);
|
|
119
|
+
}
|
|
120
|
+
nextGraph.mergeWith(processed.graph);
|
|
121
|
+
out.push(...processed.out);
|
|
122
|
+
index_1.dataflowLogger.trace(`expression ${expressionCounter} of ${expressions.length} has ${processed.unknownReferences.length} unknown nodes`);
|
|
123
|
+
processNextExpression(processed, data, environments, listEnvironments, remainingRead, nextGraph);
|
|
124
|
+
const functionCallIds = [...processed.graph.vertices(true)]
|
|
125
|
+
.filter(([_, info]) => info.tag === 'function-call');
|
|
126
|
+
const calledEnvs = (0, linker_1.linkFunctionCalls)(nextGraph, data.completeAst.idMap, functionCallIds, processed.graph);
|
|
127
|
+
environments = (0, environments_1.overwriteEnvironments)(environments, processed.environments);
|
|
128
|
+
// if the called function has global redefinitions, we have to keep them within our environment
|
|
129
|
+
environments = updateSideEffectsForCalledFunctions(calledEnvs, environments, nextGraph);
|
|
130
|
+
for (const { nodeId } of processed.out) {
|
|
131
|
+
listEnvironments.add(nodeId);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// now, we have to link same reads
|
|
135
|
+
(0, linker_1.linkReadVariablesInSameScopeWithNames)(nextGraph, new defaultmap_1.DefaultMap(() => [], remainingRead));
|
|
136
|
+
index_1.dataflowLogger.trace(`expression list exits with ${remainingRead.size} remaining read names`);
|
|
137
|
+
return {
|
|
138
|
+
/* no active nodes remain, they are consumed within the remaining read collection */
|
|
139
|
+
unknownReferences: [],
|
|
140
|
+
in: [...remainingRead.values()].flat(),
|
|
141
|
+
out,
|
|
142
|
+
environments,
|
|
143
|
+
scope: data.activeScope,
|
|
144
|
+
graph: nextGraph
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
exports.processExpressionList = processExpressionList;
|
|
148
|
+
//# sourceMappingURL=expression-list.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DataflowInformation } from '../../info';
|
|
2
|
+
import { DataflowProcessorInformation } from '../../../processor';
|
|
3
|
+
import { ParentInformation, RArgument, RNode } from '../../../../r-bridge';
|
|
4
|
+
import { DataflowGraph } from '../../../graph';
|
|
5
|
+
import { IdentifierReference } from '../../../environments';
|
|
6
|
+
export declare const UnnamedArgumentPrefix = "unnamed-argument-";
|
|
7
|
+
export declare function linkReadsForArgument<OtherInfo>(root: RNode<OtherInfo & ParentInformation>, ingoingRefs: IdentifierReference[], graph: DataflowGraph): void;
|
|
8
|
+
export declare function processFunctionArgument<OtherInfo>(argument: RArgument<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processFunctionArgument = exports.linkReadsForArgument = exports.UnnamedArgumentPrefix = void 0;
|
|
4
|
+
const processor_1 = require("../../../processor");
|
|
5
|
+
const r_bridge_1 = require("../../../../r-bridge");
|
|
6
|
+
const graph_1 = require("../../../graph");
|
|
7
|
+
const scopes_1 = require("../../../environments/scopes");
|
|
8
|
+
exports.UnnamedArgumentPrefix = 'unnamed-argument-';
|
|
9
|
+
function linkReadsForArgument(root, ingoingRefs, graph) {
|
|
10
|
+
const allIdsBeforeArguments = new Set((0, r_bridge_1.collectAllIds)(root, n => n.type === "RArgument" /* RType.Argument */ && n.info.id !== root.info.id));
|
|
11
|
+
const ingoingBeforeArgs = ingoingRefs.filter(r => allIdsBeforeArguments.has(r.nodeId));
|
|
12
|
+
for (const ref of ingoingBeforeArgs) {
|
|
13
|
+
// link against the root reference currently I do not know how to deal with nested function calls otherwise
|
|
14
|
+
graph.addEdge(root.info.id, ref, graph_1.EdgeType.Reads, 'always');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.linkReadsForArgument = linkReadsForArgument;
|
|
18
|
+
function processFunctionArgument(argument, data) {
|
|
19
|
+
const name = argument.name === undefined ? undefined : (0, processor_1.processDataflowFor)(argument.name, data);
|
|
20
|
+
const value = argument.value === undefined ? undefined : (0, processor_1.processDataflowFor)(argument.value, data);
|
|
21
|
+
// we do not keep the graph of the name, as this is no node that should ever exist
|
|
22
|
+
const graph = value?.graph ?? new graph_1.DataflowGraph();
|
|
23
|
+
const argContent = argument.name?.content;
|
|
24
|
+
const argumentName = argContent ?? `${exports.UnnamedArgumentPrefix}${argument.info.id}`;
|
|
25
|
+
graph.addVertex({ tag: 'use', id: argument.info.id, name: argumentName, environment: data.environments, when: 'always' });
|
|
26
|
+
const ingoingRefs = [...value?.unknownReferences ?? [], ...value?.in ?? [], ...(name === undefined ? [] : [...name.in])];
|
|
27
|
+
if (argument.value?.type === "RFunctionDefinition" /* RType.FunctionDefinition */) {
|
|
28
|
+
graph.addEdge(argument.info.id, argument.value.info.id, graph_1.EdgeType.Reads, 'always');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// we only need to link against those which are not already bound to another function call argument
|
|
32
|
+
linkReadsForArgument(argument, [...ingoingRefs, ...value?.out ?? [] /* value may perform definitions */], graph);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
unknownReferences: [],
|
|
36
|
+
// active nodes of the name will be lost as they are only used to reference the corresponding parameter
|
|
37
|
+
in: ingoingRefs,
|
|
38
|
+
// , ...value.out, ...(name?.out ?? [])
|
|
39
|
+
out: [{ name: argumentName, scope: scopes_1.LocalScope, nodeId: argument.info.id, used: 'always' }],
|
|
40
|
+
graph: graph,
|
|
41
|
+
environments: value?.environments ?? data.environments,
|
|
42
|
+
scope: data.activeScope
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
exports.processFunctionArgument = processFunctionArgument;
|
|
46
|
+
//# sourceMappingURL=argument.js.map
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retrieveExitPointsOfFunctionDefinition = void 0;
|
|
4
|
+
const assert_1 = require("../../../../util/assert");
|
|
5
|
+
function retrieveExitPointsOfFunctionDefinition(functionDefinition) {
|
|
6
|
+
const exitPoints = visitExitPoints(functionDefinition.body);
|
|
7
|
+
return exitPoints.knownIds.concat(exitPoints.potentialIds);
|
|
8
|
+
}
|
|
9
|
+
exports.retrieveExitPointsOfFunctionDefinition = retrieveExitPointsOfFunctionDefinition;
|
|
10
|
+
function visitExitPoints(node) {
|
|
11
|
+
const type = node.type;
|
|
12
|
+
switch (type) {
|
|
13
|
+
case "RExpressionList" /* RType.ExpressionList */:
|
|
14
|
+
return visitExpressionList(node);
|
|
15
|
+
case "RFunctionCall" /* RType.FunctionCall */:
|
|
16
|
+
if (node.flavor === 'named' && node.functionName.content === 'return') {
|
|
17
|
+
return {
|
|
18
|
+
knownIds: [node.info.id],
|
|
19
|
+
potentialIds: []
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
case "RFunctionDefinition" /* RType.FunctionDefinition */:
|
|
24
|
+
// do not further investigate
|
|
25
|
+
break;
|
|
26
|
+
case "RForLoop" /* RType.ForLoop */:
|
|
27
|
+
case "RWhileLoop" /* RType.WhileLoop */:
|
|
28
|
+
case "RRepeatLoop" /* RType.RepeatLoop */:
|
|
29
|
+
// loops return invisible null, as we do not trace values, but they may contain return statements
|
|
30
|
+
return visitLoops(node);
|
|
31
|
+
case "RIfThenElse" /* RType.IfThenElse */:
|
|
32
|
+
return visitIf(node);
|
|
33
|
+
case "RPipe" /* RType.Pipe */:
|
|
34
|
+
case "RBinaryOp" /* RType.BinaryOp */:
|
|
35
|
+
// assignments return invisible rhs
|
|
36
|
+
return knownIdsOfChildren(node.info.id, node.lhs, node.rhs);
|
|
37
|
+
case "RUnaryOp" /* RType.UnaryOp */:
|
|
38
|
+
return knownIdsOfChildren(node.info.id, node.operand);
|
|
39
|
+
case "RParameter" /* RType.Parameter */:
|
|
40
|
+
return node.defaultValue ? knownIdsOfChildren(node.info.id, node.defaultValue) : { knownIds: [], potentialIds: [] };
|
|
41
|
+
case "RArgument" /* RType.Argument */:
|
|
42
|
+
return node.value ? knownIdsOfChildren(node.info.id, node.value) : { knownIds: [], potentialIds: [] };
|
|
43
|
+
case "RSymbol" /* RType.Symbol */:
|
|
44
|
+
case "RLogical" /* RType.Logical */:
|
|
45
|
+
case "RNumber" /* RType.Number */:
|
|
46
|
+
case "RString" /* RType.String */:
|
|
47
|
+
case "RAccess" /* RType.Access */:
|
|
48
|
+
// just use this node
|
|
49
|
+
break;
|
|
50
|
+
// contain noting to return/return `invisible(null)`
|
|
51
|
+
case "RComment" /* RType.Comment */:
|
|
52
|
+
case "RLineDirective" /* RType.LineDirective */:
|
|
53
|
+
case "RBreak" /* RType.Break */:
|
|
54
|
+
case "RNext" /* RType.Next */:
|
|
55
|
+
return { knownIds: [], potentialIds: [] };
|
|
56
|
+
default:
|
|
57
|
+
(0, assert_1.assertUnreachable)(type);
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
knownIds: [],
|
|
61
|
+
potentialIds: [node.info.id]
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// we use keepSelfAsPotential in order to track nodes like 2 + 3, which keep themselves as potential exit points if there are no knownIds
|
|
65
|
+
function knownIdsOfChildren(keepSelfAsPotential, ...children) {
|
|
66
|
+
const knownIds = children.flatMap(child => visitExitPoints(child).knownIds);
|
|
67
|
+
return {
|
|
68
|
+
knownIds,
|
|
69
|
+
potentialIds: knownIds.length === 0 ? [keepSelfAsPotential] : []
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function visitLoops(loop) {
|
|
73
|
+
const result = visitExitPoints(loop.body);
|
|
74
|
+
// conditions may contain return statements which we have to keep
|
|
75
|
+
let otherKnownIds = [];
|
|
76
|
+
if (loop.type === "RForLoop" /* RType.ForLoop */) {
|
|
77
|
+
otherKnownIds = visitExitPoints(loop.variable).knownIds;
|
|
78
|
+
otherKnownIds.push(...visitExitPoints(loop.vector).knownIds);
|
|
79
|
+
}
|
|
80
|
+
else if (loop.type === "RWhileLoop" /* RType.WhileLoop */) {
|
|
81
|
+
otherKnownIds = visitExitPoints(loop.condition).knownIds;
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
knownIds: [...result.knownIds, ...otherKnownIds],
|
|
85
|
+
potentialIds: []
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function visitExpressionList(node) {
|
|
89
|
+
const known = [];
|
|
90
|
+
let lastPotentialIds = [];
|
|
91
|
+
// we only keep the potential ids of the last expression, which is no comment
|
|
92
|
+
for (const child of node.children) {
|
|
93
|
+
const { knownIds, potentialIds } = visitExitPoints(child);
|
|
94
|
+
known.push(...knownIds);
|
|
95
|
+
if (child.type !== "RComment" /* RType.Comment */) {
|
|
96
|
+
lastPotentialIds = potentialIds;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
knownIds: known,
|
|
101
|
+
potentialIds: lastPotentialIds
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function visitIf(node) {
|
|
105
|
+
// conditions can contain return statements
|
|
106
|
+
const known = visitExitPoints(node.condition).knownIds;
|
|
107
|
+
const potential = [];
|
|
108
|
+
const thenCase = visitExitPoints(node.then);
|
|
109
|
+
known.push(...thenCase.knownIds);
|
|
110
|
+
potential.push(...thenCase.potentialIds);
|
|
111
|
+
if (node.otherwise !== undefined) {
|
|
112
|
+
const otherwiseCase = visitExitPoints(node.otherwise);
|
|
113
|
+
known.push(...otherwiseCase.knownIds);
|
|
114
|
+
potential.push(...otherwiseCase.potentialIds);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
knownIds: known,
|
|
118
|
+
potentialIds: potential
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=exit-points.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DataflowInformation } from '../../info';
|
|
2
|
+
import { DataflowProcessorInformation } from '../../../processor';
|
|
3
|
+
import { ParentInformation, RFunctionCall } from '../../../../r-bridge';
|
|
4
|
+
export declare const UnnamedFunctionCallPrefix = "unnamed-function-call-";
|
|
5
|
+
export declare function processFunctionCall<OtherInfo>(functionCall: RFunctionCall<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|