@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,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processAssignment = void 0;
|
|
4
|
+
const r_bridge_1 = require("../../../../r-bridge");
|
|
5
|
+
const processor_1 = require("../../../processor");
|
|
6
|
+
const graph_1 = require("../../../graph");
|
|
7
|
+
const environments_1 = require("../../../environments");
|
|
8
|
+
const log_1 = require("../../../../util/log");
|
|
9
|
+
const index_1 = require("../../../index");
|
|
10
|
+
const scopes_1 = require("../../../environments/scopes");
|
|
11
|
+
function processAssignment(op, data) {
|
|
12
|
+
index_1.dataflowLogger.trace(`Processing assignment with id ${op.info.id}`);
|
|
13
|
+
const lhs = (0, processor_1.processDataflowFor)(op.lhs, data);
|
|
14
|
+
const rhs = (0, processor_1.processDataflowFor)(op.rhs, data);
|
|
15
|
+
const { readTargets, newWriteNodes, writeTargets, environments, swap } = processReadAndWriteForAssignmentBasedOnOp(op, lhs, rhs, data);
|
|
16
|
+
const nextGraph = lhs.graph.mergeWith(rhs.graph);
|
|
17
|
+
// deal with special cases based on the source node and the determined read targets
|
|
18
|
+
const isFunctionSide = swap ? op.lhs : op.rhs;
|
|
19
|
+
const isFunction = isFunctionSide.type === "RFunctionDefinition" /* RType.FunctionDefinition */;
|
|
20
|
+
for (const write of newWriteNodes) {
|
|
21
|
+
nextGraph.setDefinitionOfVertex(write);
|
|
22
|
+
if (isFunction) {
|
|
23
|
+
nextGraph.addEdge(write, isFunctionSide.info.id, graph_1.EdgeType.DefinedBy, 'always', true);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const impactReadTargets = determineImpactOfSource(swap ? op.lhs : op.rhs, readTargets);
|
|
27
|
+
for (const read of impactReadTargets) {
|
|
28
|
+
nextGraph.addEdge(write, read, graph_1.EdgeType.DefinedBy, undefined, true);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
unknownReferences: [],
|
|
34
|
+
in: readTargets,
|
|
35
|
+
out: writeTargets,
|
|
36
|
+
graph: nextGraph,
|
|
37
|
+
environments,
|
|
38
|
+
scope: data.activeScope
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
exports.processAssignment = processAssignment;
|
|
42
|
+
function identifySourceAndTarget(op, lhs, rhs) {
|
|
43
|
+
let source;
|
|
44
|
+
let target;
|
|
45
|
+
let global = false;
|
|
46
|
+
let swap = false;
|
|
47
|
+
switch (op.lexeme) {
|
|
48
|
+
case '<-':
|
|
49
|
+
case '=':
|
|
50
|
+
case ':=':
|
|
51
|
+
[target, source] = [lhs, rhs];
|
|
52
|
+
break;
|
|
53
|
+
case '<<-':
|
|
54
|
+
[target, source, global] = [lhs, rhs, true];
|
|
55
|
+
break;
|
|
56
|
+
case '->':
|
|
57
|
+
[target, source, swap] = [rhs, lhs, true];
|
|
58
|
+
break;
|
|
59
|
+
case '->>':
|
|
60
|
+
[target, source, global, swap] = [rhs, lhs, true, true];
|
|
61
|
+
break;
|
|
62
|
+
default:
|
|
63
|
+
throw new Error(`Unknown assignment operator ${JSON.stringify(op)}`);
|
|
64
|
+
}
|
|
65
|
+
return { source, target, global, swap };
|
|
66
|
+
}
|
|
67
|
+
function produceWrittenNodes(op, target, global, data, functionTypeCheck) {
|
|
68
|
+
const writeNodes = [];
|
|
69
|
+
const isFunctionDef = functionTypeCheck.type === "RFunctionDefinition" /* RType.FunctionDefinition */;
|
|
70
|
+
for (const active of target.unknownReferences) {
|
|
71
|
+
writeNodes.push({
|
|
72
|
+
...active,
|
|
73
|
+
scope: global ? scopes_1.GlobalScope : data.activeScope,
|
|
74
|
+
kind: isFunctionDef ? 'function' : 'variable',
|
|
75
|
+
definedAt: op.info.id
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return writeNodes;
|
|
79
|
+
}
|
|
80
|
+
function processReadAndWriteForAssignmentBasedOnOp(op, lhs, rhs, data) {
|
|
81
|
+
// what is written/read additionally is based on lhs/rhs - assignments read written variables as well
|
|
82
|
+
const read = [...lhs.in, ...rhs.in];
|
|
83
|
+
const { source, target, global, swap } = identifySourceAndTarget(op, lhs, rhs);
|
|
84
|
+
const funcTypeCheck = swap ? op.lhs : op.rhs;
|
|
85
|
+
const writeNodes = produceWrittenNodes(op, target, global, data, funcTypeCheck);
|
|
86
|
+
if (writeNodes.length !== 1) {
|
|
87
|
+
log_1.log.warn(`Unexpected write number in assignment: ${JSON.stringify(writeNodes)}`);
|
|
88
|
+
}
|
|
89
|
+
const readFromSourceWritten = source.out;
|
|
90
|
+
let environments = (0, environments_1.overwriteEnvironments)(source.environments, target.environments);
|
|
91
|
+
// install assigned variables in environment
|
|
92
|
+
for (const write of writeNodes) {
|
|
93
|
+
environments = (0, environments_1.define)(write, global ? scopes_1.GlobalScope : scopes_1.LocalScope, environments);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
readTargets: [...source.unknownReferences, ...read, ...readFromSourceWritten],
|
|
97
|
+
writeTargets: [...writeNodes, ...target.out, ...readFromSourceWritten],
|
|
98
|
+
environments: environments,
|
|
99
|
+
newWriteNodes: writeNodes,
|
|
100
|
+
swap
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Some R-constructs like loops are known to return values completely independent of their input (loops return an invisible `NULL`).
|
|
105
|
+
* This returns only those of `readTargets` that actually impact the target.
|
|
106
|
+
*/
|
|
107
|
+
function determineImpactOfSource(source, readTargets) {
|
|
108
|
+
// collect all ids from the source but stop at Loops, function calls, definitions and everything which links its own return
|
|
109
|
+
// for loops this is necessary as they *always* return an invisible null, for function calls we do not know if they do
|
|
110
|
+
// yet, we need to keep the ids of these elements
|
|
111
|
+
const keepEndIds = [];
|
|
112
|
+
const allIds = new Set((0, r_bridge_1.collectAllIds)(source, n => {
|
|
113
|
+
if (n.type === "RFunctionCall" /* RType.FunctionCall */ || n.type === "RFunctionDefinition" /* RType.FunctionDefinition */) {
|
|
114
|
+
keepEndIds.push(n.info.id);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
return n.type === "RForLoop" /* RType.ForLoop */ || n.type === "RWhileLoop" /* RType.WhileLoop */ || n.type === "RRepeatLoop" /* RType.RepeatLoop */;
|
|
118
|
+
}));
|
|
119
|
+
for (const id of keepEndIds) {
|
|
120
|
+
allIds.add(id);
|
|
121
|
+
}
|
|
122
|
+
if (allIds.size === 0) {
|
|
123
|
+
return new Set();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
return new Set(readTargets.filter(ref => allIds.has(ref.nodeId)));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=assignment.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DataflowInformation } from '../../info';
|
|
2
|
+
import { DataflowProcessorInformation } from '../../../processor';
|
|
3
|
+
import { ParentInformation, RBinaryOp } from '../../../../r-bridge';
|
|
4
|
+
export declare function processNonAssignmentBinaryOp<OtherInfo>(op: RBinaryOp<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processNonAssignmentBinaryOp = void 0;
|
|
4
|
+
const processor_1 = require("../../../processor");
|
|
5
|
+
const linker_1 = require("../../linker");
|
|
6
|
+
const environments_1 = require("../../../environments");
|
|
7
|
+
function processNonAssignmentBinaryOp(op, data) {
|
|
8
|
+
const lhs = (0, processor_1.processDataflowFor)(op.lhs, data);
|
|
9
|
+
const rhs = (0, processor_1.processDataflowFor)(op.rhs, data);
|
|
10
|
+
const ingoing = [...lhs.in, ...rhs.in, ...lhs.unknownReferences, ...rhs.unknownReferences];
|
|
11
|
+
const nextGraph = lhs.graph.mergeWith(rhs.graph);
|
|
12
|
+
(0, linker_1.linkIngoingVariablesInSameScope)(nextGraph, ingoing);
|
|
13
|
+
// logical operations may not execute the right hand side (e.g., `FALSE && (x <- TRUE)`)
|
|
14
|
+
const merger = op.flavor === 'logical' ? environments_1.appendEnvironments : environments_1.overwriteEnvironments;
|
|
15
|
+
return {
|
|
16
|
+
unknownReferences: [], // binary ops require reads as without assignments there is no definition
|
|
17
|
+
in: ingoing,
|
|
18
|
+
out: [...lhs.out, ...rhs.out],
|
|
19
|
+
environments: merger(lhs.environments, rhs.environments),
|
|
20
|
+
graph: nextGraph,
|
|
21
|
+
scope: data.activeScope,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
exports.processNonAssignmentBinaryOp = processNonAssignmentBinaryOp;
|
|
25
|
+
//# sourceMappingURL=non-assignment-binary-op.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DataflowInformation } from '../../info';
|
|
2
|
+
import { DataflowProcessorInformation } from '../../../processor';
|
|
3
|
+
import { ParentInformation, RPipe } from '../../../../r-bridge';
|
|
4
|
+
export declare function processPipeOperation<OtherInfo>(op: RPipe<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processPipeOperation = void 0;
|
|
4
|
+
const processor_1 = require("../../../processor");
|
|
5
|
+
const linker_1 = require("../../linker");
|
|
6
|
+
const environments_1 = require("../../../environments");
|
|
7
|
+
const index_1 = require("../../../index");
|
|
8
|
+
const assert_1 = require("../../../../util/assert");
|
|
9
|
+
const argument_1 = require("../functions/argument");
|
|
10
|
+
function processPipeOperation(op, data) {
|
|
11
|
+
const lhs = (0, processor_1.processDataflowFor)(op.lhs, data);
|
|
12
|
+
const rhs = (0, processor_1.processDataflowFor)(op.rhs, data);
|
|
13
|
+
// in-and outgoing are similar to that of a binary operation, we only 1) expect the rhs to be a function call and 2) modify the arguments.
|
|
14
|
+
const ingoing = [...lhs.in, ...rhs.in, ...lhs.unknownReferences, ...rhs.unknownReferences];
|
|
15
|
+
const nextGraph = lhs.graph.mergeWith(rhs.graph);
|
|
16
|
+
(0, linker_1.linkIngoingVariablesInSameScope)(nextGraph, ingoing);
|
|
17
|
+
if (op.rhs.type !== "RFunctionCall" /* RType.FunctionCall */) {
|
|
18
|
+
index_1.dataflowLogger.warn(`Expected rhs of pipe to be a function call, but got ${op.rhs.type} instead.`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const maybeFunctionCallNode = nextGraph.get(op.rhs.info.id, true);
|
|
22
|
+
(0, assert_1.guard)(maybeFunctionCallNode !== undefined, () => `Expected function call node with id ${op.rhs.info.id} to be present in graph, but got undefined instead (graph: ${(0, index_1.graphToMermaidUrl)(nextGraph, data.completeAst.idMap)}).`);
|
|
23
|
+
const functionCallNode = maybeFunctionCallNode[0];
|
|
24
|
+
(0, assert_1.guard)(functionCallNode.tag === 'function-call', () => `Expected function call node with id ${op.rhs.info.id} to be a function call node, but got ${functionCallNode.tag} instead.`);
|
|
25
|
+
// make the lhs an argument node:
|
|
26
|
+
const argId = op.lhs.info.id;
|
|
27
|
+
index_1.dataflowLogger.trace(`Linking pipe arg ${argId} as first argument of ${op.rhs.info.id}`);
|
|
28
|
+
functionCallNode.args.unshift({
|
|
29
|
+
nodeId: argId,
|
|
30
|
+
name: `${argument_1.UnnamedArgumentPrefix}${argId}`,
|
|
31
|
+
scope: data.activeScope,
|
|
32
|
+
used: 'always'
|
|
33
|
+
});
|
|
34
|
+
nextGraph.addEdge(functionCallNode.id, argId, index_1.EdgeType.Argument, 'always');
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
unknownReferences: [],
|
|
38
|
+
in: ingoing,
|
|
39
|
+
out: [...lhs.out, ...rhs.out],
|
|
40
|
+
environments: (0, environments_1.overwriteEnvironments)(lhs.environments, rhs.environments),
|
|
41
|
+
graph: nextGraph,
|
|
42
|
+
scope: data.activeScope,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
exports.processPipeOperation = processPipeOperation;
|
|
46
|
+
//# sourceMappingURL=pipe.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DataflowInformation } from '../../info';
|
|
2
|
+
import { DataflowProcessorInformation } from '../../../processor';
|
|
3
|
+
import { ParentInformation, RUnaryOp } from '../../../../r-bridge';
|
|
4
|
+
export declare function processUnaryOp<OtherInfo>(op: RUnaryOp<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processUnaryOp = void 0;
|
|
4
|
+
const processor_1 = require("../../../processor");
|
|
5
|
+
function processUnaryOp(op, data) {
|
|
6
|
+
/* nothing has to happen to our knowledge */
|
|
7
|
+
return (0, processor_1.processDataflowFor)(op.operand, data);
|
|
8
|
+
}
|
|
9
|
+
exports.processUnaryOp = processUnaryOp;
|
|
10
|
+
//# sourceMappingURL=unary-op.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ParentInformation, RSymbol } from '../../../r-bridge';
|
|
2
|
+
import { DataflowInformation } from '../info';
|
|
3
|
+
import { DataflowProcessorInformation } from '../../processor';
|
|
4
|
+
export declare function processSymbol<OtherInfo>(symbol: RSymbol<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo>): DataflowInformation;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processSymbol = void 0;
|
|
4
|
+
const r_bridge_1 = require("../../../r-bridge");
|
|
5
|
+
const graph_1 = require("../../graph");
|
|
6
|
+
const info_1 = require("../info");
|
|
7
|
+
function processSymbol(symbol, data) {
|
|
8
|
+
if (symbol.content === r_bridge_1.RNull || symbol.content === r_bridge_1.RNa) {
|
|
9
|
+
return (0, info_1.initializeCleanInfo)(data);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
unknownReferences: [{ nodeId: symbol.info.id, scope: data.activeScope, name: symbol.content, used: 'always' }],
|
|
13
|
+
in: [],
|
|
14
|
+
out: [],
|
|
15
|
+
environments: data.environments,
|
|
16
|
+
scope: data.activeScope,
|
|
17
|
+
graph: new graph_1.DataflowGraph().addVertex({ tag: 'use', id: symbol.info.id, name: symbol.content, environment: data.environments })
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
exports.processSymbol = processSymbol;
|
|
21
|
+
//# sourceMappingURL=symbol.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processUninterestingLeaf = void 0;
|
|
4
|
+
const info_1 = require("../info");
|
|
5
|
+
function processUninterestingLeaf(_leaf, info) {
|
|
6
|
+
return (0, info_1.initializeCleanInfo)(info);
|
|
7
|
+
}
|
|
8
|
+
exports.processUninterestingLeaf = processUninterestingLeaf;
|
|
9
|
+
//# sourceMappingURL=uninteresting-leaf.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Based on a two-way fold, this processor will automatically supply scope information
|
|
3
|
+
*/
|
|
4
|
+
import { NormalizedAst, ParentInformation, RNode, RNodeWithParent } from '../r-bridge';
|
|
5
|
+
import { DataflowInformation } from './internal/info';
|
|
6
|
+
import { DataflowScopeName, REnvironmentInformation } from './environments';
|
|
7
|
+
export interface DataflowProcessorInformation<OtherInfo> {
|
|
8
|
+
/**
|
|
9
|
+
* Initial and frozen ast-information
|
|
10
|
+
*/
|
|
11
|
+
readonly completeAst: NormalizedAst<OtherInfo>;
|
|
12
|
+
/**
|
|
13
|
+
* Correctly contains pushed local scopes introduced by `function` scopes.
|
|
14
|
+
* Will by default *not* contain any symbol-bindings introduces along the way, they have to be decorated when moving up the tree.
|
|
15
|
+
*/
|
|
16
|
+
readonly environments: REnvironmentInformation;
|
|
17
|
+
/**
|
|
18
|
+
* Name of the currently active scope, (hopefully) always {@link LocalScope | Local}
|
|
19
|
+
*/
|
|
20
|
+
readonly activeScope: DataflowScopeName;
|
|
21
|
+
/**
|
|
22
|
+
* Other processors to be called by the given functions
|
|
23
|
+
*/
|
|
24
|
+
readonly processors: DataflowProcessors<OtherInfo>;
|
|
25
|
+
}
|
|
26
|
+
export type DataflowProcessor<OtherInfo, NodeType extends RNodeWithParent<OtherInfo>> = (node: NodeType, data: DataflowProcessorInformation<OtherInfo>) => DataflowInformation;
|
|
27
|
+
type NodeWithKey<OtherInfo, Node extends RNode<OtherInfo & ParentInformation>, TypeKey> = Node['type'] extends TypeKey ? Node : never;
|
|
28
|
+
/**
|
|
29
|
+
* This way, a processor mapped to a {@link RType#Symbol} require a {@link RSymbol} as first parameter and so on.
|
|
30
|
+
*/
|
|
31
|
+
export type DataflowProcessors<OtherInfo> = {
|
|
32
|
+
[key in RNode['type']]: DataflowProcessor<OtherInfo, NodeWithKey<OtherInfo, RNodeWithParent<OtherInfo>, key>>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Originally, dataflow processor was written as a two-way fold, but this produced problems when trying to resolve function calls
|
|
36
|
+
* which require information regarding the calling *and* definition context. While this only is a problem for late bindings as they happen
|
|
37
|
+
* with functions (and probably quote'd R-expressions) it is still a problem that must be dealt with.
|
|
38
|
+
* Therefore, the dataflow processor has no complete control over the traversal and merge strategy of the graph, with each processor being in
|
|
39
|
+
* the position to call the other processors as needed for its children.
|
|
40
|
+
* <p>
|
|
41
|
+
* Now this method can be called recursively within the other processors to parse the dataflow for nodes that you can not narrow down.
|
|
42
|
+
*
|
|
43
|
+
* @param current - The current node to start processing from
|
|
44
|
+
* @param data - The initial information to be passed down
|
|
45
|
+
*/
|
|
46
|
+
export declare function processDataflowFor<OtherInfo>(current: RNodeWithParent<OtherInfo>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processDataflowFor = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Originally, dataflow processor was written as a two-way fold, but this produced problems when trying to resolve function calls
|
|
6
|
+
* which require information regarding the calling *and* definition context. While this only is a problem for late bindings as they happen
|
|
7
|
+
* with functions (and probably quote'd R-expressions) it is still a problem that must be dealt with.
|
|
8
|
+
* Therefore, the dataflow processor has no complete control over the traversal and merge strategy of the graph, with each processor being in
|
|
9
|
+
* the position to call the other processors as needed for its children.
|
|
10
|
+
* <p>
|
|
11
|
+
* Now this method can be called recursively within the other processors to parse the dataflow for nodes that you can not narrow down.
|
|
12
|
+
*
|
|
13
|
+
* @param current - The current node to start processing from
|
|
14
|
+
* @param data - The initial information to be passed down
|
|
15
|
+
*/
|
|
16
|
+
function processDataflowFor(current, data) {
|
|
17
|
+
return data.processors[current.type](current, data);
|
|
18
|
+
}
|
|
19
|
+
exports.processDataflowFor = processDataflowFor;
|
|
20
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processBinaryOp = exports.produceDataFlowGraph = void 0;
|
|
4
|
+
const processor_1 = require("./processor");
|
|
5
|
+
const uninteresting_leaf_1 = require("./internal/process/uninteresting-leaf");
|
|
6
|
+
const symbol_1 = require("./internal/process/symbol");
|
|
7
|
+
const non_assignment_binary_op_1 = require("./internal/process/operators/non-assignment-binary-op");
|
|
8
|
+
const unary_op_1 = require("./internal/process/operators/unary-op");
|
|
9
|
+
const expression_list_1 = require("./internal/process/expression-list");
|
|
10
|
+
const repeat_loop_1 = require("./internal/process/loops/repeat-loop");
|
|
11
|
+
const for_loop_1 = require("./internal/process/loops/for-loop");
|
|
12
|
+
const while_loop_1 = require("./internal/process/loops/while-loop");
|
|
13
|
+
const if_then_else_1 = require("./internal/process/if-then-else");
|
|
14
|
+
const function_call_1 = require("./internal/process/functions/function-call");
|
|
15
|
+
const function_definition_1 = require("./internal/process/functions/function-definition");
|
|
16
|
+
const parameter_1 = require("./internal/process/functions/parameter");
|
|
17
|
+
const environments_1 = require("../common/environments");
|
|
18
|
+
const argument_1 = require("./internal/process/functions/argument");
|
|
19
|
+
const assignment_1 = require("./internal/process/operators/assignment");
|
|
20
|
+
const access_1 = require("./internal/process/access");
|
|
21
|
+
const pipe_1 = require("./internal/process/operators/pipe");
|
|
22
|
+
const scopes_1 = require("../common/environments/scopes");
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- allows type adaption without re-creation
|
|
24
|
+
const processors = {
|
|
25
|
+
["RNumber" /* RType.Number */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
26
|
+
["RString" /* RType.String */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
27
|
+
["RLogical" /* RType.Logical */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
28
|
+
["RAccess" /* RType.Access */]: access_1.processAccess,
|
|
29
|
+
["RSymbol" /* RType.Symbol */]: symbol_1.processSymbol,
|
|
30
|
+
["RBinaryOp" /* RType.BinaryOp */]: processBinaryOp,
|
|
31
|
+
["RPipe" /* RType.Pipe */]: pipe_1.processPipeOperation,
|
|
32
|
+
["RUnaryOp" /* RType.UnaryOp */]: unary_op_1.processUnaryOp,
|
|
33
|
+
["RForLoop" /* RType.ForLoop */]: for_loop_1.processForLoop,
|
|
34
|
+
["RWhileLoop" /* RType.WhileLoop */]: while_loop_1.processWhileLoop,
|
|
35
|
+
["RRepeatLoop" /* RType.RepeatLoop */]: repeat_loop_1.processRepeatLoop,
|
|
36
|
+
["RIfThenElse" /* RType.IfThenElse */]: if_then_else_1.processIfThenElse,
|
|
37
|
+
["RBreak" /* RType.Break */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
38
|
+
["RNext" /* RType.Next */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
39
|
+
["RComment" /* RType.Comment */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
40
|
+
["RLineDirective" /* RType.LineDirective */]: uninteresting_leaf_1.processUninterestingLeaf,
|
|
41
|
+
["RFunctionCall" /* RType.FunctionCall */]: function_call_1.processFunctionCall,
|
|
42
|
+
["RFunctionDefinition" /* RType.FunctionDefinition */]: function_definition_1.processFunctionDefinition,
|
|
43
|
+
["RParameter" /* RType.Parameter */]: parameter_1.processFunctionParameter,
|
|
44
|
+
["RArgument" /* RType.Argument */]: argument_1.processFunctionArgument,
|
|
45
|
+
["RExpressionList" /* RType.ExpressionList */]: expression_list_1.processExpressionList,
|
|
46
|
+
};
|
|
47
|
+
function produceDataFlowGraph(ast, initialScope = scopes_1.LocalScope) {
|
|
48
|
+
return (0, processor_1.processDataflowFor)(ast.ast, { completeAst: ast, activeScope: initialScope, environments: (0, environments_1.initializeCleanEnvironments)(), processors: processors });
|
|
49
|
+
}
|
|
50
|
+
exports.produceDataFlowGraph = produceDataFlowGraph;
|
|
51
|
+
function processBinaryOp(node, data) {
|
|
52
|
+
if (node.flavor === 'assignment') {
|
|
53
|
+
return (0, assignment_1.processAssignment)(node, data);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return (0, non_assignment_binary_op_1.processNonAssignmentBinaryOp)(node, data);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.processBinaryOp = processBinaryOp;
|
|
60
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diffEdges = exports.diffVertices = exports.diffFunctionArguments = exports.equalFunctionArguments = exports.equalExitPoints = exports.diffOfDataflowGraphs = void 0;
|
|
4
|
+
const environments_1 = require("../../common/environments");
|
|
5
|
+
const assert_1 = require("../../../util/assert");
|
|
6
|
+
const diff_1 = require("../../../util/diff");
|
|
7
|
+
const json_1 = require("../../../util/json");
|
|
8
|
+
class DataflowDifferenceReport {
|
|
9
|
+
_comments = undefined;
|
|
10
|
+
addComment(comment) {
|
|
11
|
+
if (this._comments === undefined) {
|
|
12
|
+
this._comments = [comment];
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
this._comments.push(comment);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
comments() {
|
|
19
|
+
return this._comments;
|
|
20
|
+
}
|
|
21
|
+
isEqual() {
|
|
22
|
+
return this._comments === undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function initDiffContext(left, right) {
|
|
26
|
+
return {
|
|
27
|
+
left: left.graph,
|
|
28
|
+
leftname: left.name,
|
|
29
|
+
right: right.graph,
|
|
30
|
+
rightname: right.name,
|
|
31
|
+
report: new DataflowDifferenceReport(),
|
|
32
|
+
position: ''
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function diff(ctx) {
|
|
36
|
+
diffRootVertices(ctx);
|
|
37
|
+
diffVertices(ctx);
|
|
38
|
+
diffOutgoingEdges(ctx);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
function diffOutgoingEdges(ctx) {
|
|
42
|
+
const lEdges = new Map(ctx.left.edges());
|
|
43
|
+
const rEdges = new Map(ctx.right.edges());
|
|
44
|
+
if (lEdges.size !== rEdges.size) {
|
|
45
|
+
ctx.report.addComment(`Detected different number of edges! ${ctx.leftname} has ${lEdges.size}, ${ctx.rightname} has ${rEdges.size}`);
|
|
46
|
+
}
|
|
47
|
+
for (const [id, edge] of lEdges) {
|
|
48
|
+
diffEdges(ctx, id, edge, rEdges.get(id));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function diffRootVertices(ctx) {
|
|
52
|
+
(0, diff_1.setDifference)(ctx.left.rootIds(), ctx.right.rootIds(), { ...ctx, position: `${ctx.position}Root vertices differ in graphs. ` });
|
|
53
|
+
}
|
|
54
|
+
function diffOfDataflowGraphs(left, right) {
|
|
55
|
+
if (left.graph === right.graph) {
|
|
56
|
+
return new DataflowDifferenceReport();
|
|
57
|
+
}
|
|
58
|
+
const ctx = initDiffContext(left, right);
|
|
59
|
+
diff(ctx);
|
|
60
|
+
return ctx.report;
|
|
61
|
+
}
|
|
62
|
+
exports.diffOfDataflowGraphs = diffOfDataflowGraphs;
|
|
63
|
+
function diffFunctionArgumentsReferences(a, b, ctx) {
|
|
64
|
+
if (a === '<value>' || b === '<value>') {
|
|
65
|
+
if (a !== b) {
|
|
66
|
+
ctx.report.addComment(`${ctx.position}${ctx.leftname}: ${JSON.stringify(a, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(b, json_1.jsonReplacer)}`);
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
(0, environments_1.diffIdentifierReferences)(a, b, ctx);
|
|
71
|
+
}
|
|
72
|
+
function equalExitPoints(a, b) {
|
|
73
|
+
if (a === undefined || b === undefined) {
|
|
74
|
+
return a === b;
|
|
75
|
+
}
|
|
76
|
+
if (a.length !== b.length) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
for (let i = 0; i < a.length; ++i) {
|
|
80
|
+
if (a[i] !== b[i]) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
exports.equalExitPoints = equalExitPoints;
|
|
87
|
+
function equalFunctionArguments(a, b) {
|
|
88
|
+
const ctx = {
|
|
89
|
+
report: new DataflowDifferenceReport(),
|
|
90
|
+
leftname: 'left',
|
|
91
|
+
rightname: 'right',
|
|
92
|
+
position: ''
|
|
93
|
+
};
|
|
94
|
+
diffFunctionArguments(a, b, ctx);
|
|
95
|
+
return ctx.report.isEqual();
|
|
96
|
+
}
|
|
97
|
+
exports.equalFunctionArguments = equalFunctionArguments;
|
|
98
|
+
function diffFunctionArguments(a, b, ctx) {
|
|
99
|
+
if (a === false || b === false) {
|
|
100
|
+
if (a !== b) {
|
|
101
|
+
ctx.report.addComment(`${ctx.position}${ctx.leftname}: ${JSON.stringify(a, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(b, json_1.jsonReplacer)}`);
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
else if (a.length !== b.length) {
|
|
106
|
+
ctx.report.addComment(`${ctx.position}Differs in number of arguments. ${ctx.leftname}: ${JSON.stringify(a, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(b, json_1.jsonReplacer)}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
for (let i = 0; i < a.length; ++i) {
|
|
110
|
+
const aArg = a[i];
|
|
111
|
+
const bArg = b[i];
|
|
112
|
+
if (Array.isArray(aArg) && Array.isArray(bArg)) {
|
|
113
|
+
// must have same name
|
|
114
|
+
if (aArg[0] !== bArg[0]) {
|
|
115
|
+
ctx.report.addComment(`${ctx.position}In the ${i}th argument (of ${ctx.leftname}, named) the name differs: ${aArg[0]} vs ${bArg[0]}.`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
diffFunctionArgumentsReferences(aArg[1], bArg[1], {
|
|
119
|
+
...ctx,
|
|
120
|
+
position: `${ctx.position} In the ${i}th argument (of ${ctx.leftname}, named). `
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
diffFunctionArgumentsReferences(aArg, bArg, { ...ctx, position: `${ctx.position} In the ${i}th argument (of ${ctx.leftname}, unnamed).` });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.diffFunctionArguments = diffFunctionArguments;
|
|
129
|
+
function diffVertices(ctx) {
|
|
130
|
+
// collect vertices from both sides
|
|
131
|
+
const lVert = [...ctx.left.vertices(true)];
|
|
132
|
+
const rVert = [...ctx.right.vertices(true)];
|
|
133
|
+
if (lVert.length !== rVert.length) {
|
|
134
|
+
ctx.report.addComment(`Detected different number of vertices! ${ctx.leftname} has ${lVert.length}, ${ctx.rightname} has ${rVert.length}`);
|
|
135
|
+
}
|
|
136
|
+
for (const [id, lInfo] of lVert) {
|
|
137
|
+
const rInfoMay = ctx.right.get(id);
|
|
138
|
+
if (rInfoMay === undefined) {
|
|
139
|
+
ctx.report.addComment(`Vertex ${id} is not present in ${ctx.rightname}`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const [rInfo] = rInfoMay;
|
|
143
|
+
if (lInfo.tag !== rInfo.tag) {
|
|
144
|
+
ctx.report.addComment(`Vertex ${id} has different tags. ${ctx.leftname}: ${lInfo.tag} vs. ${ctx.rightname}: ${rInfo.tag}`);
|
|
145
|
+
}
|
|
146
|
+
if (lInfo.name !== rInfo.name) {
|
|
147
|
+
ctx.report.addComment(`Vertex ${id} has different names. ${ctx.leftname}: ${lInfo.name} vs ${ctx.rightname}: ${rInfo.name}`);
|
|
148
|
+
}
|
|
149
|
+
if (lInfo.tag === 'variable-definition' || lInfo.tag === 'function-definition') {
|
|
150
|
+
(0, assert_1.guard)(lInfo.tag === rInfo.tag, () => `node ${id} does not match on tag (${lInfo.tag} vs ${rInfo.tag})`);
|
|
151
|
+
if (lInfo.scope !== rInfo.scope) {
|
|
152
|
+
ctx.report.addComment(`Vertex ${id} has different scopes. ${ctx.leftname}: ${lInfo.scope} vs ${ctx.rightname}: ${rInfo.scope}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (lInfo.when !== rInfo.when) {
|
|
156
|
+
ctx.report.addComment(`Vertex ${id} has different when. ${ctx.leftname}: ${lInfo.when} vs ${ctx.rightname}: ${rInfo.when}`);
|
|
157
|
+
}
|
|
158
|
+
(0, environments_1.diffEnvironments)(lInfo.environment, rInfo.environment, { ...ctx, position: `${ctx.position}Vertex ${id} differs in environments. ` });
|
|
159
|
+
if (lInfo.tag === 'function-call') {
|
|
160
|
+
(0, assert_1.guard)(rInfo.tag === 'function-call', 'otherInfo must be a function call as well');
|
|
161
|
+
diffFunctionArguments(lInfo.args, rInfo.args, { ...ctx, position: `${ctx.position}Vertex ${id} (function call) differs in arguments. ` });
|
|
162
|
+
}
|
|
163
|
+
if (lInfo.tag === 'function-definition') {
|
|
164
|
+
(0, assert_1.guard)(rInfo.tag === 'function-definition', 'otherInfo must be a function definition as well');
|
|
165
|
+
if (!equalExitPoints(lInfo.exitPoints, rInfo.exitPoints)) {
|
|
166
|
+
ctx.report.addComment(`Vertex ${id} has different exit points. ${ctx.leftname}: ${JSON.stringify(lInfo.exitPoints, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(rInfo.exitPoints, json_1.jsonReplacer)}`);
|
|
167
|
+
}
|
|
168
|
+
if (lInfo.subflow.scope !== rInfo.subflow.scope) {
|
|
169
|
+
ctx.report.addComment(`Vertex ${id} has different subflow scope. ${ctx.leftname}: ${JSON.stringify(lInfo.subflow, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(rInfo.subflow, json_1.jsonReplacer)}`);
|
|
170
|
+
}
|
|
171
|
+
(0, environments_1.diffEnvironments)(lInfo.subflow.environments, rInfo.subflow.environments, { ...ctx, position: `${ctx.position}Vertex ${id} (function definition) differs in subflow environments. ` });
|
|
172
|
+
(0, diff_1.setDifference)(lInfo.subflow.graph, rInfo.subflow.graph, { ...ctx, position: `${ctx.position}Vertex ${id} differs in subflow graph. ` });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.diffVertices = diffVertices;
|
|
177
|
+
function diffEdges(ctx, id, lEdges, rEdges) {
|
|
178
|
+
if (lEdges === undefined || rEdges === undefined) {
|
|
179
|
+
if (lEdges !== rEdges) {
|
|
180
|
+
ctx.report.addComment(`Vertex ${id} has undefined outgoing edges. ${ctx.leftname}: ${JSON.stringify(lEdges, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(rEdges, json_1.jsonReplacer)}`);
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (lEdges.size !== rEdges.size) {
|
|
185
|
+
ctx.report.addComment(`Vertex ${id} has different number of outgoing edges. ${ctx.leftname}: ${JSON.stringify(lEdges, json_1.jsonReplacer)} vs ${ctx.rightname}: ${JSON.stringify(rEdges, json_1.jsonReplacer)}`);
|
|
186
|
+
}
|
|
187
|
+
// order independent compare
|
|
188
|
+
for (const [target, edge] of lEdges) {
|
|
189
|
+
const otherEdge = rEdges.get(target);
|
|
190
|
+
if (otherEdge === undefined) {
|
|
191
|
+
ctx.report.addComment(`Target of ${id}->${target} in ${ctx.leftname} is not present in ${ctx.rightname}`);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (edge.types.size !== otherEdge.types.size) {
|
|
195
|
+
ctx.report.addComment(`Target of ${id}->${target} in ${ctx.leftname} has different number of edge types: ${JSON.stringify([...edge.types])} vs ${JSON.stringify([...otherEdge.types])}`);
|
|
196
|
+
}
|
|
197
|
+
if ([...edge.types].some(e => !otherEdge.types.has(e))) {
|
|
198
|
+
ctx.report.addComment(`Target of ${id}->${target} in ${ctx.leftname} has different edge types: ${JSON.stringify([...edge.types])} vs ${JSON.stringify([...otherEdge.types])}`);
|
|
199
|
+
}
|
|
200
|
+
if (edge.attribute !== otherEdge.attribute) {
|
|
201
|
+
ctx.report.addComment(`Target of ${id}->${target} in ${ctx.leftname} has different attributes: ${JSON.stringify(edge.attribute)} vs ${JSON.stringify(otherEdge.attribute)}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.diffEdges = diffEdges;
|
|
206
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EdgeType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Represents the relationship between the source and the target vertex in the dataflow graph.
|
|
6
|
+
*/
|
|
7
|
+
var EdgeType;
|
|
8
|
+
(function (EdgeType) {
|
|
9
|
+
/** The edge determines that source reads target */
|
|
10
|
+
EdgeType["Reads"] = "reads";
|
|
11
|
+
/** The edge determines that source is defined by target */
|
|
12
|
+
EdgeType["DefinedBy"] = "defined-by";
|
|
13
|
+
/** The edge determines that both nodes reference the same variable in a lexical/scoping sense, source and target are interchangeable (reads for at construction unbound variables) */
|
|
14
|
+
EdgeType["SameReadRead"] = "same-read-read";
|
|
15
|
+
/** Similar to `same-read-read` but for def-def constructs without a read in-between */
|
|
16
|
+
EdgeType["SameDefDef"] = "same-def-def";
|
|
17
|
+
/** The edge determines that the source calls the target */
|
|
18
|
+
EdgeType["Calls"] = "calls";
|
|
19
|
+
/** The source returns target on call */
|
|
20
|
+
EdgeType["Returns"] = "returns";
|
|
21
|
+
/** The edge determines that source (probably argument) defines the target (probably parameter), currently automatically created by `addEdge` */
|
|
22
|
+
EdgeType["DefinesOnCall"] = "defines-on-call";
|
|
23
|
+
/** Inverse of `defines-on-call` currently only needed to get better results when slicing complex function calls */
|
|
24
|
+
EdgeType["DefinedByOnCall"] = "defined-by-on-call";
|
|
25
|
+
/** Formal used as argument to a function call */
|
|
26
|
+
EdgeType["Argument"] = "argument";
|
|
27
|
+
/** The edge determines that the source is a side effect that happens when the target is called */
|
|
28
|
+
EdgeType["SideEffectOnCall"] = "side-effect-on-call";
|
|
29
|
+
/** The source and edge relate to each other bidirectionally */
|
|
30
|
+
EdgeType["Relates"] = "relates";
|
|
31
|
+
})(EdgeType || (exports.EdgeType = EdgeType = {}));
|
|
32
|
+
//# sourceMappingURL=edge.js.map
|