@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,298 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataflowGraph = void 0;
|
|
4
|
+
const assert_1 = require("../../../util/assert");
|
|
5
|
+
const environments_1 = require("../../common/environments");
|
|
6
|
+
const log_1 = require("../../../util/log");
|
|
7
|
+
const edge_1 = require("./edge");
|
|
8
|
+
const diff_1 = require("./diff");
|
|
9
|
+
/**
|
|
10
|
+
* The dataflow graph holds the dataflow information found within the given AST.
|
|
11
|
+
* We differentiate the directed edges in {@link EdgeType} and the vertices indicated by {@link DataflowGraphVertexArgument}
|
|
12
|
+
*
|
|
13
|
+
* The vertices of the graph are organized in a hierarchical fashion, with a function-definition node containing the node ids of its subgraph.
|
|
14
|
+
* However, all *edges* are hoisted at the top level in the form of an (attributed) adjacency list.
|
|
15
|
+
* After the dataflow analysis, all sources and targets of the edges *must* be part of the vertices.
|
|
16
|
+
* However, this does not have to hold during the construction as edges may point from or to vertices which are yet to be constructed.
|
|
17
|
+
*
|
|
18
|
+
* All methods return the modified graph to allow for chaining.
|
|
19
|
+
*/
|
|
20
|
+
class DataflowGraph {
|
|
21
|
+
static DEFAULT_ENVIRONMENT = (0, environments_1.initializeCleanEnvironments)();
|
|
22
|
+
/** Contains the vertices of the root level graph (i.e., included those vertices from the complete graph, that are nested within function definitions) */
|
|
23
|
+
rootVertices = new Set();
|
|
24
|
+
/** All vertices in the complete graph (including those nested in function definition) */
|
|
25
|
+
vertexInformation = new Map();
|
|
26
|
+
/** All edges in the complete graph (including those nested in function definition) */
|
|
27
|
+
edgeInformation = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* Get the {@link DataflowGraphVertexInfo} attached to a node as well as all outgoing edges.
|
|
30
|
+
*
|
|
31
|
+
* @param id - The id of the node to get
|
|
32
|
+
* @param includeDefinedFunctions - If true this will search function definitions as well and not just the toplevel
|
|
33
|
+
* @returns the node info for the given id (if it exists)
|
|
34
|
+
*/
|
|
35
|
+
get(id, includeDefinedFunctions = true) {
|
|
36
|
+
// if we do not want to include function definitions, only retrieve the value if the id is part of the root vertices
|
|
37
|
+
const vertex = includeDefinedFunctions || this.rootVertices.has(id) ? this.vertexInformation.get(id) : undefined;
|
|
38
|
+
return vertex === undefined ? undefined : [vertex, this.outgoingEdges(id) ?? new Map()];
|
|
39
|
+
}
|
|
40
|
+
outgoingEdges(id) {
|
|
41
|
+
return this.edgeInformation.get(id);
|
|
42
|
+
}
|
|
43
|
+
ingoingEdges(id) {
|
|
44
|
+
const edges = new Map();
|
|
45
|
+
for (const [source, outgoing] of this.edgeInformation.entries()) {
|
|
46
|
+
if (outgoing.has(id)) {
|
|
47
|
+
edges.set(source, outgoing.get(id));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return edges;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @param includeDefinedFunctions - If true this will iterate over function definitions as well and not just the toplevel
|
|
54
|
+
* @returns the ids of all toplevel vertices in the graph together with their vertex information
|
|
55
|
+
*
|
|
56
|
+
* @see #edges
|
|
57
|
+
*/
|
|
58
|
+
*vertices(includeDefinedFunctions) {
|
|
59
|
+
if (includeDefinedFunctions) {
|
|
60
|
+
yield* this.vertexInformation.entries();
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
for (const id of this.rootVertices) {
|
|
64
|
+
yield [id, this.vertexInformation.get(id)];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* @returns the ids of all edges in the graph together with their edge information
|
|
70
|
+
*
|
|
71
|
+
* @see #vertices
|
|
72
|
+
*/
|
|
73
|
+
*edges() {
|
|
74
|
+
yield* this.edgeInformation.entries();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns true if the graph contains a node with the given id.
|
|
78
|
+
*
|
|
79
|
+
* @param id - The id to check for
|
|
80
|
+
* @param includeDefinedFunctions - If true this will check function definitions as well and not just the toplevel
|
|
81
|
+
*/
|
|
82
|
+
hasNode(id, includeDefinedFunctions) {
|
|
83
|
+
return includeDefinedFunctions ? this.vertexInformation.has(id) : this.rootVertices.has(id);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Returns true if the root level of the graph contains a node with the given id.
|
|
87
|
+
*/
|
|
88
|
+
isRoot(id) {
|
|
89
|
+
return this.rootVertices.has(id);
|
|
90
|
+
}
|
|
91
|
+
rootIds() {
|
|
92
|
+
return this.rootVertices;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Adds a new vertex to the graph, for ease of use, some arguments are optional and filled automatically.
|
|
96
|
+
*
|
|
97
|
+
* @param vertex - The vertex to add
|
|
98
|
+
* @param asRoot - If false, this will only add the vertex but do not add it to the {@link rootIds | root vertices} of the graph.
|
|
99
|
+
* This is probably only of use, when you construct dataflow graphs for tests.
|
|
100
|
+
*
|
|
101
|
+
* @see DataflowGraphVertexInfo
|
|
102
|
+
* @see DataflowGraphVertexArgument
|
|
103
|
+
*/
|
|
104
|
+
addVertex(vertex, asRoot = true) {
|
|
105
|
+
const oldVertex = this.vertexInformation.get(vertex.id);
|
|
106
|
+
if (oldVertex !== undefined) {
|
|
107
|
+
(0, assert_1.guard)(oldVertex.name === vertex.name, 'vertex names must match for the same id if added');
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
// keep a clone of the original environment
|
|
111
|
+
const environment = vertex.environment === undefined ? DataflowGraph.DEFAULT_ENVIRONMENT : (0, environments_1.cloneEnvironments)(vertex.environment);
|
|
112
|
+
this.vertexInformation.set(vertex.id, {
|
|
113
|
+
...vertex,
|
|
114
|
+
when: vertex.when ?? 'always',
|
|
115
|
+
environment
|
|
116
|
+
});
|
|
117
|
+
if (asRoot) {
|
|
118
|
+
this.rootVertices.add(vertex.id);
|
|
119
|
+
}
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Will insert a new edge into the graph,
|
|
124
|
+
* if the direction of the edge is of no importance (`same-read-read` or `same-def-def`), source
|
|
125
|
+
* and target will be sorted so that `from` has the lower, and `to` the higher id (default ordering).
|
|
126
|
+
* <p>
|
|
127
|
+
* If you omit the last argument but set promote, this will make the edge `maybe` if at least one of the {@link IdentifierReference | references} or {@link DataflowGraphVertexInfo | nodes} has a used flag of `maybe`.
|
|
128
|
+
* Promote will probably only be used internally and not by tests etc.
|
|
129
|
+
*/
|
|
130
|
+
addEdge(from, to, type, attribute, promote = false) {
|
|
131
|
+
const fromId = typeof from === 'object' ? from.nodeId : from;
|
|
132
|
+
const toId = typeof to === 'object' ? to.nodeId : to;
|
|
133
|
+
if (fromId === toId) {
|
|
134
|
+
log_1.log.trace(`ignoring self-edge from ${fromId} to ${toId} (${type}, ${attribute ?? '?'}, ${promote ? 'y' : 'n'})`);
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
137
|
+
if (promote) {
|
|
138
|
+
attribute ??= from.used === 'maybe' ? 'maybe' : to.used;
|
|
139
|
+
// reduce the load on attribute checks
|
|
140
|
+
if (attribute !== 'maybe') {
|
|
141
|
+
const fromInfo = this.get(fromId, true);
|
|
142
|
+
if (fromInfo?.[0].when === 'maybe') {
|
|
143
|
+
log_1.log.trace(`automatically promoting edge from ${fromId} to ${toId} as maybe because at least one of the nodes is maybe`);
|
|
144
|
+
attribute = 'maybe';
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const toInfo = this.get(toId, true);
|
|
148
|
+
if (toInfo?.[0].when === 'maybe') {
|
|
149
|
+
log_1.log.trace(`automatically promoting edge from ${fromId} to ${toId} as maybe because at least one of the nodes is maybe`);
|
|
150
|
+
attribute = 'maybe';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
(0, assert_1.guard)(attribute !== undefined, 'attribute must be set');
|
|
156
|
+
const edge = { types: new Set([type]), attribute };
|
|
157
|
+
const existingFrom = this.edgeInformation.get(fromId);
|
|
158
|
+
const edgeInFrom = existingFrom?.get(toId);
|
|
159
|
+
if (edgeInFrom === undefined) {
|
|
160
|
+
if (existingFrom === undefined) {
|
|
161
|
+
this.edgeInformation.set(fromId, new Map([[toId, edge]]));
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
existingFrom.set(toId, edge);
|
|
165
|
+
}
|
|
166
|
+
// sort (on id so that sorting is the same, independent of the attribute)
|
|
167
|
+
const bidirectional = type === 'same-read-read' || type === 'same-def-def' || type === 'relates';
|
|
168
|
+
if (bidirectional) {
|
|
169
|
+
const existingTo = this.edgeInformation.get(toId);
|
|
170
|
+
if (existingTo === undefined) {
|
|
171
|
+
this.edgeInformation.set(toId, new Map([[fromId, edge]]));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
existingTo.set(fromId, edge);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else if (type === 'defines-on-call') {
|
|
178
|
+
const otherEdge = { ...edge,
|
|
179
|
+
types: new Set([edge_1.EdgeType.DefinedByOnCall])
|
|
180
|
+
};
|
|
181
|
+
const existingTo = this.edgeInformation.get(toId);
|
|
182
|
+
if (existingTo === undefined) {
|
|
183
|
+
this.edgeInformation.set(toId, new Map([[fromId, otherEdge]]));
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
existingTo.set(fromId, otherEdge);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
if (attribute === 'maybe') {
|
|
192
|
+
// as the data is shared, we can just set it for one direction
|
|
193
|
+
edgeInFrom.attribute = 'maybe';
|
|
194
|
+
}
|
|
195
|
+
if (!edgeInFrom.types.has(type)) {
|
|
196
|
+
// adding the type
|
|
197
|
+
edgeInFrom.types.add(type);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Merges the other graph into *this* one (in-place). The return value is only for convenience.
|
|
204
|
+
*
|
|
205
|
+
* @param otherGraph - The graph to merge into this one
|
|
206
|
+
* @param mergeRootVertices - If false, this will only merge the vertices and edges but exclude the root vertices this is probably only of use
|
|
207
|
+
* in the context of function definitions
|
|
208
|
+
*/
|
|
209
|
+
mergeWith(otherGraph, mergeRootVertices = true) {
|
|
210
|
+
if (otherGraph === undefined) {
|
|
211
|
+
return this;
|
|
212
|
+
}
|
|
213
|
+
// merge root ids
|
|
214
|
+
if (mergeRootVertices) {
|
|
215
|
+
for (const root of otherGraph.rootVertices) {
|
|
216
|
+
this.rootVertices.add(root);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const [id, info] of otherGraph.vertexInformation) {
|
|
220
|
+
const currentInfo = this.vertexInformation.get(id);
|
|
221
|
+
this.vertexInformation.set(id, currentInfo === undefined ? info : mergeNodeInfos(currentInfo, info));
|
|
222
|
+
}
|
|
223
|
+
this.mergeEdges(otherGraph);
|
|
224
|
+
return this;
|
|
225
|
+
}
|
|
226
|
+
mergeEdges(otherGraph) {
|
|
227
|
+
for (const [id, edges] of otherGraph.edgeInformation.entries()) {
|
|
228
|
+
for (const [target, edge] of edges) {
|
|
229
|
+
const existing = this.edgeInformation.get(id);
|
|
230
|
+
if (existing === undefined) {
|
|
231
|
+
this.edgeInformation.set(id, new Map([[target, edge]]));
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const get = existing.get(target);
|
|
235
|
+
if (get === undefined) {
|
|
236
|
+
existing.set(target, edge);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
get.types = new Set([...get.types, ...edge.types]);
|
|
240
|
+
if (edge.attribute === 'maybe') {
|
|
241
|
+
get.attribute = 'maybe';
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
equals(other, diff = false, names = { left: 'left', right: 'right' }) {
|
|
249
|
+
const report = (0, diff_1.diffOfDataflowGraphs)({ name: names.left, graph: this }, { name: names.right, graph: other });
|
|
250
|
+
if (diff) {
|
|
251
|
+
return report;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
return report.isEqual();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Marks a vertex in the graph to be a definition
|
|
259
|
+
* @param reference - The reference to the vertex to mark as definition
|
|
260
|
+
*/
|
|
261
|
+
setDefinitionOfVertex(reference) {
|
|
262
|
+
const got = this.get(reference.nodeId, true);
|
|
263
|
+
(0, assert_1.guard)(got !== undefined, () => `node must be defined for ${JSON.stringify(reference)} to set definition scope to ${reference.scope}`);
|
|
264
|
+
const [node] = got;
|
|
265
|
+
if (node.tag === 'function-definition' || node.tag === 'variable-definition') {
|
|
266
|
+
(0, assert_1.guard)(node.scope === reference.scope, () => `node ${JSON.stringify(node)} must not be previously defined at position or have same scope for ${JSON.stringify(reference)}`);
|
|
267
|
+
(0, assert_1.guard)(node.when === reference.used || node.when === 'maybe' || reference.used === 'maybe', () => `node ${JSON.stringify(node)} must not be previously defined at position or have same scope for ${JSON.stringify(reference)}`);
|
|
268
|
+
node.scope = reference.scope;
|
|
269
|
+
node.when = reference.used === 'maybe' ? 'maybe' : node.when;
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
this.vertexInformation.set(reference.nodeId, {
|
|
273
|
+
...node,
|
|
274
|
+
tag: 'variable-definition',
|
|
275
|
+
scope: reference.scope,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
exports.DataflowGraph = DataflowGraph;
|
|
281
|
+
function mergeNodeInfos(current, next) {
|
|
282
|
+
(0, assert_1.guard)(current.tag === next.tag, () => `nodes to be joined for the same id must have the same tag, but ${JSON.stringify(current)} vs ${JSON.stringify(next)}`);
|
|
283
|
+
(0, assert_1.guard)(current.name === next.name, () => `nodes to be joined for the same id must have the same name, but ${JSON.stringify(current)} vs ${JSON.stringify(next)}`);
|
|
284
|
+
(0, assert_1.guard)(current.environment === next.environment, 'nodes to be joined for the same id must have the same environment');
|
|
285
|
+
if (current.tag === 'variable-definition') {
|
|
286
|
+
(0, assert_1.guard)(current.scope === next.scope, 'nodes to be joined for the same id must have the same scope');
|
|
287
|
+
}
|
|
288
|
+
else if (current.tag === 'function-call') {
|
|
289
|
+
(0, assert_1.guard)((0, diff_1.equalFunctionArguments)(current.args, next.args), 'nodes to be joined for the same id must have the same function call information');
|
|
290
|
+
}
|
|
291
|
+
else if (current.tag === 'function-definition') {
|
|
292
|
+
(0, assert_1.guard)(current.scope === next.scope, 'nodes to be joined for the same id must have the same scope');
|
|
293
|
+
(0, assert_1.guard)((0, diff_1.equalExitPoints)(current.exitPoints, next.exitPoints), 'nodes to be joined must have same exist points');
|
|
294
|
+
}
|
|
295
|
+
// make a copy
|
|
296
|
+
return { ...current };
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./graph"), exports);
|
|
18
|
+
__exportStar(require("./edge"), exports);
|
|
19
|
+
__exportStar(require("./vertex"), exports);
|
|
20
|
+
__exportStar(require("./diff"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.df2quads = void 0;
|
|
4
|
+
const quads_1 = require("../../../util/quads");
|
|
5
|
+
/**
|
|
6
|
+
* @see cfg2quads
|
|
7
|
+
* @see serialize2quads
|
|
8
|
+
* @see graph2quads
|
|
9
|
+
*/
|
|
10
|
+
function df2quads(graph, config) {
|
|
11
|
+
return (0, quads_1.graph2quads)({
|
|
12
|
+
rootIds: [...graph.rootIds()],
|
|
13
|
+
vertices: [...graph.vertices(true)]
|
|
14
|
+
.map(([id, v]) => ({
|
|
15
|
+
...v,
|
|
16
|
+
id
|
|
17
|
+
})),
|
|
18
|
+
edges: [...graph.edges()].flatMap(([fromId, targets]) => [...targets].map(([toId, info]) => ({
|
|
19
|
+
from: fromId,
|
|
20
|
+
to: toId,
|
|
21
|
+
type: [...info.types],
|
|
22
|
+
when: info.attribute
|
|
23
|
+
})))
|
|
24
|
+
}, config);
|
|
25
|
+
}
|
|
26
|
+
exports.df2quads = df2quads;
|
|
27
|
+
//# sourceMappingURL=quads.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.dataflowLogger = void 0;
|
|
18
|
+
const log_1 = require("../../util/log");
|
|
19
|
+
exports.dataflowLogger = log_1.log.getSubLogger({ name: 'dataflow' });
|
|
20
|
+
__exportStar(require("./graph"), exports);
|
|
21
|
+
__exportStar(require("./extractor"), exports);
|
|
22
|
+
__exportStar(require("../common/environments/environment"), exports);
|
|
23
|
+
__exportStar(require("../../util/mermaid/dfg"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initializeCleanDataflowInformation = void 0;
|
|
4
|
+
const graph_1 = require("../graph");
|
|
5
|
+
function initializeCleanDataflowInformation(data) {
|
|
6
|
+
return {
|
|
7
|
+
unknownReferences: [],
|
|
8
|
+
in: [],
|
|
9
|
+
out: [],
|
|
10
|
+
scope: data.activeScope,
|
|
11
|
+
environments: data.environments,
|
|
12
|
+
graph: new graph_1.DataflowGraph()
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
exports.initializeCleanDataflowInformation = initializeCleanDataflowInformation;
|
|
16
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -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("../../common/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("../../common/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
|