@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
package/util/cfg.js
ADDED
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cfg2quads = exports.equalCfg = exports.extractCFG = exports.emptyControlFlowInformation = exports.ControlFlowGraph = void 0;
|
|
4
|
+
const r_bridge_1 = require("../r-bridge");
|
|
5
|
+
const set_1 = require("./set");
|
|
6
|
+
const quads_1 = require("./quads");
|
|
7
|
+
const log_1 = require("./log");
|
|
8
|
+
const json_1 = require("./json");
|
|
9
|
+
/**
|
|
10
|
+
* This class represents the control flow graph of an R program.
|
|
11
|
+
* The control flow may be hierarchical when confronted with function definitions (see {@link CfgVertex} and {@link CFG#rootVertexIds|rootVertexIds()}).
|
|
12
|
+
*/
|
|
13
|
+
class ControlFlowGraph {
|
|
14
|
+
rootVertices = new Set();
|
|
15
|
+
vertexInformation = new Map();
|
|
16
|
+
edgeInformation = new Map();
|
|
17
|
+
addVertex(vertex, rootVertex = true) {
|
|
18
|
+
if (this.vertexInformation.has(vertex.id)) {
|
|
19
|
+
throw new Error(`Node with id ${vertex.id} already exists`);
|
|
20
|
+
}
|
|
21
|
+
this.vertexInformation.set(vertex.id, vertex);
|
|
22
|
+
if (rootVertex) {
|
|
23
|
+
this.rootVertices.add(vertex.id);
|
|
24
|
+
}
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
addEdge(from, to, edge) {
|
|
28
|
+
if (!this.edgeInformation.has(from)) {
|
|
29
|
+
this.edgeInformation.set(from, new Map());
|
|
30
|
+
}
|
|
31
|
+
this.edgeInformation.get(from)?.set(to, edge);
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
rootVertexIds() {
|
|
35
|
+
return this.rootVertices;
|
|
36
|
+
}
|
|
37
|
+
vertices() {
|
|
38
|
+
return this.vertexInformation;
|
|
39
|
+
}
|
|
40
|
+
edges() {
|
|
41
|
+
return this.edgeInformation;
|
|
42
|
+
}
|
|
43
|
+
merge(other, forceNested = false) {
|
|
44
|
+
for (const [id, node] of other.vertexInformation) {
|
|
45
|
+
this.addVertex(node, forceNested ? false : other.rootVertices.has(id));
|
|
46
|
+
}
|
|
47
|
+
for (const [from, edges] of other.edgeInformation) {
|
|
48
|
+
for (const [to, edge] of edges) {
|
|
49
|
+
this.addEdge(from, to, edge);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.ControlFlowGraph = ControlFlowGraph;
|
|
56
|
+
function emptyControlFlowInformation() {
|
|
57
|
+
return {
|
|
58
|
+
returns: [],
|
|
59
|
+
breaks: [],
|
|
60
|
+
nexts: [],
|
|
61
|
+
entryPoints: [],
|
|
62
|
+
exitPoints: [],
|
|
63
|
+
graph: new ControlFlowGraph()
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
exports.emptyControlFlowInformation = emptyControlFlowInformation;
|
|
67
|
+
const cfgFolds = {
|
|
68
|
+
foldNumber: cfgLeaf,
|
|
69
|
+
foldString: cfgLeaf,
|
|
70
|
+
foldLogical: cfgLeaf,
|
|
71
|
+
foldSymbol: cfgLeaf,
|
|
72
|
+
foldAccess: cfgAccess,
|
|
73
|
+
binaryOp: {
|
|
74
|
+
foldLogicalOp: cfgBinaryOp,
|
|
75
|
+
foldArithmeticOp: cfgBinaryOp,
|
|
76
|
+
foldComparisonOp: cfgBinaryOp,
|
|
77
|
+
foldAssignment: cfgBinaryOp,
|
|
78
|
+
foldPipe: cfgBinaryOp,
|
|
79
|
+
foldModelFormula: cfgBinaryOp
|
|
80
|
+
},
|
|
81
|
+
unaryOp: {
|
|
82
|
+
foldArithmeticOp: cfgUnaryOp,
|
|
83
|
+
foldLogicalOp: cfgUnaryOp,
|
|
84
|
+
foldModelFormula: cfgUnaryOp
|
|
85
|
+
},
|
|
86
|
+
other: {
|
|
87
|
+
foldComment: cfgIgnore,
|
|
88
|
+
foldLineDirective: cfgIgnore
|
|
89
|
+
},
|
|
90
|
+
loop: {
|
|
91
|
+
foldFor: cfgFor,
|
|
92
|
+
foldRepeat: cfgRepeat,
|
|
93
|
+
foldWhile: cfgWhile,
|
|
94
|
+
foldBreak: cfgBreak,
|
|
95
|
+
foldNext: cfgNext
|
|
96
|
+
},
|
|
97
|
+
foldIfThenElse: cfgIfThenElse,
|
|
98
|
+
foldExprList: cfgExprList,
|
|
99
|
+
functions: {
|
|
100
|
+
foldFunctionDefinition: cfgFunctionDefinition,
|
|
101
|
+
foldFunctionCall: cfgFunctionCall,
|
|
102
|
+
foldParameter: cfgArgumentOrParameter,
|
|
103
|
+
foldArgument: cfgArgumentOrParameter
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
function extractCFG(ast) {
|
|
107
|
+
return (0, r_bridge_1.foldAst)(ast.ast, cfgFolds);
|
|
108
|
+
}
|
|
109
|
+
exports.extractCFG = extractCFG;
|
|
110
|
+
function cfgLeaf(leaf) {
|
|
111
|
+
const graph = new ControlFlowGraph();
|
|
112
|
+
graph.addVertex({ id: leaf.info.id, name: leaf.type });
|
|
113
|
+
return { graph, breaks: [], nexts: [], returns: [], exitPoints: [leaf.info.id], entryPoints: [leaf.info.id] };
|
|
114
|
+
}
|
|
115
|
+
function cfgBreak(leaf) {
|
|
116
|
+
return { ...cfgLeaf(leaf), breaks: [leaf.info.id] };
|
|
117
|
+
}
|
|
118
|
+
function cfgNext(leaf) {
|
|
119
|
+
return { ...cfgLeaf(leaf), nexts: [leaf.info.id] };
|
|
120
|
+
}
|
|
121
|
+
function cfgIgnore(_leaf) {
|
|
122
|
+
return { graph: new ControlFlowGraph(), breaks: [], nexts: [], returns: [], exitPoints: [], entryPoints: [] };
|
|
123
|
+
}
|
|
124
|
+
function cfgIfThenElse(ifNode, condition, then, otherwise) {
|
|
125
|
+
const graph = new ControlFlowGraph();
|
|
126
|
+
graph.addVertex({ id: ifNode.info.id, name: ifNode.type });
|
|
127
|
+
graph.addVertex({ id: ifNode.info.id + '-exit', name: 'if-exit' });
|
|
128
|
+
graph.merge(condition.graph);
|
|
129
|
+
graph.merge(then.graph);
|
|
130
|
+
if (otherwise) {
|
|
131
|
+
graph.merge(otherwise.graph);
|
|
132
|
+
}
|
|
133
|
+
for (const exitPoint of condition.exitPoints) {
|
|
134
|
+
for (const entryPoint of then.entryPoints) {
|
|
135
|
+
graph.addEdge(entryPoint, exitPoint, { label: 'CD', when: r_bridge_1.RTrue });
|
|
136
|
+
}
|
|
137
|
+
for (const entryPoint of otherwise?.entryPoints ?? []) {
|
|
138
|
+
graph.addEdge(entryPoint, exitPoint, { label: 'CD', when: r_bridge_1.RFalse });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const entryPoint of condition.entryPoints) {
|
|
142
|
+
graph.addEdge(entryPoint, ifNode.info.id, { label: 'FD' });
|
|
143
|
+
}
|
|
144
|
+
for (const exit of [...then.exitPoints, ...otherwise?.exitPoints ?? []]) {
|
|
145
|
+
graph.addEdge(ifNode.info.id + '-exit', exit, { label: 'FD' });
|
|
146
|
+
}
|
|
147
|
+
if (!otherwise) {
|
|
148
|
+
for (const exitPoint of condition.exitPoints) {
|
|
149
|
+
graph.addEdge(ifNode.info.id + '-exit', exitPoint, { label: 'CD', when: r_bridge_1.RFalse });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
graph,
|
|
154
|
+
breaks: [...then.breaks, ...otherwise?.breaks ?? []],
|
|
155
|
+
nexts: [...then.nexts, ...otherwise?.nexts ?? []],
|
|
156
|
+
returns: [...then.returns, ...otherwise?.returns ?? []],
|
|
157
|
+
exitPoints: [ifNode.info.id + '-exit'],
|
|
158
|
+
entryPoints: [ifNode.info.id]
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function cfgRepeat(repeat, body) {
|
|
162
|
+
const graph = body.graph;
|
|
163
|
+
graph.addVertex({ id: repeat.info.id, name: repeat.type });
|
|
164
|
+
graph.addVertex({ id: repeat.info.id + '-exit', name: 'repeat-exit' });
|
|
165
|
+
for (const entryPoint of body.entryPoints) {
|
|
166
|
+
graph.addEdge(repeat.info.id, entryPoint, { label: 'FD' });
|
|
167
|
+
}
|
|
168
|
+
// loops automatically
|
|
169
|
+
for (const next of [...body.nexts, ...body.exitPoints]) {
|
|
170
|
+
graph.addEdge(repeat.info.id, next, { label: 'FD' });
|
|
171
|
+
}
|
|
172
|
+
for (const breakPoint of body.breaks) {
|
|
173
|
+
graph.addEdge(repeat.info.id + '-exit', breakPoint, { label: 'FD' });
|
|
174
|
+
}
|
|
175
|
+
return { graph, breaks: [], nexts: [], returns: body.returns, exitPoints: [repeat.info.id + '-exit'], entryPoints: [repeat.info.id] };
|
|
176
|
+
}
|
|
177
|
+
function cfgWhile(whileLoop, condition, body) {
|
|
178
|
+
const graph = condition.graph;
|
|
179
|
+
graph.addVertex({ id: whileLoop.info.id, name: whileLoop.type });
|
|
180
|
+
graph.addVertex({ id: whileLoop.info.id + '-exit', name: 'while-exit' });
|
|
181
|
+
graph.merge(body.graph);
|
|
182
|
+
for (const entry of condition.entryPoints) {
|
|
183
|
+
graph.addEdge(entry, whileLoop.info.id, { label: 'FD' });
|
|
184
|
+
}
|
|
185
|
+
for (const exit of condition.exitPoints) {
|
|
186
|
+
for (const entry of body.entryPoints) {
|
|
187
|
+
graph.addEdge(entry, exit, { label: 'CD', when: r_bridge_1.RTrue });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const entryPoint of body.entryPoints) {
|
|
191
|
+
graph.addEdge(whileLoop.info.id, entryPoint, { label: 'FD' });
|
|
192
|
+
}
|
|
193
|
+
for (const next of [...body.nexts, ...body.exitPoints]) {
|
|
194
|
+
graph.addEdge(whileLoop.info.id, next, { label: 'FD' });
|
|
195
|
+
}
|
|
196
|
+
for (const breakPoint of body.breaks) {
|
|
197
|
+
graph.addEdge(whileLoop.info.id + '-exit', breakPoint, { label: 'FD' });
|
|
198
|
+
}
|
|
199
|
+
// while can break on the condition as well
|
|
200
|
+
for (const exit of condition.exitPoints) {
|
|
201
|
+
graph.addEdge(whileLoop.info.id + '-exit', exit, { label: 'CD', when: r_bridge_1.RFalse });
|
|
202
|
+
}
|
|
203
|
+
return { graph, breaks: [], nexts: [], returns: body.returns, exitPoints: [whileLoop.info.id + '-exit'], entryPoints: [whileLoop.info.id] };
|
|
204
|
+
}
|
|
205
|
+
function cfgFor(forLoop, variable, vector, body) {
|
|
206
|
+
const graph = variable.graph;
|
|
207
|
+
graph.addVertex({ id: forLoop.info.id, name: forLoop.type });
|
|
208
|
+
graph.addVertex({ id: forLoop.info.id + '-exit', name: 'for-exit' });
|
|
209
|
+
graph.merge(vector.graph);
|
|
210
|
+
graph.merge(body.graph);
|
|
211
|
+
for (const entry of vector.entryPoints) {
|
|
212
|
+
graph.addEdge(entry, forLoop.info.id, { label: 'FD' });
|
|
213
|
+
}
|
|
214
|
+
for (const exit of vector.exitPoints) {
|
|
215
|
+
for (const entry of variable.entryPoints) {
|
|
216
|
+
graph.addEdge(entry, exit, { label: 'FD' });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const exit of variable.exitPoints) {
|
|
220
|
+
for (const entry of body.entryPoints) {
|
|
221
|
+
graph.addEdge(entry, exit, { label: 'CD', when: r_bridge_1.RTrue });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
for (const next of [...body.nexts, ...body.exitPoints]) {
|
|
225
|
+
graph.addEdge(forLoop.info.id, next, { label: 'FD' });
|
|
226
|
+
}
|
|
227
|
+
for (const breakPoint of body.breaks) {
|
|
228
|
+
graph.addEdge(forLoop.info.id + '-exit', breakPoint, { label: 'FD' });
|
|
229
|
+
}
|
|
230
|
+
// while can break on the condition as well
|
|
231
|
+
for (const exit of variable.exitPoints) {
|
|
232
|
+
graph.addEdge(forLoop.info.id + '-exit', exit, { label: 'CD', when: r_bridge_1.RFalse });
|
|
233
|
+
}
|
|
234
|
+
return { graph, breaks: [], nexts: [], returns: body.returns, exitPoints: [forLoop.info.id + '-exit'], entryPoints: [forLoop.info.id] };
|
|
235
|
+
}
|
|
236
|
+
function cfgFunctionDefinition(fn, params, body) {
|
|
237
|
+
const graph = new ControlFlowGraph();
|
|
238
|
+
const children = [fn.info.id + '-params', fn.info.id + '-exit'];
|
|
239
|
+
graph.addVertex({ id: fn.info.id + '-params', name: 'function-parameters' }, false);
|
|
240
|
+
graph.addVertex({ id: fn.info.id + '-exit', name: 'function-exit' }, false);
|
|
241
|
+
graph.addVertex({ id: fn.info.id, name: fn.type, children });
|
|
242
|
+
graph.merge(body.graph, true);
|
|
243
|
+
children.push(...body.graph.rootVertexIds());
|
|
244
|
+
for (const param of params) {
|
|
245
|
+
graph.merge(param.graph, true);
|
|
246
|
+
children.push(...param.graph.rootVertexIds());
|
|
247
|
+
for (const entry of param.entryPoints) {
|
|
248
|
+
graph.addEdge(entry, fn.info.id, { label: 'FD' });
|
|
249
|
+
}
|
|
250
|
+
for (const exit of param.exitPoints) {
|
|
251
|
+
graph.addEdge(fn.info.id + '-params', exit, { label: 'FD' });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
for (const entry of body.entryPoints) {
|
|
255
|
+
graph.addEdge(entry, fn.info.id + '-params', { label: 'FD' });
|
|
256
|
+
}
|
|
257
|
+
// breaks and nexts should be illegal but safe is safe i guess
|
|
258
|
+
for (const next of [...body.returns, ...body.breaks, ...body.nexts, ...body.exitPoints]) {
|
|
259
|
+
graph.addEdge(fn.info.id + '-exit', next, { label: 'FD' });
|
|
260
|
+
}
|
|
261
|
+
return { graph: graph, breaks: [], nexts: [], returns: body.returns, exitPoints: [fn.info.id], entryPoints: [fn.info.id] };
|
|
262
|
+
}
|
|
263
|
+
function cfgFunctionCall(call, name, args) {
|
|
264
|
+
const graph = name.graph;
|
|
265
|
+
const info = { graph, breaks: [...name.breaks], nexts: [...name.nexts], returns: [...name.returns], exitPoints: [call.info.id + '-exit'], entryPoints: [call.info.id] };
|
|
266
|
+
graph.addVertex({ id: call.info.id, name: call.type });
|
|
267
|
+
for (const entryPoint of name.entryPoints) {
|
|
268
|
+
graph.addEdge(entryPoint, call.info.id, { label: 'FD' });
|
|
269
|
+
}
|
|
270
|
+
graph.addVertex({ id: call.info.id + '-name', name: 'call-name' });
|
|
271
|
+
for (const exitPoint of name.exitPoints) {
|
|
272
|
+
graph.addEdge(call.info.id + '-name', exitPoint, { label: 'FD' });
|
|
273
|
+
}
|
|
274
|
+
graph.addVertex({ id: call.info.id + '-exit', name: 'call-exit' });
|
|
275
|
+
let lastArgExits = [call.info.id + '-name'];
|
|
276
|
+
for (const arg of args) {
|
|
277
|
+
if (arg === undefined) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
graph.merge(arg.graph);
|
|
281
|
+
info.breaks.push(...arg.breaks);
|
|
282
|
+
info.nexts.push(...arg.nexts);
|
|
283
|
+
info.returns.push(...arg.returns);
|
|
284
|
+
for (const entry of arg.entryPoints) {
|
|
285
|
+
for (const exit of lastArgExits) {
|
|
286
|
+
graph.addEdge(entry, exit, { label: 'FD' });
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
lastArgExits = arg.exitPoints;
|
|
290
|
+
}
|
|
291
|
+
for (const exit of lastArgExits) {
|
|
292
|
+
graph.addEdge(call.info.id + '-exit', exit, { label: 'FD' });
|
|
293
|
+
}
|
|
294
|
+
// should not contain any breaks, nexts, or returns, (except for the body if something like 'break()')
|
|
295
|
+
return info;
|
|
296
|
+
}
|
|
297
|
+
function cfgArgumentOrParameter(node, name, value) {
|
|
298
|
+
const graph = new ControlFlowGraph();
|
|
299
|
+
const info = { graph, breaks: [], nexts: [], returns: [], exitPoints: [node.info.id + '-exit'], entryPoints: [node.info.id] };
|
|
300
|
+
graph.addVertex({ id: node.info.id, name: node.type });
|
|
301
|
+
let currentExitPoint = [node.info.id];
|
|
302
|
+
if (name) {
|
|
303
|
+
graph.merge(name.graph);
|
|
304
|
+
info.breaks.push(...name.breaks);
|
|
305
|
+
info.nexts.push(...name.nexts);
|
|
306
|
+
info.returns.push(...name.returns);
|
|
307
|
+
for (const entry of name.entryPoints) {
|
|
308
|
+
graph.addEdge(entry, node.info.id, { label: 'FD' });
|
|
309
|
+
}
|
|
310
|
+
currentExitPoint = name.exitPoints;
|
|
311
|
+
}
|
|
312
|
+
graph.addVertex({ id: node.info.id + '-before-value', name: 'before-value' });
|
|
313
|
+
for (const exitPoints of currentExitPoint) {
|
|
314
|
+
graph.addEdge(node.info.id + '-before-value', exitPoints, { label: 'FD' });
|
|
315
|
+
}
|
|
316
|
+
currentExitPoint = [node.info.id + '-before-value'];
|
|
317
|
+
if (value) {
|
|
318
|
+
graph.merge(value.graph);
|
|
319
|
+
info.breaks.push(...value.breaks);
|
|
320
|
+
info.nexts.push(...value.nexts);
|
|
321
|
+
info.returns.push(...value.returns);
|
|
322
|
+
for (const exitPoint of currentExitPoint) {
|
|
323
|
+
for (const entry of value.entryPoints) {
|
|
324
|
+
graph.addEdge(entry, exitPoint, { label: 'FD' });
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
currentExitPoint = value.exitPoints;
|
|
328
|
+
}
|
|
329
|
+
graph.addVertex({ id: node.info.id + '-exit', name: 'exit' });
|
|
330
|
+
for (const exit of currentExitPoint) {
|
|
331
|
+
graph.addEdge(node.info.id + '-exit', exit, { label: 'FD' });
|
|
332
|
+
}
|
|
333
|
+
return info;
|
|
334
|
+
}
|
|
335
|
+
function cfgBinaryOp(binOp, lhs, rhs) {
|
|
336
|
+
const graph = new ControlFlowGraph().merge(lhs.graph).merge(rhs.graph);
|
|
337
|
+
const result = { graph, breaks: [...lhs.breaks, ...rhs.breaks], nexts: [...lhs.nexts, ...rhs.nexts], returns: [...lhs.returns, ...rhs.returns], entryPoints: [binOp.info.id], exitPoints: [binOp.info.id + '-exit'] };
|
|
338
|
+
graph.addVertex({ id: binOp.info.id, name: binOp.type });
|
|
339
|
+
graph.addVertex({ id: binOp.info.id + '-exit', name: 'binOp-exit' });
|
|
340
|
+
for (const exitPoint of lhs.exitPoints) {
|
|
341
|
+
for (const entryPoint of rhs.entryPoints) {
|
|
342
|
+
result.graph.addEdge(entryPoint, exitPoint, { label: 'FD' });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
for (const entryPoint of lhs.entryPoints) {
|
|
346
|
+
graph.addEdge(entryPoint, binOp.info.id, { label: 'FD' });
|
|
347
|
+
}
|
|
348
|
+
for (const exitPoint of rhs.exitPoints) {
|
|
349
|
+
graph.addEdge(binOp.info.id + '-exit', exitPoint, { label: 'FD' });
|
|
350
|
+
}
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
function cfgAccess(access, name, accessors) {
|
|
354
|
+
const result = name;
|
|
355
|
+
const graph = result.graph;
|
|
356
|
+
graph.addVertex({ id: access.info.id, name: access.type });
|
|
357
|
+
graph.addVertex({ id: access.info.id + '-exit', name: 'access-exit' });
|
|
358
|
+
for (const entry of name.entryPoints) {
|
|
359
|
+
graph.addEdge(entry, access.info.id, { label: 'FD' });
|
|
360
|
+
}
|
|
361
|
+
for (const exit of name.exitPoints) {
|
|
362
|
+
graph.addEdge(access.info.id, exit, { label: 'FD' });
|
|
363
|
+
}
|
|
364
|
+
result.entryPoints = [access.info.id];
|
|
365
|
+
result.exitPoints = [access.info.id + '-exit'];
|
|
366
|
+
if (typeof accessors === 'string') {
|
|
367
|
+
return result;
|
|
368
|
+
}
|
|
369
|
+
for (const accessor of accessors) {
|
|
370
|
+
if (accessor === null) {
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
graph.merge(accessor.graph);
|
|
374
|
+
for (const entry of accessor.entryPoints) {
|
|
375
|
+
graph.addEdge(entry, access.info.id, { label: 'FD' });
|
|
376
|
+
}
|
|
377
|
+
for (const exit of accessor.exitPoints) {
|
|
378
|
+
graph.addEdge(access.info.id + '-exit', exit, { label: 'FD' });
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return result;
|
|
382
|
+
}
|
|
383
|
+
function cfgUnaryOp(unary, operand) {
|
|
384
|
+
const graph = operand.graph;
|
|
385
|
+
const result = { ...operand, graph, exitPoints: [unary.info.id] };
|
|
386
|
+
graph.addVertex({ id: unary.info.id, name: unary.type });
|
|
387
|
+
return result;
|
|
388
|
+
}
|
|
389
|
+
function cfgExprList(_node, expressions) {
|
|
390
|
+
const result = { graph: new ControlFlowGraph(), breaks: [], nexts: [], returns: [], exitPoints: [], entryPoints: [] };
|
|
391
|
+
let first = true;
|
|
392
|
+
for (const expression of expressions) {
|
|
393
|
+
if (first) {
|
|
394
|
+
result.entryPoints = expression.entryPoints;
|
|
395
|
+
first = false;
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
for (const previousExitPoint of result.exitPoints) {
|
|
399
|
+
for (const entryPoint of expression.entryPoints) {
|
|
400
|
+
result.graph.addEdge(entryPoint, previousExitPoint, { label: 'FD' });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
result.graph.merge(expression.graph);
|
|
405
|
+
result.breaks.push(...expression.breaks);
|
|
406
|
+
result.nexts.push(...expression.nexts);
|
|
407
|
+
result.returns.push(...expression.returns);
|
|
408
|
+
result.exitPoints = expression.exitPoints;
|
|
409
|
+
}
|
|
410
|
+
return result;
|
|
411
|
+
}
|
|
412
|
+
function equalChildren(a, b) {
|
|
413
|
+
if (!a || !b || a.length !== b.length) {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
for (let i = 0; i < a.length; ++i) {
|
|
417
|
+
if (a[i] !== b[i]) {
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Returns true if the given CFG equals the other CFG. False otherwise.
|
|
425
|
+
*/
|
|
426
|
+
function equalCfg(a, b) {
|
|
427
|
+
if (!a || !b) {
|
|
428
|
+
return a === b;
|
|
429
|
+
}
|
|
430
|
+
else if (!(0, set_1.setEquals)(a.rootVertexIds(), b.rootVertexIds())) {
|
|
431
|
+
log_1.log.debug(`root vertex ids differ ${JSON.stringify(a.rootVertexIds(), json_1.jsonReplacer)} vs. ${JSON.stringify(b.rootVertexIds(), json_1.jsonReplacer)}.`);
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
const aVert = a.vertices();
|
|
435
|
+
const bVert = b.vertices();
|
|
436
|
+
if (aVert.size !== bVert.size) {
|
|
437
|
+
log_1.log.debug(`vertex count differs ${aVert.size} vs. ${bVert.size}.`);
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
for (const [id, aInfo] of aVert) {
|
|
441
|
+
const bInfo = bVert.get(id);
|
|
442
|
+
if (bInfo === undefined || aInfo.name !== bInfo.name || equalChildren(aInfo.children, bInfo.children)) {
|
|
443
|
+
log_1.log.debug(`vertex ${id} differs ${JSON.stringify(aInfo, json_1.jsonReplacer)} vs. ${JSON.stringify(bInfo, json_1.jsonReplacer)}.`);
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
const aEdges = a.edges();
|
|
448
|
+
const bEdges = b.edges();
|
|
449
|
+
if (aEdges.size !== bEdges.size) {
|
|
450
|
+
log_1.log.debug(`edge count differs ${aEdges.size} vs. ${bEdges.size}.`);
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
for (const [from, aTo] of aEdges) {
|
|
454
|
+
const bTo = bEdges.get(from);
|
|
455
|
+
if (bTo === undefined || aTo.size !== bTo.size) {
|
|
456
|
+
log_1.log.debug(`edge count for ${from} differs ${aTo.size} vs. ${bTo?.size ?? '?'}.`);
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
for (const [to, aEdge] of aTo) {
|
|
460
|
+
const bEdge = bTo.get(to);
|
|
461
|
+
if (bEdge === undefined || aEdge.label !== bEdge.label) {
|
|
462
|
+
log_1.log.debug(`edge ${from} -> ${to} differs ${JSON.stringify(aEdge, json_1.jsonReplacer)} vs. ${JSON.stringify(bEdge, json_1.jsonReplacer)}.`);
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return true;
|
|
468
|
+
}
|
|
469
|
+
exports.equalCfg = equalCfg;
|
|
470
|
+
/**
|
|
471
|
+
* @see df2quads
|
|
472
|
+
* @see serialize2quads
|
|
473
|
+
* @see graph2quads
|
|
474
|
+
*/
|
|
475
|
+
function cfg2quads(cfg, config) {
|
|
476
|
+
return (0, quads_1.graph2quads)({
|
|
477
|
+
rootIds: [...cfg.graph.rootVertexIds()],
|
|
478
|
+
vertices: [...cfg.graph.vertices().entries()]
|
|
479
|
+
.map(([id, v]) => ({
|
|
480
|
+
id,
|
|
481
|
+
name: v.name,
|
|
482
|
+
children: v.children
|
|
483
|
+
})),
|
|
484
|
+
edges: [...cfg.graph.edges()].flatMap(([fromId, targets]) => [...targets].map(([toId, info]) => ({
|
|
485
|
+
from: fromId,
|
|
486
|
+
to: toId,
|
|
487
|
+
type: info.label,
|
|
488
|
+
when: info.when
|
|
489
|
+
}))),
|
|
490
|
+
entryPoints: cfg.entryPoints,
|
|
491
|
+
exitPoints: cfg.exitPoints,
|
|
492
|
+
breaks: cfg.breaks,
|
|
493
|
+
nexts: cfg.nexts,
|
|
494
|
+
returns: cfg.returns
|
|
495
|
+
}, config);
|
|
496
|
+
}
|
|
497
|
+
exports.cfg2quads = cfg2quads;
|
|
498
|
+
//# sourceMappingURL=cfg.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A default map allows for a generator to produce values automatically if you want to add something to a map that does not have a value associated with a given key.
|
|
3
|
+
* This does not implement the default map interface as return types (and some future methods may) change
|
|
4
|
+
*/
|
|
5
|
+
export declare class DefaultMap<K, V = K> {
|
|
6
|
+
/** the internal map the default map wraps around */
|
|
7
|
+
private readonly internal;
|
|
8
|
+
/** generator function to produce a default value for a given key */
|
|
9
|
+
private readonly generator;
|
|
10
|
+
/**
|
|
11
|
+
* @param generator - the generator to produce a default value for a given key
|
|
12
|
+
* @param map - the initial map to start with
|
|
13
|
+
*/
|
|
14
|
+
constructor(generator: (k: K) => V, map?: Map<K, V>);
|
|
15
|
+
/**
|
|
16
|
+
* Sets a value for a given key.
|
|
17
|
+
* As you provide value, this does not invoke the generator!
|
|
18
|
+
*/
|
|
19
|
+
set(k: K, v: V): this;
|
|
20
|
+
/**
|
|
21
|
+
* Return a value for the given key, if the key does not exist within the default map,
|
|
22
|
+
* this will invoke the generator and assign the produced value.
|
|
23
|
+
*/
|
|
24
|
+
get(k: K): V;
|
|
25
|
+
/**
|
|
26
|
+
* Iterates over all entries that have been set (explicitly or by the generator)
|
|
27
|
+
*/
|
|
28
|
+
entries(): IterableIterator<[K, V]>;
|
|
29
|
+
/** returns only the keys really stored in the map */
|
|
30
|
+
keys(): IterableIterator<K>;
|
|
31
|
+
values(): IterableIterator<V>;
|
|
32
|
+
delete(k: K): boolean;
|
|
33
|
+
size(): number;
|
|
34
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultMap = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A default map allows for a generator to produce values automatically if you want to add something to a map that does not have a value associated with a given key.
|
|
6
|
+
* This does not implement the default map interface as return types (and some future methods may) change
|
|
7
|
+
*/
|
|
8
|
+
class DefaultMap {
|
|
9
|
+
/** the internal map the default map wraps around */
|
|
10
|
+
internal;
|
|
11
|
+
/** generator function to produce a default value for a given key */
|
|
12
|
+
generator;
|
|
13
|
+
/**
|
|
14
|
+
* @param generator - the generator to produce a default value for a given key
|
|
15
|
+
* @param map - the initial map to start with
|
|
16
|
+
*/
|
|
17
|
+
constructor(generator, map = new Map()) {
|
|
18
|
+
this.generator = generator;
|
|
19
|
+
this.internal = map;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Sets a value for a given key.
|
|
23
|
+
* As you provide value, this does not invoke the generator!
|
|
24
|
+
*/
|
|
25
|
+
set(k, v) {
|
|
26
|
+
this.internal.set(k, v);
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Return a value for the given key, if the key does not exist within the default map,
|
|
31
|
+
* this will invoke the generator and assign the produced value.
|
|
32
|
+
*/
|
|
33
|
+
get(k) {
|
|
34
|
+
const potential = this.internal.get(k);
|
|
35
|
+
if (potential !== undefined) {
|
|
36
|
+
return potential;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const defaultValue = this.generator(k);
|
|
40
|
+
this.internal.set(k, defaultValue);
|
|
41
|
+
return defaultValue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Iterates over all entries that have been set (explicitly or by the generator)
|
|
46
|
+
*/
|
|
47
|
+
entries() {
|
|
48
|
+
return this.internal.entries();
|
|
49
|
+
}
|
|
50
|
+
/** returns only the keys really stored in the map */
|
|
51
|
+
keys() {
|
|
52
|
+
return this.internal.keys();
|
|
53
|
+
}
|
|
54
|
+
values() {
|
|
55
|
+
return this.internal.values();
|
|
56
|
+
}
|
|
57
|
+
delete(k) {
|
|
58
|
+
return this.internal.delete(k);
|
|
59
|
+
}
|
|
60
|
+
size() {
|
|
61
|
+
return this.internal.size;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.DefaultMap = DefaultMap;
|
|
65
|
+
//# sourceMappingURL=defaultmap.js.map
|
package/util/diff.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provides utility types and functions to provide difference information if two structures
|
|
3
|
+
* are not equal. Maybe. Sometime, in the far future this will be as capable as the waldo package :dream:
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { MergeableRecord } from './objects';
|
|
8
|
+
/**
|
|
9
|
+
* Unifies the shape of all difference reports.
|
|
10
|
+
* They should have an array of comments on the potential differences/equality of
|
|
11
|
+
* the structures and a function to check if they are really equal.
|
|
12
|
+
*/
|
|
13
|
+
export interface DifferenceReport {
|
|
14
|
+
/**
|
|
15
|
+
* A human-readable description of differences during the comparison
|
|
16
|
+
* In combination with {@link isEqual} this can be used to provide detailed
|
|
17
|
+
* explanation on equal structures as well (e.g., if structures _could_ be equal).
|
|
18
|
+
*/
|
|
19
|
+
comments(): readonly string[] | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* @returns true iff the compared structures are equal
|
|
22
|
+
*/
|
|
23
|
+
isEqual(): boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface WriteableDifferenceReport extends DifferenceReport {
|
|
26
|
+
addComment(comment: string): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Identifies the information required by the core difference functions.
|
|
30
|
+
* The `leftname` and `rightname` fields are only used to provide more useful
|
|
31
|
+
* information in the difference report.
|
|
32
|
+
*/
|
|
33
|
+
export interface GenericDifferenceInformation extends MergeableRecord {
|
|
34
|
+
/** A human-readable name for the left structure in `left == right`. */
|
|
35
|
+
readonly leftname: string;
|
|
36
|
+
/** A human-readable name for the right structure in `left == right`. */
|
|
37
|
+
readonly rightname: string;
|
|
38
|
+
/** The report on the difference of the two structures. */
|
|
39
|
+
readonly report: WriteableDifferenceReport;
|
|
40
|
+
/** A human-readable indication of where we are (the prefix of the information if the structures differ) */
|
|
41
|
+
readonly position: string;
|
|
42
|
+
}
|
|
43
|
+
export declare function setDifference<T>(left: ReadonlySet<T>, right: ReadonlySet<T>, info: GenericDifferenceInformation): void;
|
package/util/diff.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provides utility types and functions to provide difference information if two structures
|
|
4
|
+
* are not equal. Maybe. Sometime, in the far future this will be as capable as the waldo package :dream:
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.setDifference = void 0;
|
|
10
|
+
const set_1 = require("./set");
|
|
11
|
+
function setDifference(left, right, info) {
|
|
12
|
+
const lWithoutR = (0, set_1.setMinus)(left, right);
|
|
13
|
+
const rWithoutL = (0, set_1.setMinus)(right, left);
|
|
14
|
+
if (lWithoutR.size === 0 && rWithoutL.size === 0) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let message = info.position;
|
|
18
|
+
if (lWithoutR.size > 0) {
|
|
19
|
+
message += ` More elements in ${info.leftname}: ${JSON.stringify([...lWithoutR])}`;
|
|
20
|
+
}
|
|
21
|
+
if (rWithoutL.size > 0) {
|
|
22
|
+
message += lWithoutR.size > 0 ? ' and m' : 'M';
|
|
23
|
+
message += `ore in ${info.rightname}: ${JSON.stringify([...rWithoutL])}`;
|
|
24
|
+
}
|
|
25
|
+
info.report.addComment(message);
|
|
26
|
+
}
|
|
27
|
+
exports.setDifference = setDifference;
|
|
28
|
+
//# sourceMappingURL=diff.js.map
|