@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/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
[](https://github.com/Code-Inspect/flowr/wiki)\
|
|
2
|
+
[](https://github.com/Code-Inspect/flowr/actions/workflows/qa.yaml) [](https://codecov.io/gh/Code-Inspect/flowr) [](https://hub.docker.com/r/eagleoutice/flowr) [](https://github.com/Code-Inspect/flowr/releases/latest)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
*flowR* is a static [dataflow analyzer](https://en.wikipedia.org/wiki/Data-flow_analysis) and [program slicer](https://github.com/Code-Inspect/flowr/wiki/Terminology#program-slice) for the [*R*](https://www.r-project.org/) programming language (currently tested for versions `4.x`).
|
|
6
|
+
|
|
7
|
+
## ⭐ Getting Started
|
|
8
|
+
|
|
9
|
+
To get started with _flowR_, please check out the [Overview](https://github.com/Code-Inspect/flowr/wiki/Overview). The [Setup](https://github.com/Code-Inspect/flowr/wiki/Setup) wiki page explains how you can download and setup _flowR_ on your system. With docker 🐳️, the following line should be enough (and drop you directly into the REPL):
|
|
10
|
+
|
|
11
|
+
```shell
|
|
12
|
+
docker run -it --rm eagleoutice/flowr
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## 📜 More Information
|
|
17
|
+
|
|
18
|
+
For more details, see the [wiki pages](https://github.com/Code-Inspect/flowr/wiki) and the deployed [code documentation](https://code-inspect.github.io/flowr/doc/).
|
|
19
|
+
|
|
20
|
+
We welcome every contribution! Please check out the [contributing guidelines](https://github.com/Code-Inspect/flowr/tree/main/.github/CONTRIBUTING.md) for more information.
|
|
21
|
+
|
|
22
|
+
----
|
|
23
|
+
|
|
24
|
+
*flowr* is actively developed by *Florian Sihler* (contact at: <florian.sihler@uni-ulm.de>) under the
|
|
25
|
+
[GPLv3 License](LICENSE).
|
|
26
|
+
|
|
27
|
+
----
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provides a top-level slicer that can be used to slice code *and* retrieve stats.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BenchmarkSlicer = exports.benchmarkLogger = void 0;
|
|
11
|
+
const r_bridge_1 = require("../r-bridge");
|
|
12
|
+
const stopwatch_1 = require("./stopwatch");
|
|
13
|
+
const assert_1 = require("../util/assert");
|
|
14
|
+
const slicing_1 = require("../slicing");
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const log_1 = require("../util/log");
|
|
17
|
+
const core_1 = require("../core");
|
|
18
|
+
const strings_1 = require("../util/strings");
|
|
19
|
+
exports.benchmarkLogger = log_1.log.getSubLogger({ name: 'benchmark' });
|
|
20
|
+
/**
|
|
21
|
+
* A slicer that can be used to slice exactly one file (multiple times).
|
|
22
|
+
* It holds its own {@link RShell} instance, maintains a cached dataflow and keeps measurements.
|
|
23
|
+
*
|
|
24
|
+
* Make sure to call {@link init} to initialize the slicer, before calling {@link slice}.
|
|
25
|
+
* After slicing, call {@link finish} to close the R session and retrieve the stats.
|
|
26
|
+
*
|
|
27
|
+
* @note Under the hood, the benchmark slicer maintains a {@link SteppingSlicer}.
|
|
28
|
+
*/
|
|
29
|
+
class BenchmarkSlicer {
|
|
30
|
+
/** Measures all data that is recorded *once* per slicer (complete setup up to the dataflow graph creation) */
|
|
31
|
+
commonMeasurements = new stopwatch_1.Measurements();
|
|
32
|
+
perSliceMeasurements = new Map;
|
|
33
|
+
shell;
|
|
34
|
+
stats;
|
|
35
|
+
loadedXml;
|
|
36
|
+
tokenMap;
|
|
37
|
+
dataflow;
|
|
38
|
+
normalizedAst;
|
|
39
|
+
totalStopwatch;
|
|
40
|
+
finished = false;
|
|
41
|
+
// Yes this is dirty, but we know that we assign the stepper during the initialization and this saves us from having to check for nullability every time
|
|
42
|
+
stepper = null;
|
|
43
|
+
constructor() {
|
|
44
|
+
this.totalStopwatch = this.commonMeasurements.start('total');
|
|
45
|
+
this.shell = this.commonMeasurements.measure('initialize R session', () => new r_bridge_1.RShell());
|
|
46
|
+
this.commonMeasurements.measure('inject home path', () => this.shell.tryToInjectHomeLibPath());
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize the slicer on the given request.
|
|
50
|
+
* Can only be called once for each instance.
|
|
51
|
+
*/
|
|
52
|
+
async init(request) {
|
|
53
|
+
(0, assert_1.guard)(this.stats === undefined, 'cannot initialize the slicer twice');
|
|
54
|
+
await this.commonMeasurements.measureAsync('ensure installation of xmlparsedata', () => this.shell.ensurePackageInstalled('xmlparsedata', true));
|
|
55
|
+
this.tokenMap = await this.commonMeasurements.measureAsync('retrieve token map',
|
|
56
|
+
// with this being the first time, there is no preexisting caching!
|
|
57
|
+
() => this.shell.tokenMap());
|
|
58
|
+
this.stepper = new core_1.SteppingSlicer({
|
|
59
|
+
shell: this.shell,
|
|
60
|
+
request: {
|
|
61
|
+
...request,
|
|
62
|
+
ensurePackageInstalled: true
|
|
63
|
+
},
|
|
64
|
+
stepOfInterest: core_1.LAST_STEP,
|
|
65
|
+
criterion: [],
|
|
66
|
+
tokenMap: this.tokenMap
|
|
67
|
+
});
|
|
68
|
+
this.loadedXml = await this.measureCommonStep('parse', 'retrieve AST from R code');
|
|
69
|
+
this.normalizedAst = await this.measureCommonStep('normalize', 'normalize R AST');
|
|
70
|
+
this.dataflow = await this.measureCommonStep('dataflow', 'produce dataflow information');
|
|
71
|
+
this.stepper.switchToSliceStage();
|
|
72
|
+
await this.calculateStatsAfterInit(request);
|
|
73
|
+
}
|
|
74
|
+
async calculateStatsAfterInit(request) {
|
|
75
|
+
const loadedContent = request.request === 'text' ? request.content : fs_1.default.readFileSync(request.content, 'utf-8');
|
|
76
|
+
// retrieve number of R tokens - flowr_parsed should still contain the last parsed code
|
|
77
|
+
const numberOfRTokens = await (0, r_bridge_1.retrieveNumberOfRTokensOfLastParse)(this.shell);
|
|
78
|
+
(0, assert_1.guard)(this.normalizedAst !== undefined, 'normalizedAst should be defined after initialization');
|
|
79
|
+
(0, assert_1.guard)(this.dataflow !== undefined, 'dataflow should be defined after initialization');
|
|
80
|
+
// collect dataflow graph size
|
|
81
|
+
const vertices = [...this.dataflow.graph.vertices(true)];
|
|
82
|
+
let numberOfEdges = 0;
|
|
83
|
+
let numberOfCalls = 0;
|
|
84
|
+
let numberOfDefinitions = 0;
|
|
85
|
+
for (const [n, info] of vertices) {
|
|
86
|
+
const outgoingEdges = this.dataflow.graph.outgoingEdges(n);
|
|
87
|
+
numberOfEdges += outgoingEdges?.size ?? 0;
|
|
88
|
+
if (info.tag === 'function-call') {
|
|
89
|
+
numberOfCalls++;
|
|
90
|
+
}
|
|
91
|
+
else if (info.tag === 'function-definition') {
|
|
92
|
+
numberOfDefinitions++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
this.stats = {
|
|
96
|
+
commonMeasurements: new Map(),
|
|
97
|
+
perSliceMeasurements: this.perSliceMeasurements,
|
|
98
|
+
request,
|
|
99
|
+
input: {
|
|
100
|
+
numberOfLines: loadedContent.split('\n').length,
|
|
101
|
+
numberOfCharacters: loadedContent.length,
|
|
102
|
+
numberOfNonWhitespaceCharacters: (0, strings_1.withoutWhitespace)(loadedContent).length,
|
|
103
|
+
numberOfRTokens: numberOfRTokens,
|
|
104
|
+
numberOfNormalizedTokens: [...(0, r_bridge_1.collectAllIds)(this.normalizedAst.ast)].length
|
|
105
|
+
},
|
|
106
|
+
dataflow: {
|
|
107
|
+
numberOfNodes: [...this.dataflow.graph.vertices(true)].length,
|
|
108
|
+
numberOfEdges: numberOfEdges,
|
|
109
|
+
numberOfCalls: numberOfCalls,
|
|
110
|
+
numberOfFunctionDefinitions: numberOfDefinitions
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Slice for the given {@link SlicingCriteria}.
|
|
116
|
+
* @see SingleSlicingCriterion
|
|
117
|
+
*
|
|
118
|
+
* @returns The per slice stats retrieved for this slicing criteria
|
|
119
|
+
*/
|
|
120
|
+
async slice(...slicingCriteria) {
|
|
121
|
+
exports.benchmarkLogger.trace(`try to slice for criteria ${JSON.stringify(slicingCriteria)}`);
|
|
122
|
+
this.guardActive();
|
|
123
|
+
(0, assert_1.guard)(!this.perSliceMeasurements.has(slicingCriteria), 'do not slice the same criteria combination twice');
|
|
124
|
+
const measurements = new stopwatch_1.Measurements();
|
|
125
|
+
const stats = {
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
127
|
+
measurements: undefined,
|
|
128
|
+
slicingCriteria: [],
|
|
129
|
+
numberOfDataflowNodesSliced: 0,
|
|
130
|
+
timesHitThreshold: 0,
|
|
131
|
+
reconstructedCode: {
|
|
132
|
+
code: '',
|
|
133
|
+
autoSelected: 0
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
this.perSliceMeasurements.set(slicingCriteria, stats);
|
|
137
|
+
this.stepper.updateCriterion(slicingCriteria);
|
|
138
|
+
const totalStopwatch = measurements.start('total');
|
|
139
|
+
const slicedOutput = await this.measureSliceStep('slice', measurements, 'static slicing');
|
|
140
|
+
stats.slicingCriteria = slicedOutput.decodedCriteria;
|
|
141
|
+
stats.reconstructedCode = await this.measureSliceStep('reconstruct', measurements, 'reconstruct code');
|
|
142
|
+
totalStopwatch.stop();
|
|
143
|
+
exports.benchmarkLogger.debug(`Produced code for ${JSON.stringify(slicingCriteria)}: ${stats.reconstructedCode.code}`);
|
|
144
|
+
const results = this.stepper.getResults(false);
|
|
145
|
+
if (exports.benchmarkLogger.settings.minLevel >= 3 /* LogLevel.Info */) {
|
|
146
|
+
exports.benchmarkLogger.info(`mapped slicing criteria: ${slicedOutput.decodedCriteria.map(c => {
|
|
147
|
+
const node = results.normalize.idMap.get(c.id);
|
|
148
|
+
return `\n- id: ${c.id}, location: ${JSON.stringify(node?.location)}, lexeme: ${JSON.stringify(node?.lexeme)}`;
|
|
149
|
+
}).join('')}`);
|
|
150
|
+
}
|
|
151
|
+
// if it is not in the dataflow graph it was kept to be safe and should not count to the included nodes
|
|
152
|
+
stats.numberOfDataflowNodesSliced = [...slicedOutput.result].filter(id => results.dataflow.graph.hasNode(id, false)).length;
|
|
153
|
+
stats.timesHitThreshold = slicedOutput.timesHitThreshold;
|
|
154
|
+
stats.measurements = measurements.get();
|
|
155
|
+
return {
|
|
156
|
+
stats,
|
|
157
|
+
slice: slicedOutput,
|
|
158
|
+
code: stats.reconstructedCode
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** Bridging the gap between the new internal and the old names for the benchmarking */
|
|
162
|
+
async measureCommonStep(expectedStep, keyToMeasure) {
|
|
163
|
+
const { result } = await this.commonMeasurements.measureAsync(keyToMeasure, () => this.stepper.nextStep(expectedStep));
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
async measureSliceStep(expectedStep, measure, keyToMeasure) {
|
|
167
|
+
const { result } = await measure.measureAsync(keyToMeasure, () => this.stepper.nextStep(expectedStep));
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
guardActive() {
|
|
171
|
+
(0, assert_1.guard)(this.stats !== undefined && !this.finished, 'need to call init before, and can not do after finish!');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Call {@link slice} for all slicing criteria that match the given filter.
|
|
175
|
+
* See {@link collectAllSlicingCriteria} for details.
|
|
176
|
+
* <p>
|
|
177
|
+
* the `report` function will be called *before* each individual slice is performed.
|
|
178
|
+
*
|
|
179
|
+
* @returns The number of slices that were produced
|
|
180
|
+
*
|
|
181
|
+
* @see collectAllSlicingCriteria
|
|
182
|
+
* @see SlicingCriteriaFilter
|
|
183
|
+
*/
|
|
184
|
+
async sliceForAll(filter, report = () => { }) {
|
|
185
|
+
this.guardActive();
|
|
186
|
+
let count = 0;
|
|
187
|
+
const allCriteria = [...(0, slicing_1.collectAllSlicingCriteria)(this.normalizedAst.ast, filter)];
|
|
188
|
+
for (const slicingCriteria of allCriteria) {
|
|
189
|
+
report(count, allCriteria.length, allCriteria);
|
|
190
|
+
await this.slice(...slicingCriteria);
|
|
191
|
+
count++;
|
|
192
|
+
}
|
|
193
|
+
return count;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Retrieves the final stats and closes the shell session.
|
|
197
|
+
* Can be called multiple times to retrieve the stored stats, but will only close the session once (the first time).
|
|
198
|
+
*/
|
|
199
|
+
finish() {
|
|
200
|
+
(0, assert_1.guard)(this.stats !== undefined, 'need to call init before finish');
|
|
201
|
+
if (!this.finished) {
|
|
202
|
+
this.commonMeasurements.measure('close R session', () => this.shell.close());
|
|
203
|
+
this.totalStopwatch.stop();
|
|
204
|
+
this.finished = true;
|
|
205
|
+
}
|
|
206
|
+
this.stats.commonMeasurements = this.commonMeasurements.get();
|
|
207
|
+
return {
|
|
208
|
+
stats: this.stats,
|
|
209
|
+
parse: this.loadedXml,
|
|
210
|
+
dataflow: this.dataflow,
|
|
211
|
+
normalize: this.normalizedAst,
|
|
212
|
+
tokenMap: this.tokenMap,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Only call in case of an error - if the session must be closed and the benchmark itself is to be considered failed/dead.
|
|
217
|
+
*/
|
|
218
|
+
ensureSessionClosed() {
|
|
219
|
+
this.shell.close();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.BenchmarkSlicer = BenchmarkSlicer;
|
|
223
|
+
//# sourceMappingURL=benchmark-slicer.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./stats"), exports);
|
|
18
|
+
__exportStar(require("./slicer"), exports);
|
|
19
|
+
__exportStar(require("./stopwatch"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provides a top-level slicer that can be used to slice code *and* retrieve stats.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { NormalizedAst, RParseRequestFromFile, RParseRequestFromText } from '../r-bridge';
|
|
6
|
+
import { DataflowInformation } from '../dataflow/internal/info';
|
|
7
|
+
import { SlicingCriteria, SlicingCriteriaFilter, SliceResult, ReconstructionResult } from '../slicing';
|
|
8
|
+
import { PerSliceStats, SlicerStats } from './stats';
|
|
9
|
+
import { MergeableRecord } from '../util/objects';
|
|
10
|
+
export declare const benchmarkLogger: import("tslog").Logger<import("tslog").ILogObj>;
|
|
11
|
+
/**
|
|
12
|
+
* Returns the stats but also the result of all setup steps (parsing, normalization, and the dataflow analysis) during the slicing.
|
|
13
|
+
* This is useful for debugging and visualizing the slicing process.
|
|
14
|
+
*/
|
|
15
|
+
export interface BenchmarkSlicerStats extends MergeableRecord {
|
|
16
|
+
/** the measurements obtained during the benchmark */
|
|
17
|
+
stats: SlicerStats;
|
|
18
|
+
/** the used token map when translating what was parsed from R */
|
|
19
|
+
tokenMap: Record<string, string>;
|
|
20
|
+
/** the initial and unmodified AST produced by the R side/the 'parse' step */
|
|
21
|
+
parse: string;
|
|
22
|
+
/** the normalized AST produced by the 'normalization' step, including its parent decoration */
|
|
23
|
+
normalize: NormalizedAst;
|
|
24
|
+
/** the dataflow graph produced by the 'dataflow' step */
|
|
25
|
+
dataflow: DataflowInformation;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Additionally to {@link BenchmarkSlicerStats}, this contains the results of a *single* slice.
|
|
29
|
+
* In other words, it holds the results of the slice and reconstruct steps.
|
|
30
|
+
*/
|
|
31
|
+
export interface BenchmarkSingleSliceStats extends MergeableRecord {
|
|
32
|
+
/** the measurements obtained during the single slice */
|
|
33
|
+
stats: PerSliceStats;
|
|
34
|
+
/** the result of the 'slice' step */
|
|
35
|
+
slice: SliceResult;
|
|
36
|
+
/** the final code, as the result of the 'reconstruct' step */
|
|
37
|
+
code: ReconstructionResult;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A slicer that can be used to slice exactly one file (multiple times).
|
|
41
|
+
* It holds its own {@link RShell} instance, maintains a cached dataflow and keeps measurements.
|
|
42
|
+
*
|
|
43
|
+
* Make sure to call {@link init} to initialize the slicer, before calling {@link slice}.
|
|
44
|
+
* After slicing, call {@link finish} to close the R session and retrieve the stats.
|
|
45
|
+
*
|
|
46
|
+
* @note Under the hood, the benchmark slicer maintains a {@link SteppingSlicer}.
|
|
47
|
+
*/
|
|
48
|
+
export declare class BenchmarkSlicer {
|
|
49
|
+
/** Measures all data that is recorded *once* per slicer (complete setup up to the dataflow graph creation) */
|
|
50
|
+
private readonly commonMeasurements;
|
|
51
|
+
private readonly perSliceMeasurements;
|
|
52
|
+
private readonly shell;
|
|
53
|
+
private stats;
|
|
54
|
+
private loadedXml;
|
|
55
|
+
private tokenMap;
|
|
56
|
+
private dataflow;
|
|
57
|
+
private normalizedAst;
|
|
58
|
+
private totalStopwatch;
|
|
59
|
+
private finished;
|
|
60
|
+
private stepper;
|
|
61
|
+
constructor();
|
|
62
|
+
/**
|
|
63
|
+
* Initialize the slicer on the given request.
|
|
64
|
+
* Can only be called once for each instance.
|
|
65
|
+
*/
|
|
66
|
+
init(request: RParseRequestFromFile | RParseRequestFromText): Promise<void>;
|
|
67
|
+
private calculateStatsAfterInit;
|
|
68
|
+
/**
|
|
69
|
+
* Slice for the given {@link SlicingCriteria}.
|
|
70
|
+
* @see SingleSlicingCriterion
|
|
71
|
+
*
|
|
72
|
+
* @returns The per slice stats retrieved for this slicing criteria
|
|
73
|
+
*/
|
|
74
|
+
slice(...slicingCriteria: SlicingCriteria): Promise<BenchmarkSingleSliceStats>;
|
|
75
|
+
/** Bridging the gap between the new internal and the old names for the benchmarking */
|
|
76
|
+
private measureCommonStep;
|
|
77
|
+
private measureSliceStep;
|
|
78
|
+
private guardActive;
|
|
79
|
+
/**
|
|
80
|
+
* Call {@link slice} for all slicing criteria that match the given filter.
|
|
81
|
+
* See {@link collectAllSlicingCriteria} for details.
|
|
82
|
+
* <p>
|
|
83
|
+
* the `report` function will be called *before* each individual slice is performed.
|
|
84
|
+
*
|
|
85
|
+
* @returns The number of slices that were produced
|
|
86
|
+
*
|
|
87
|
+
* @see collectAllSlicingCriteria
|
|
88
|
+
* @see SlicingCriteriaFilter
|
|
89
|
+
*/
|
|
90
|
+
sliceForAll(filter: SlicingCriteriaFilter, report?: (current: number, total: number, allCriteria: SlicingCriteria[]) => void): Promise<number>;
|
|
91
|
+
/**
|
|
92
|
+
* Retrieves the final stats and closes the shell session.
|
|
93
|
+
* Can be called multiple times to retrieve the stored stats, but will only close the session once (the first time).
|
|
94
|
+
*/
|
|
95
|
+
finish(): BenchmarkSlicerStats;
|
|
96
|
+
/**
|
|
97
|
+
* Only call in case of an error - if the session must be closed and the benchmark itself is to be considered failed/dead.
|
|
98
|
+
*/
|
|
99
|
+
ensureSessionClosed(): void;
|
|
100
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provides a top-level slicer that can be used to slice code *and* retrieve stats.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BenchmarkSlicer = exports.benchmarkLogger = void 0;
|
|
11
|
+
const r_bridge_1 = require("../r-bridge");
|
|
12
|
+
const stopwatch_1 = require("./stopwatch");
|
|
13
|
+
const assert_1 = require("../util/assert");
|
|
14
|
+
const slicing_1 = require("../slicing");
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const log_1 = require("../util/log");
|
|
17
|
+
const core_1 = require("../core");
|
|
18
|
+
const strings_1 = require("../util/strings");
|
|
19
|
+
exports.benchmarkLogger = log_1.log.getSubLogger({ name: 'benchmark' });
|
|
20
|
+
/**
|
|
21
|
+
* A slicer that can be used to slice exactly one file (multiple times).
|
|
22
|
+
* It holds its own {@link RShell} instance, maintains a cached dataflow and keeps measurements.
|
|
23
|
+
*
|
|
24
|
+
* Make sure to call {@link init} to initialize the slicer, before calling {@link slice}.
|
|
25
|
+
* After slicing, call {@link finish} to close the R session and retrieve the stats.
|
|
26
|
+
*
|
|
27
|
+
* @note Under the hood, the benchmark slicer maintains a {@link SteppingSlicer}.
|
|
28
|
+
*/
|
|
29
|
+
class BenchmarkSlicer {
|
|
30
|
+
/** Measures all data that is recorded *once* per slicer (complete setup up to the dataflow graph creation) */
|
|
31
|
+
commonMeasurements = new stopwatch_1.Measurements();
|
|
32
|
+
perSliceMeasurements = new Map;
|
|
33
|
+
shell;
|
|
34
|
+
stats;
|
|
35
|
+
loadedXml;
|
|
36
|
+
tokenMap;
|
|
37
|
+
dataflow;
|
|
38
|
+
normalizedAst;
|
|
39
|
+
totalStopwatch;
|
|
40
|
+
finished = false;
|
|
41
|
+
// Yes this is dirty, but we know that we assign the stepper during the initialization and this saves us from having to check for nullability every time
|
|
42
|
+
stepper = null;
|
|
43
|
+
constructor() {
|
|
44
|
+
this.totalStopwatch = this.commonMeasurements.start('total');
|
|
45
|
+
this.shell = this.commonMeasurements.measure('initialize R session', () => new r_bridge_1.RShell());
|
|
46
|
+
this.commonMeasurements.measure('inject home path', () => this.shell.tryToInjectHomeLibPath());
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize the slicer on the given request.
|
|
50
|
+
* Can only be called once for each instance.
|
|
51
|
+
*/
|
|
52
|
+
async init(request) {
|
|
53
|
+
(0, assert_1.guard)(this.stats === undefined, 'cannot initialize the slicer twice');
|
|
54
|
+
await this.commonMeasurements.measureAsync('ensure installation of xmlparsedata', () => this.shell.ensurePackageInstalled('xmlparsedata', true));
|
|
55
|
+
this.tokenMap = await this.commonMeasurements.measureAsync('retrieve token map',
|
|
56
|
+
// with this being the first time, there is no preexisting caching!
|
|
57
|
+
() => this.shell.tokenMap());
|
|
58
|
+
this.stepper = new core_1.SteppingSlicer({
|
|
59
|
+
shell: this.shell,
|
|
60
|
+
request: {
|
|
61
|
+
...request,
|
|
62
|
+
ensurePackageInstalled: true
|
|
63
|
+
},
|
|
64
|
+
stepOfInterest: core_1.LAST_STEP,
|
|
65
|
+
criterion: [],
|
|
66
|
+
tokenMap: this.tokenMap
|
|
67
|
+
});
|
|
68
|
+
this.loadedXml = await this.measureCommonStep('parse', 'retrieve AST from R code');
|
|
69
|
+
this.normalizedAst = await this.measureCommonStep('normalize', 'normalize R AST');
|
|
70
|
+
this.dataflow = await this.measureCommonStep('dataflow', 'produce dataflow information');
|
|
71
|
+
this.stepper.switchToSliceStage();
|
|
72
|
+
await this.calculateStatsAfterInit(request);
|
|
73
|
+
}
|
|
74
|
+
async calculateStatsAfterInit(request) {
|
|
75
|
+
const loadedContent = request.request === 'text' ? request.content : fs_1.default.readFileSync(request.content, 'utf-8');
|
|
76
|
+
// retrieve number of R tokens - flowr_parsed should still contain the last parsed code
|
|
77
|
+
const numberOfRTokens = await (0, r_bridge_1.retrieveNumberOfRTokensOfLastParse)(this.shell);
|
|
78
|
+
(0, assert_1.guard)(this.normalizedAst !== undefined, 'normalizedAst should be defined after initialization');
|
|
79
|
+
(0, assert_1.guard)(this.dataflow !== undefined, 'dataflow should be defined after initialization');
|
|
80
|
+
// collect dataflow graph size
|
|
81
|
+
const vertices = [...this.dataflow.graph.vertices(true)];
|
|
82
|
+
let numberOfEdges = 0;
|
|
83
|
+
let numberOfCalls = 0;
|
|
84
|
+
let numberOfDefinitions = 0;
|
|
85
|
+
for (const [n, info] of vertices) {
|
|
86
|
+
const outgoingEdges = this.dataflow.graph.outgoingEdges(n);
|
|
87
|
+
numberOfEdges += outgoingEdges?.size ?? 0;
|
|
88
|
+
if (info.tag === 'function-call') {
|
|
89
|
+
numberOfCalls++;
|
|
90
|
+
}
|
|
91
|
+
else if (info.tag === 'function-definition') {
|
|
92
|
+
numberOfDefinitions++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
this.stats = {
|
|
96
|
+
commonMeasurements: new Map(),
|
|
97
|
+
perSliceMeasurements: this.perSliceMeasurements,
|
|
98
|
+
request,
|
|
99
|
+
input: {
|
|
100
|
+
numberOfLines: loadedContent.split('\n').length,
|
|
101
|
+
numberOfCharacters: loadedContent.length,
|
|
102
|
+
numberOfNonWhitespaceCharacters: (0, strings_1.withoutWhitespace)(loadedContent).length,
|
|
103
|
+
numberOfRTokens: numberOfRTokens,
|
|
104
|
+
numberOfNormalizedTokens: [...(0, r_bridge_1.collectAllIds)(this.normalizedAst.ast)].length
|
|
105
|
+
},
|
|
106
|
+
dataflow: {
|
|
107
|
+
numberOfNodes: [...this.dataflow.graph.vertices(true)].length,
|
|
108
|
+
numberOfEdges: numberOfEdges,
|
|
109
|
+
numberOfCalls: numberOfCalls,
|
|
110
|
+
numberOfFunctionDefinitions: numberOfDefinitions
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Slice for the given {@link SlicingCriteria}.
|
|
116
|
+
* @see SingleSlicingCriterion
|
|
117
|
+
*
|
|
118
|
+
* @returns The per slice stats retrieved for this slicing criteria
|
|
119
|
+
*/
|
|
120
|
+
async slice(...slicingCriteria) {
|
|
121
|
+
exports.benchmarkLogger.trace(`try to slice for criteria ${JSON.stringify(slicingCriteria)}`);
|
|
122
|
+
this.guardActive();
|
|
123
|
+
(0, assert_1.guard)(!this.perSliceMeasurements.has(slicingCriteria), 'do not slice the same criteria combination twice');
|
|
124
|
+
const measurements = new stopwatch_1.Measurements();
|
|
125
|
+
const stats = {
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
127
|
+
measurements: undefined,
|
|
128
|
+
slicingCriteria: [],
|
|
129
|
+
numberOfDataflowNodesSliced: 0,
|
|
130
|
+
timesHitThreshold: 0,
|
|
131
|
+
reconstructedCode: {
|
|
132
|
+
code: '',
|
|
133
|
+
autoSelected: 0
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
this.perSliceMeasurements.set(slicingCriteria, stats);
|
|
137
|
+
this.stepper.updateCriterion(slicingCriteria);
|
|
138
|
+
const totalStopwatch = measurements.start('total');
|
|
139
|
+
const slicedOutput = await this.measureSliceStep('slice', measurements, 'static slicing');
|
|
140
|
+
stats.slicingCriteria = slicedOutput.decodedCriteria;
|
|
141
|
+
stats.reconstructedCode = await this.measureSliceStep('reconstruct', measurements, 'reconstruct code');
|
|
142
|
+
totalStopwatch.stop();
|
|
143
|
+
exports.benchmarkLogger.debug(`Produced code for ${JSON.stringify(slicingCriteria)}: ${stats.reconstructedCode.code}`);
|
|
144
|
+
const results = this.stepper.getResults(false);
|
|
145
|
+
if (exports.benchmarkLogger.settings.minLevel >= 3 /* LogLevel.Info */) {
|
|
146
|
+
exports.benchmarkLogger.info(`mapped slicing criteria: ${slicedOutput.decodedCriteria.map(c => {
|
|
147
|
+
const node = results.normalize.idMap.get(c.id);
|
|
148
|
+
return `\n- id: ${c.id}, location: ${JSON.stringify(node?.location)}, lexeme: ${JSON.stringify(node?.lexeme)}`;
|
|
149
|
+
}).join('')}`);
|
|
150
|
+
}
|
|
151
|
+
// if it is not in the dataflow graph it was kept to be safe and should not count to the included nodes
|
|
152
|
+
stats.numberOfDataflowNodesSliced = [...slicedOutput.result].filter(id => results.dataflow.graph.hasNode(id, false)).length;
|
|
153
|
+
stats.timesHitThreshold = slicedOutput.timesHitThreshold;
|
|
154
|
+
stats.measurements = measurements.get();
|
|
155
|
+
return {
|
|
156
|
+
stats,
|
|
157
|
+
slice: slicedOutput,
|
|
158
|
+
code: stats.reconstructedCode
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** Bridging the gap between the new internal and the old names for the benchmarking */
|
|
162
|
+
async measureCommonStep(expectedStep, keyToMeasure) {
|
|
163
|
+
const { result } = await this.commonMeasurements.measureAsync(keyToMeasure, () => this.stepper.nextStep(expectedStep));
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
async measureSliceStep(expectedStep, measure, keyToMeasure) {
|
|
167
|
+
const { result } = await measure.measureAsync(keyToMeasure, () => this.stepper.nextStep(expectedStep));
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
guardActive() {
|
|
171
|
+
(0, assert_1.guard)(this.stats !== undefined && !this.finished, 'need to call init before, and can not do after finish!');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Call {@link slice} for all slicing criteria that match the given filter.
|
|
175
|
+
* See {@link collectAllSlicingCriteria} for details.
|
|
176
|
+
* <p>
|
|
177
|
+
* the `report` function will be called *before* each individual slice is performed.
|
|
178
|
+
*
|
|
179
|
+
* @returns The number of slices that were produced
|
|
180
|
+
*
|
|
181
|
+
* @see collectAllSlicingCriteria
|
|
182
|
+
* @see SlicingCriteriaFilter
|
|
183
|
+
*/
|
|
184
|
+
async sliceForAll(filter, report = () => { }) {
|
|
185
|
+
this.guardActive();
|
|
186
|
+
let count = 0;
|
|
187
|
+
const allCriteria = [...(0, slicing_1.collectAllSlicingCriteria)(this.normalizedAst.ast, filter)];
|
|
188
|
+
for (const slicingCriteria of allCriteria) {
|
|
189
|
+
report(count, allCriteria.length, allCriteria);
|
|
190
|
+
await this.slice(...slicingCriteria);
|
|
191
|
+
count++;
|
|
192
|
+
}
|
|
193
|
+
return count;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Retrieves the final stats and closes the shell session.
|
|
197
|
+
* Can be called multiple times to retrieve the stored stats, but will only close the session once (the first time).
|
|
198
|
+
*/
|
|
199
|
+
finish() {
|
|
200
|
+
(0, assert_1.guard)(this.stats !== undefined, 'need to call init before finish');
|
|
201
|
+
if (!this.finished) {
|
|
202
|
+
this.commonMeasurements.measure('close R session', () => this.shell.close());
|
|
203
|
+
this.totalStopwatch.stop();
|
|
204
|
+
this.finished = true;
|
|
205
|
+
}
|
|
206
|
+
this.stats.commonMeasurements = this.commonMeasurements.get();
|
|
207
|
+
return {
|
|
208
|
+
stats: this.stats,
|
|
209
|
+
parse: this.loadedXml,
|
|
210
|
+
dataflow: this.dataflow,
|
|
211
|
+
normalize: this.normalizedAst,
|
|
212
|
+
tokenMap: this.tokenMap,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Only call in case of an error - if the session must be closed and the benchmark itself is to be considered failed/dead.
|
|
217
|
+
*/
|
|
218
|
+
ensureSessionClosed() {
|
|
219
|
+
this.shell.close();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.BenchmarkSlicer = BenchmarkSlicer;
|
|
223
|
+
//# sourceMappingURL=slicer.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './print';
|
|
2
|
+
export * from './stats';
|
|
3
|
+
export * from '../../util/summarizer/benchmark/summarizer';
|
|
4
|
+
export { UltimateSlicerStats } from '../../util/summarizer/benchmark/data';
|
|
5
|
+
export { SummarizedPerSliceStats } from '../../util/summarizer/benchmark/data';
|
|
6
|
+
export { Reduction } from '../../util/summarizer/benchmark/data';
|
|
7
|
+
export { SummarizedSlicerStats } from '../../util/summarizer/benchmark/data';
|
|
8
|
+
export { summarizeSummarizedMeasurement } from '../../util/summarizer/benchmark/first-phase/process';
|
|
9
|
+
export { summarizeMeasurement } from '../../util/summarizer/benchmark/first-phase/process';
|
|
10
|
+
export { summarizeSlicerStats } from '../../util/summarizer/benchmark/first-phase/process';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.summarizeSlicerStats = exports.summarizeMeasurement = exports.summarizeSummarizedMeasurement = void 0;
|
|
18
|
+
__exportStar(require("./print"), exports);
|
|
19
|
+
__exportStar(require("./stats"), exports);
|
|
20
|
+
__exportStar(require("../../util/summarizer/benchmark/summarizer"), exports);
|
|
21
|
+
var process_1 = require("../../util/summarizer/benchmark/first-phase/process");
|
|
22
|
+
Object.defineProperty(exports, "summarizeSummarizedMeasurement", { enumerable: true, get: function () { return process_1.summarizeSummarizedMeasurement; } });
|
|
23
|
+
var process_2 = require("../../util/summarizer/benchmark/first-phase/process");
|
|
24
|
+
Object.defineProperty(exports, "summarizeMeasurement", { enumerable: true, get: function () { return process_2.summarizeMeasurement; } });
|
|
25
|
+
var process_3 = require("../../util/summarizer/benchmark/first-phase/process");
|
|
26
|
+
Object.defineProperty(exports, "summarizeSlicerStats", { enumerable: true, get: function () { return process_3.summarizeSlicerStats; } });
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SummarizedSlicerStats, UltimateSlicerStats } from '../../util/summarizer/benchmark/data';
|
|
2
|
+
/**
|
|
3
|
+
* Converts the given stats to a human-readable string.
|
|
4
|
+
* You may have to {@link summarizeSlicerStats | summarize} the stats first.
|
|
5
|
+
*/
|
|
6
|
+
export declare function stats2string(stats: SummarizedSlicerStats): string;
|
|
7
|
+
export declare function ultimateStats2String(stats: UltimateSlicerStats): string;
|