@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,54 @@
|
|
|
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("../../../common/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
|
+
let 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
|
+
data = { ...data, environments };
|
|
20
|
+
const processedAccess = (0, processor_1.processDataflowFor)(access, data);
|
|
21
|
+
nextGraph.mergeWith(processedAccess.graph);
|
|
22
|
+
// outgoing.push()
|
|
23
|
+
// we link to *out* instead of *in*, as access uses arguments for parsing and the arguments are defined
|
|
24
|
+
for (const newIn of [...processedAccess.out, ...processedAccess.unknownReferences]) {
|
|
25
|
+
for (const accessedNode of accessedNodes) {
|
|
26
|
+
nextGraph.addEdge(accessedNode, newIn, graph_1.EdgeType.Reads, 'always');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
ingoing.push(...processedAccess.in, ...processedAccess.unknownReferences);
|
|
30
|
+
environments = processedAccess.environments;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
/*
|
|
35
|
+
* keep active nodes in case of assignments etc.
|
|
36
|
+
* We make them maybe as a kind of hack.
|
|
37
|
+
* This way when using
|
|
38
|
+
* ```ts
|
|
39
|
+
* a[[1]] <- 3
|
|
40
|
+
* a[[2]] <- 4
|
|
41
|
+
* a
|
|
42
|
+
* ```
|
|
43
|
+
* the read for a will use both accesses as potential definitions and not just the last one!
|
|
44
|
+
*/
|
|
45
|
+
unknownReferences: (0, environments_1.makeAllMaybe)(processedAccessed.unknownReferences, nextGraph, environments),
|
|
46
|
+
in: ingoing,
|
|
47
|
+
out: outgoing,
|
|
48
|
+
environments: environments,
|
|
49
|
+
scope: data.activeScope,
|
|
50
|
+
graph: nextGraph
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
exports.processAccess = processAccess;
|
|
54
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1,154 @@
|
|
|
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("../../../common/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 the 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.initializeCleanDataflowInformation)(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
|
+
// we should track returns more consistently
|
|
107
|
+
if (n.type === "RNext" /* RType.Next */ || n.type === "RBreak" /* RType.Break */) {
|
|
108
|
+
foundNextOrBreak = true;
|
|
109
|
+
}
|
|
110
|
+
return n.type === "RForLoop" /* RType.ForLoop */ || n.type === "RWhileLoop" /* RType.WhileLoop */ || n.type === "RRepeatLoop" /* RType.RepeatLoop */ || n.type === "RFunctionDefinition" /* RType.FunctionDefinition */;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// 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
|
|
114
|
+
// update the environments for the next iteration with the previous writes
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- seems to be a bug in eslint
|
|
116
|
+
if (foundNextOrBreak) {
|
|
117
|
+
processed.out = (0, environments_1.makeAllMaybe)(processed.out, nextGraph, processed.environments);
|
|
118
|
+
processed.in = (0, environments_1.makeAllMaybe)(processed.in, nextGraph, processed.environments);
|
|
119
|
+
processed.unknownReferences = (0, environments_1.makeAllMaybe)(processed.unknownReferences, nextGraph, processed.environments);
|
|
120
|
+
}
|
|
121
|
+
nextGraph.mergeWith(processed.graph);
|
|
122
|
+
out.push(...processed.out);
|
|
123
|
+
index_1.dataflowLogger.trace(`expression ${expressionCounter} of ${expressions.length} has ${processed.unknownReferences.length} unknown nodes`);
|
|
124
|
+
processNextExpression(processed, data, environments, listEnvironments, remainingRead, nextGraph);
|
|
125
|
+
const functionCallIds = [...processed.graph.vertices(true)]
|
|
126
|
+
.filter(([_, info]) => info.tag === 'function-call');
|
|
127
|
+
const calledEnvs = (0, linker_1.linkFunctionCalls)(nextGraph, data.completeAst.idMap, functionCallIds, processed.graph);
|
|
128
|
+
if (foundNextOrBreak) {
|
|
129
|
+
environments = (0, environments_1.overwriteEnvironments)(environments, processed.environments);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
environments = processed.environments;
|
|
133
|
+
}
|
|
134
|
+
// if the called function has global redefinitions, we have to keep them within our environment
|
|
135
|
+
environments = updateSideEffectsForCalledFunctions(calledEnvs, environments, nextGraph);
|
|
136
|
+
for (const { nodeId } of processed.out) {
|
|
137
|
+
listEnvironments.add(nodeId);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// now, we have to link same reads
|
|
141
|
+
(0, linker_1.linkReadVariablesInSameScopeWithNames)(nextGraph, new defaultmap_1.DefaultMap(() => [], remainingRead));
|
|
142
|
+
index_1.dataflowLogger.trace(`expression list exits with ${remainingRead.size} remaining read names`);
|
|
143
|
+
return {
|
|
144
|
+
/* no active nodes remain, they are consumed within the remaining read collection */
|
|
145
|
+
unknownReferences: [],
|
|
146
|
+
in: [...remainingRead.values()].flat(),
|
|
147
|
+
out,
|
|
148
|
+
environments,
|
|
149
|
+
scope: data.activeScope,
|
|
150
|
+
graph: nextGraph
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
exports.processExpressionList = processExpressionList;
|
|
154
|
+
//# sourceMappingURL=expression-list.js.map
|
|
@@ -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("../../../../common/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,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retrieveExitPointsOfFunctionDefinition = void 0;
|
|
4
|
+
const assert_1 = require("../../../../../util/assert");
|
|
5
|
+
// TODO: wir wollen exit points für alle expression lists nicht nur für function definitions -> wir schlagen alle mit einer klappe :3
|
|
6
|
+
function retrieveExitPointsOfFunctionDefinition(functionDefinition) {
|
|
7
|
+
const exitPoints = visitExitPoints(functionDefinition.body);
|
|
8
|
+
return exitPoints.knownIds.concat(exitPoints.potentialIds);
|
|
9
|
+
}
|
|
10
|
+
exports.retrieveExitPointsOfFunctionDefinition = retrieveExitPointsOfFunctionDefinition;
|
|
11
|
+
// TODO: fold
|
|
12
|
+
function visitExitPoints(node) {
|
|
13
|
+
const type = node.type;
|
|
14
|
+
switch (type) {
|
|
15
|
+
case "RExpressionList" /* RType.ExpressionList */:
|
|
16
|
+
return visitExpressionList(node);
|
|
17
|
+
case "RFunctionCall" /* RType.FunctionCall */:
|
|
18
|
+
// TODO: what if return is overwritten
|
|
19
|
+
if (node.flavor === 'named' && node.functionName.content === 'return') {
|
|
20
|
+
return {
|
|
21
|
+
knownIds: [node.info.id],
|
|
22
|
+
potentialIds: []
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
break;
|
|
26
|
+
case "RFunctionDefinition" /* RType.FunctionDefinition */:
|
|
27
|
+
// do not further investigate
|
|
28
|
+
break;
|
|
29
|
+
case "RForLoop" /* RType.ForLoop */:
|
|
30
|
+
case "RWhileLoop" /* RType.WhileLoop */:
|
|
31
|
+
case "RRepeatLoop" /* RType.RepeatLoop */:
|
|
32
|
+
// loops return invisible null, as we do not trace values, but they may contain return statements
|
|
33
|
+
return visitLoops(node);
|
|
34
|
+
case "RIfThenElse" /* RType.IfThenElse */:
|
|
35
|
+
return visitIf(node);
|
|
36
|
+
case "RPipe" /* RType.Pipe */:
|
|
37
|
+
case "RBinaryOp" /* RType.BinaryOp */:
|
|
38
|
+
// assignments return invisible rhs
|
|
39
|
+
return knownIdsOfChildren(node.info.id, node.lhs, node.rhs);
|
|
40
|
+
case "RUnaryOp" /* RType.UnaryOp */:
|
|
41
|
+
return knownIdsOfChildren(node.info.id, node.operand);
|
|
42
|
+
case "RParameter" /* RType.Parameter */:
|
|
43
|
+
return node.defaultValue ? knownIdsOfChildren(node.info.id, node.defaultValue) : { knownIds: [], potentialIds: [] };
|
|
44
|
+
case "RArgument" /* RType.Argument */:
|
|
45
|
+
return node.value ? knownIdsOfChildren(node.info.id, node.value) : { knownIds: [], potentialIds: [] };
|
|
46
|
+
case "RSymbol" /* RType.Symbol */:
|
|
47
|
+
case "RLogical" /* RType.Logical */:
|
|
48
|
+
case "RNumber" /* RType.Number */:
|
|
49
|
+
case "RString" /* RType.String */:
|
|
50
|
+
case "RAccess" /* RType.Access */:
|
|
51
|
+
// just use this node
|
|
52
|
+
break;
|
|
53
|
+
// contain noting to return/return `invisible(null)`
|
|
54
|
+
case "RComment" /* RType.Comment */:
|
|
55
|
+
case "RLineDirective" /* RType.LineDirective */:
|
|
56
|
+
case "RBreak" /* RType.Break */:
|
|
57
|
+
case "RNext" /* RType.Next */:
|
|
58
|
+
// TODO: wrong for loops
|
|
59
|
+
return { knownIds: [], potentialIds: [] };
|
|
60
|
+
default:
|
|
61
|
+
(0, assert_1.assertUnreachable)(type);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
knownIds: [],
|
|
65
|
+
potentialIds: [node.info.id]
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// we use keepSelfAsPotential in order to track nodes like 2 + 3, which keep themselves as potential exit points if there are no knownIds
|
|
69
|
+
function knownIdsOfChildren(keepSelfAsPotential, ...children) {
|
|
70
|
+
const knownIds = children.flatMap(child => visitExitPoints(child).knownIds);
|
|
71
|
+
return {
|
|
72
|
+
knownIds,
|
|
73
|
+
potentialIds: knownIds.length === 0 ? [keepSelfAsPotential] : []
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function visitLoops(loop) {
|
|
77
|
+
const result = visitExitPoints(loop.body);
|
|
78
|
+
// conditions may contain return statements which we have to keep
|
|
79
|
+
let otherKnownIds = [];
|
|
80
|
+
if (loop.type === "RForLoop" /* RType.ForLoop */) {
|
|
81
|
+
otherKnownIds = visitExitPoints(loop.variable).knownIds;
|
|
82
|
+
otherKnownIds.push(...visitExitPoints(loop.vector).knownIds);
|
|
83
|
+
}
|
|
84
|
+
else if (loop.type === "RWhileLoop" /* RType.WhileLoop */) {
|
|
85
|
+
otherKnownIds = visitExitPoints(loop.condition).knownIds;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
knownIds: [...result.knownIds, ...otherKnownIds],
|
|
89
|
+
potentialIds: []
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function visitExpressionList(node) {
|
|
93
|
+
const known = [];
|
|
94
|
+
let lastPotentialIds = [];
|
|
95
|
+
// we only keep the potential ids of the last expression, which is no comment
|
|
96
|
+
for (const child of node.children) {
|
|
97
|
+
const { knownIds, potentialIds } = visitExitPoints(child);
|
|
98
|
+
known.push(...knownIds);
|
|
99
|
+
if (child.type !== "RComment" /* RType.Comment */) {
|
|
100
|
+
lastPotentialIds = potentialIds;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
knownIds: known,
|
|
105
|
+
potentialIds: lastPotentialIds
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function visitIf(node) {
|
|
109
|
+
// conditions can contain return statements
|
|
110
|
+
const known = visitExitPoints(node.condition).knownIds;
|
|
111
|
+
const potential = [];
|
|
112
|
+
const thenCase = visitExitPoints(node.then);
|
|
113
|
+
known.push(...thenCase.knownIds);
|
|
114
|
+
potential.push(...thenCase.potentialIds);
|
|
115
|
+
if (node.otherwise !== undefined) {
|
|
116
|
+
const otherwiseCase = visitExitPoints(node.otherwise);
|
|
117
|
+
known.push(...otherwiseCase.knownIds);
|
|
118
|
+
potential.push(...otherwiseCase.potentialIds);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
knownIds: known,
|
|
122
|
+
potentialIds: potential
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=exit-points.js.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processFunctionCall = exports.UnnamedFunctionCallPrefix = void 0;
|
|
4
|
+
const processor_1 = require("../../../processor");
|
|
5
|
+
const environments_1 = require("../../../../common/environments");
|
|
6
|
+
const assert_1 = require("../../../../../util/assert");
|
|
7
|
+
const index_1 = require("../../../index");
|
|
8
|
+
const linker_1 = require("../../linker");
|
|
9
|
+
const scopes_1 = require("../../../../common/environments/scopes");
|
|
10
|
+
exports.UnnamedFunctionCallPrefix = 'unnamed-function-call-';
|
|
11
|
+
function processFunctionCall(functionCall, data) {
|
|
12
|
+
const named = functionCall.flavor === 'named';
|
|
13
|
+
const functionName = (0, processor_1.processDataflowFor)(named ? functionCall.functionName : functionCall.calledFunction, data);
|
|
14
|
+
let finalEnv = functionName.environments;
|
|
15
|
+
// arg env contains the environments with other args defined
|
|
16
|
+
let argEnv = functionName.environments;
|
|
17
|
+
const finalGraph = new index_1.DataflowGraph();
|
|
18
|
+
const callArgs = [];
|
|
19
|
+
const args = [];
|
|
20
|
+
const remainingReadInArgs = [];
|
|
21
|
+
const functionRootId = functionCall.info.id;
|
|
22
|
+
let functionCallName;
|
|
23
|
+
if (named) {
|
|
24
|
+
functionCallName = functionCall.functionName.content;
|
|
25
|
+
index_1.dataflowLogger.debug(`Using ${functionRootId} (name: ${functionCallName}) as root for the function call`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
functionCallName = `${exports.UnnamedFunctionCallPrefix}${functionRootId}`;
|
|
29
|
+
index_1.dataflowLogger.debug(`Using ${functionRootId} as root for the unnamed function call`);
|
|
30
|
+
// we know, that it calls the toplevel:
|
|
31
|
+
finalGraph.addEdge(functionRootId, functionCall.calledFunction.info.id, index_1.EdgeType.Calls, 'always');
|
|
32
|
+
// keep the defined function
|
|
33
|
+
finalGraph.mergeWith(functionName.graph);
|
|
34
|
+
}
|
|
35
|
+
for (const arg of functionCall.arguments) {
|
|
36
|
+
if (arg === undefined) {
|
|
37
|
+
callArgs.push('empty');
|
|
38
|
+
args.push(undefined);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const processed = (0, processor_1.processDataflowFor)(arg, { ...data, environments: argEnv });
|
|
42
|
+
args.push(processed);
|
|
43
|
+
finalEnv = (0, environments_1.overwriteEnvironments)(finalEnv, processed.environments);
|
|
44
|
+
argEnv = (0, environments_1.overwriteEnvironments)(argEnv, processed.environments);
|
|
45
|
+
finalGraph.mergeWith(processed.graph);
|
|
46
|
+
(0, assert_1.guard)(processed.out.length > 0, () => `Argument ${JSON.stringify(arg)} has no out references, but needs one for the unnamed arg`);
|
|
47
|
+
if (arg.type !== "RArgument" /* RType.Argument */ || !arg.name) {
|
|
48
|
+
callArgs.push(processed.out[0]);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
callArgs.push([arg.name.content, processed.out[0]]);
|
|
52
|
+
}
|
|
53
|
+
// add an argument edge to the final graph
|
|
54
|
+
finalGraph.addEdge(functionRootId, processed.out[0], index_1.EdgeType.Argument, 'always');
|
|
55
|
+
// resolve reads within argument
|
|
56
|
+
for (const ingoing of [...processed.in, ...processed.unknownReferences]) {
|
|
57
|
+
const tryToResolve = (0, environments_1.resolveByName)(ingoing.name, scopes_1.LocalScope, argEnv);
|
|
58
|
+
if (tryToResolve === undefined) {
|
|
59
|
+
remainingReadInArgs.push(ingoing);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (const resolved of tryToResolve) {
|
|
63
|
+
finalGraph.addEdge(ingoing.nodeId, resolved.nodeId, index_1.EdgeType.Reads, 'always');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (arg.type === "RArgument" /* RType.Argument */ && arg.name !== undefined) {
|
|
68
|
+
argEnv = (0, environments_1.define)({ ...processed.out[0], definedAt: arg.info.id, kind: 'argument' }, scopes_1.LocalScope, argEnv);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
finalGraph.addVertex({
|
|
72
|
+
tag: 'function-call',
|
|
73
|
+
id: functionRootId,
|
|
74
|
+
name: functionCallName,
|
|
75
|
+
environment: data.environments,
|
|
76
|
+
when: 'always',
|
|
77
|
+
scope: data.activeScope,
|
|
78
|
+
args: callArgs // same reference
|
|
79
|
+
});
|
|
80
|
+
const inIds = remainingReadInArgs;
|
|
81
|
+
inIds.push({ nodeId: functionRootId, name: functionCallName, scope: data.activeScope, used: 'always' });
|
|
82
|
+
if (!named) {
|
|
83
|
+
if (functionCall.calledFunction.type === "RFunctionDefinition" /* RType.FunctionDefinition */) {
|
|
84
|
+
(0, linker_1.linkArgumentsOnCall)(callArgs, functionCall.calledFunction.parameters, finalGraph);
|
|
85
|
+
}
|
|
86
|
+
// push the called function to the ids:
|
|
87
|
+
inIds.push(...functionName.in, ...functionName.unknownReferences);
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
unknownReferences: [],
|
|
91
|
+
in: inIds,
|
|
92
|
+
out: functionName.out, // we do not keep argument out as it has been linked by the function
|
|
93
|
+
graph: finalGraph,
|
|
94
|
+
environments: finalEnv,
|
|
95
|
+
scope: data.activeScope
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
exports.processFunctionCall = processFunctionCall;
|
|
99
|
+
//# sourceMappingURL=function-call.js.map
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processFunctionDefinition = void 0;
|
|
4
|
+
const processor_1 = require("../../../processor");
|
|
5
|
+
const environments_1 = require("../../../../common/environments");
|
|
6
|
+
const linker_1 = require("../../linker");
|
|
7
|
+
const index_1 = require("../../../index");
|
|
8
|
+
const r_bridge_1 = require("../../../../../r-bridge");
|
|
9
|
+
const exit_points_1 = require("./exit-points");
|
|
10
|
+
const assert_1 = require("../../../../../util/assert");
|
|
11
|
+
const scopes_1 = require("../../../../common/environments/scopes");
|
|
12
|
+
function updateNestedFunctionClosures(exitPoints, subgraph, outEnvironment, data, functionDefinition) {
|
|
13
|
+
// track *all* function definitions - included those nested within the current graph
|
|
14
|
+
// try to resolve their 'in' by only using the lowest scope which will be popped after this definition
|
|
15
|
+
for (const [id, info] of subgraph.vertices(true)) {
|
|
16
|
+
if (info.tag !== 'function-definition') {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const ingoingRefs = info.subflow.in;
|
|
20
|
+
const remainingIn = [];
|
|
21
|
+
for (const ingoing of ingoingRefs) {
|
|
22
|
+
for (const exitPoint of exitPoints) {
|
|
23
|
+
const node = subgraph.get(exitPoint, true);
|
|
24
|
+
const env = (0, environments_1.initializeCleanEnvironments)();
|
|
25
|
+
env.current.memory = node === undefined ? outEnvironment.current.memory : node[0].environment.current.memory;
|
|
26
|
+
const resolved = (0, environments_1.resolveByName)(ingoing.name, data.activeScope, env);
|
|
27
|
+
if (resolved === undefined) {
|
|
28
|
+
remainingIn.push(ingoing);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
index_1.dataflowLogger.trace(`Found ${resolved.length} references to open ref ${id} in closure of function definition ${functionDefinition.info.id}`);
|
|
32
|
+
for (const ref of resolved) {
|
|
33
|
+
subgraph.addEdge(ingoing, ref, index_1.EdgeType.Reads, exitPoints.length > 1 ? 'maybe' : 'always');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
index_1.dataflowLogger.trace(`Keeping ${remainingIn.length} references to open ref ${id} in closure of function definition ${functionDefinition.info.id}`);
|
|
38
|
+
info.subflow.in = [...new Set(remainingIn)];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function prepareFunctionEnvironment(data) {
|
|
42
|
+
let env = (0, environments_1.initializeCleanEnvironments)();
|
|
43
|
+
for (let i = 0; i < data.environments.level + 1 /* add another env */; i++) {
|
|
44
|
+
env = (0, environments_1.pushLocalEnvironment)(env);
|
|
45
|
+
}
|
|
46
|
+
return { ...data, environments: env };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Within something like `f <- function(a=b, m=3) { b <- 1; a; b <- 5; a + 1 }`
|
|
50
|
+
* `a` will be defined by `b` and `b`will be a promise object bound by the first definition of b it can find.
|
|
51
|
+
* This means, that this function returns `2` due to the first `b <- 1` definition.
|
|
52
|
+
* If the code would be `f <- function(a=b, m=3) { if(m > 3) { b <- 1; }; a; b <- 5; a + 1 }`, we need a link to `b <- 1` and `b <- 6`
|
|
53
|
+
* as `b` can be defined by either one of them.
|
|
54
|
+
* <p>
|
|
55
|
+
* <b>Currently we may be unable to narrow down every definition within the body as we have not implemented ways to track what covers a first definitions</b>
|
|
56
|
+
*/
|
|
57
|
+
function findPromiseLinkagesForParameters(parameters, readInParameters, parameterEnvs, body) {
|
|
58
|
+
// first we try to bind again within parameters - if we have it, fine
|
|
59
|
+
const remainingRead = [];
|
|
60
|
+
for (const read of readInParameters) {
|
|
61
|
+
const resolved = (0, environments_1.resolveByName)(read.name, scopes_1.LocalScope, parameterEnvs);
|
|
62
|
+
if (resolved !== undefined) {
|
|
63
|
+
for (const ref of resolved) {
|
|
64
|
+
parameters.addEdge(read, ref, index_1.EdgeType.Reads, 'always');
|
|
65
|
+
}
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// if not resolved, link all outs within the body as potential reads
|
|
69
|
+
// regarding the sort we can ignore equality as nodeIds are unique
|
|
70
|
+
// we sort to get the lowest id - if it is an 'always' flag we can safely use it instead of all of them
|
|
71
|
+
const writingOuts = body.out.filter(o => o.name === read.name).sort((a, b) => a.nodeId < b.nodeId ? 1 : -1);
|
|
72
|
+
if (writingOuts.length === 0) {
|
|
73
|
+
remainingRead.push(read);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (writingOuts[0].used === 'always') {
|
|
77
|
+
parameters.addEdge(read, writingOuts[0], index_1.EdgeType.Reads, 'always');
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
for (const out of writingOuts) {
|
|
81
|
+
parameters.addEdge(read, out, index_1.EdgeType.Reads, 'maybe');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return remainingRead;
|
|
85
|
+
}
|
|
86
|
+
function processFunctionDefinition(functionDefinition, data) {
|
|
87
|
+
index_1.dataflowLogger.trace(`Processing function definition with id ${functionDefinition.info.id}`);
|
|
88
|
+
const originalEnvironments = data.environments;
|
|
89
|
+
// within a function def we do not pass on the outer binds as they could be overwritten when called
|
|
90
|
+
data = prepareFunctionEnvironment(data);
|
|
91
|
+
const subgraph = new index_1.DataflowGraph();
|
|
92
|
+
let readInParameters = [];
|
|
93
|
+
for (const param of functionDefinition.parameters) {
|
|
94
|
+
const processed = (0, processor_1.processDataflowFor)(param, data);
|
|
95
|
+
subgraph.mergeWith(processed.graph);
|
|
96
|
+
const read = [...processed.in, ...processed.unknownReferences];
|
|
97
|
+
(0, linker_1.linkInputs)(read, data.activeScope, data.environments, readInParameters, subgraph, false);
|
|
98
|
+
data = { ...data, environments: (0, environments_1.overwriteEnvironments)(data.environments, processed.environments) };
|
|
99
|
+
}
|
|
100
|
+
const paramsEnvironments = data.environments;
|
|
101
|
+
const body = (0, processor_1.processDataflowFor)(functionDefinition.body, data);
|
|
102
|
+
// as we know, that parameters can not duplicate, we overwrite their environments (which is the correct behavior, if someone uses non-`=` arguments in functions)
|
|
103
|
+
const bodyEnvironment = body.environments;
|
|
104
|
+
readInParameters = findPromiseLinkagesForParameters(subgraph, readInParameters, paramsEnvironments, body);
|
|
105
|
+
const readInBody = [...body.in, ...body.unknownReferences];
|
|
106
|
+
// there is no uncertainty regarding the arguments, as if a function header is executed, so is its body
|
|
107
|
+
const remainingRead = (0, linker_1.linkInputs)(readInBody, data.activeScope, paramsEnvironments, readInParameters.slice(), body.graph, true /* functions do not have to be called */);
|
|
108
|
+
subgraph.mergeWith(body.graph);
|
|
109
|
+
index_1.dataflowLogger.trace(`Function definition with id ${functionDefinition.info.id} has ${remainingRead.length} remaining reads`);
|
|
110
|
+
// link same-def-def with arguments
|
|
111
|
+
for (const writeTarget of body.out) {
|
|
112
|
+
const writeName = writeTarget.name;
|
|
113
|
+
const resolved = (0, environments_1.resolveByName)(writeName, data.activeScope, paramsEnvironments);
|
|
114
|
+
if (resolved !== undefined) {
|
|
115
|
+
// write-write
|
|
116
|
+
for (const target of resolved) {
|
|
117
|
+
subgraph.addEdge(target, writeTarget, index_1.EdgeType.SameDefDef, undefined, true);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const outEnvironment = (0, environments_1.overwriteEnvironments)(paramsEnvironments, bodyEnvironment);
|
|
122
|
+
for (const read of remainingRead) {
|
|
123
|
+
subgraph.addVertex({ tag: 'use', id: read.nodeId, name: read.name, environment: outEnvironment, when: 'maybe' });
|
|
124
|
+
}
|
|
125
|
+
const flow = {
|
|
126
|
+
unknownReferences: [],
|
|
127
|
+
in: remainingRead,
|
|
128
|
+
out: [],
|
|
129
|
+
graph: new Set(subgraph.rootIds()),
|
|
130
|
+
environments: outEnvironment,
|
|
131
|
+
scope: data.activeScope
|
|
132
|
+
};
|
|
133
|
+
const exitPoints = (0, exit_points_1.retrieveExitPointsOfFunctionDefinition)(functionDefinition);
|
|
134
|
+
// if exit points are extra, we must link them to all dataflow nodes they relate to.
|
|
135
|
+
linkExitPointsInGraph(exitPoints, subgraph, data.completeAst.idMap, outEnvironment);
|
|
136
|
+
updateNestedFunctionClosures(exitPoints, subgraph, outEnvironment, data, functionDefinition);
|
|
137
|
+
const graph = new index_1.DataflowGraph().mergeWith(subgraph, false);
|
|
138
|
+
graph.addVertex({
|
|
139
|
+
tag: 'function-definition',
|
|
140
|
+
id: functionDefinition.info.id,
|
|
141
|
+
name: functionDefinition.info.id,
|
|
142
|
+
environment: (0, environments_1.popLocalEnvironment)(outEnvironment),
|
|
143
|
+
scope: data.activeScope,
|
|
144
|
+
when: 'always',
|
|
145
|
+
subflow: flow,
|
|
146
|
+
exitPoints
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
unknownReferences: [] /* nothing escapes a function definition, but the function itself, will be forced in assignment: { nodeId: functionDefinition.info.id, scope: data.activeScope, used: 'always', name: functionDefinition.info.id as string } */,
|
|
150
|
+
in: [],
|
|
151
|
+
out: [],
|
|
152
|
+
graph,
|
|
153
|
+
environments: originalEnvironments,
|
|
154
|
+
scope: data.activeScope
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
exports.processFunctionDefinition = processFunctionDefinition;
|
|
158
|
+
function linkExitPointsInGraph(exitPoints, graph, idMap, environment) {
|
|
159
|
+
for (const exitPoint of exitPoints) {
|
|
160
|
+
const exitPointNode = graph.get(exitPoint, true);
|
|
161
|
+
// if there already is an exit point it is either a variable or already linked
|
|
162
|
+
if (exitPointNode !== undefined) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const nodeInAst = idMap.get(exitPoint);
|
|
166
|
+
(0, assert_1.guard)(nodeInAst !== undefined, `Could not find exit point node with id ${exitPoint} in ast`);
|
|
167
|
+
graph.addVertex({ tag: 'exit-point', id: exitPoint, name: `${nodeInAst.lexeme ?? '??'}`, when: 'always', environment });
|
|
168
|
+
const allIds = [...(0, r_bridge_1.collectAllIds)(nodeInAst)].filter(id => graph.get(id, true) !== undefined);
|
|
169
|
+
for (const relatedId of allIds) {
|
|
170
|
+
if (relatedId !== exitPoint) {
|
|
171
|
+
graph.addEdge(exitPoint, relatedId, index_1.EdgeType.Relates, 'always');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=function-definition.js.map
|