@eagleoutice/flowr 1.5.2 → 2.0.1
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/abstract-interpretation/handler/binop/binop.d.ts +3 -4
- package/abstract-interpretation/handler/binop/binop.js +4 -2
- package/abstract-interpretation/handler/binop/operators.d.ts +2 -2
- package/abstract-interpretation/handler/binop/operators.js +14 -28
- package/abstract-interpretation/processor.d.ts +3 -2
- package/abstract-interpretation/processor.js +2 -2
- package/benchmark/slicer.d.ts +101 -0
- package/benchmark/slicer.js +214 -0
- package/benchmark/stats/print.d.ts +7 -0
- package/benchmark/stats/print.js +151 -0
- package/benchmark/stats/stats.d.ts +42 -0
- package/benchmark/stats/stats.js +6 -0
- package/benchmark/stopwatch.d.ts +35 -0
- package/benchmark/stopwatch.js +79 -0
- package/benchmark/summarizer/data.d.ts +54 -0
- package/benchmark/summarizer/first-phase/input.d.ts +3 -0
- package/benchmark/summarizer/first-phase/input.js +76 -0
- package/benchmark/summarizer/first-phase/process.d.ts +11 -0
- package/benchmark/summarizer/first-phase/process.js +205 -0
- package/benchmark/summarizer/second-phase/graph.d.ts +2 -0
- package/benchmark/summarizer/second-phase/graph.js +54 -0
- package/benchmark/summarizer/second-phase/process.d.ts +6 -0
- package/benchmark/summarizer/second-phase/process.js +127 -0
- package/benchmark/summarizer/summarizer.d.ts +31 -0
- package/benchmark/summarizer/summarizer.js +58 -0
- package/cli/benchmark-app.d.ts +10 -0
- package/cli/benchmark-app.js +67 -0
- package/cli/benchmark-helper-app.d.ts +9 -0
- package/cli/benchmark-helper-app.js +69 -0
- package/cli/common/features.d.ts +3 -0
- package/cli/common/features.js +30 -0
- package/cli/common/options.d.ts +20 -0
- package/cli/common/options.js +85 -0
- package/cli/common/script.d.ts +21 -0
- package/cli/common/script.js +61 -0
- package/cli/common/scripts-info.d.ts +25 -0
- package/cli/common/scripts-info.js +83 -0
- package/cli/export-quads-app.d.ts +7 -0
- package/cli/export-quads-app.js +43 -0
- package/cli/flowr.d.ts +29 -0
- package/cli/flowr.js +141 -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 +13 -0
- package/cli/repl/commands/commands.js +142 -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/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 +110 -0
- package/cli/repl/commands/quit.d.ts +2 -0
- package/cli/repl/commands/quit.js +15 -0
- package/cli/repl/commands/version.d.ts +16 -0
- package/cli/repl/commands/version.js +28 -0
- package/cli/repl/core.d.ts +36 -0
- package/cli/repl/core.js +174 -0
- package/cli/repl/execute.d.ts +28 -0
- package/cli/repl/execute.js +79 -0
- package/cli/repl/print-version.d.ts +2 -0
- package/cli/repl/print-version.js +10 -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 +218 -0
- package/cli/repl/server/messages/analysis.d.ts +72 -0
- package/cli/repl/server/messages/analysis.js +21 -0
- package/cli/repl/server/messages/error.d.ts +11 -0
- package/{core/input.js → cli/repl/server/messages/error.js} +1 -1
- package/cli/repl/server/messages/hello.d.ts +20 -0
- package/{core/output.js → cli/repl/server/messages/hello.js} +1 -1
- package/cli/repl/server/messages/messages.d.ts +35 -0
- package/cli/repl/server/messages/messages.js +40 -0
- package/cli/repl/server/messages/repl.d.ts +33 -0
- package/cli/repl/server/messages/repl.js +37 -0
- package/cli/repl/server/messages/slice.d.ts +26 -0
- package/cli/repl/server/messages/slice.js +37 -0
- package/cli/repl/server/net.d.ts +49 -0
- package/cli/repl/server/net.js +63 -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 +83 -0
- package/cli/statistics-app.d.ts +11 -0
- package/cli/statistics-app.js +99 -0
- package/cli/statistics-helper-app.d.ts +11 -0
- package/cli/statistics-helper-app.js +87 -0
- package/cli/summarizer-app.d.ts +18 -0
- package/cli/summarizer-app.js +66 -0
- package/core/pipeline-executor.d.ts +154 -0
- package/core/pipeline-executor.js +221 -0
- package/core/print/dataflow-printer.d.ts +3 -4
- package/core/print/dataflow-printer.js +5 -5
- package/core/print/normalize-printer.d.ts +1 -1
- package/core/print/normalize-printer.js +3 -3
- package/core/print/parse-printer.js +3 -3
- package/core/print/print.d.ts +13 -4
- package/core/print/print.js +13 -2
- package/core/print/slice-diff-ansi.d.ts +3 -2
- package/core/print/slice-diff-ansi.js +4 -4
- package/core/steps/all/core/00-parse.d.ts +28 -0
- package/core/steps/all/core/00-parse.js +24 -0
- package/core/steps/all/core/10-normalize.d.ts +29 -0
- package/core/steps/all/core/10-normalize.js +26 -0
- package/core/steps/all/core/20-dataflow.d.ts +27 -0
- package/core/steps/all/core/20-dataflow.js +29 -0
- package/core/steps/all/static-slicing/00-slice.d.ts +28 -0
- package/core/steps/all/static-slicing/00-slice.js +21 -0
- package/core/steps/all/static-slicing/10-reconstruct.d.ts +25 -0
- package/core/steps/all/static-slicing/10-reconstruct.js +21 -0
- package/core/steps/pipeline/create-pipeline.d.ts +6 -0
- package/core/steps/pipeline/create-pipeline.js +130 -0
- package/core/steps/pipeline/default-pipelines.d.ts +251 -0
- package/core/steps/pipeline/default-pipelines.js +18 -0
- package/core/steps/pipeline/invalid-pipeline-error.d.ts +6 -0
- package/core/steps/pipeline/invalid-pipeline-error.js +14 -0
- package/core/steps/pipeline/pipeline.d.ts +60 -0
- package/core/steps/pipeline/pipeline.js +28 -0
- package/core/steps/pipeline-step.d.ts +85 -0
- package/core/steps/pipeline-step.js +8 -0
- package/dataflow/environments/append.d.ts +4 -4
- package/dataflow/environments/append.js +4 -4
- package/dataflow/environments/built-in.d.ts +25 -0
- package/dataflow/environments/built-in.js +123 -0
- package/dataflow/environments/clone.d.ts +2 -0
- package/dataflow/environments/clone.js +23 -0
- package/dataflow/environments/{register.d.ts → define.d.ts} +3 -3
- package/dataflow/environments/define.js +51 -0
- package/dataflow/environments/diff.d.ts +6 -0
- package/dataflow/environments/diff.js +85 -0
- package/dataflow/environments/environment.d.ts +10 -43
- package/dataflow/environments/environment.js +32 -138
- package/dataflow/environments/identifier.d.ts +31 -0
- package/dataflow/environments/identifier.js +3 -0
- package/dataflow/environments/overwrite.d.ts +4 -4
- package/dataflow/environments/overwrite.js +9 -22
- package/dataflow/environments/resolve-by-name.d.ts +7 -6
- package/dataflow/environments/resolve-by-name.js +35 -19
- package/dataflow/environments/scoping.js +1 -4
- package/dataflow/extractor.d.ts +6 -6
- package/dataflow/extractor.js +47 -57
- package/dataflow/graph/diff.d.ts +24 -7
- package/dataflow/graph/diff.js +114 -74
- package/dataflow/graph/edge.d.ts +66 -20
- package/dataflow/graph/edge.js +73 -27
- package/dataflow/graph/graph.d.ts +53 -29
- package/dataflow/graph/graph.js +84 -89
- package/dataflow/graph/quads.js +2 -2
- package/dataflow/graph/vertex.d.ts +37 -34
- package/dataflow/info.d.ts +49 -0
- package/dataflow/info.js +29 -0
- package/dataflow/internal/linker.d.ts +11 -10
- package/dataflow/internal/linker.js +64 -90
- package/dataflow/internal/process/functions/call/argument/make-argument.d.ts +6 -0
- package/dataflow/internal/process/functions/call/argument/make-argument.js +31 -0
- package/dataflow/internal/process/functions/call/argument/unpack-argument.d.ts +3 -0
- package/dataflow/internal/process/functions/call/argument/unpack-argument.js +18 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-access.d.ts +9 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-access.js +82 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.d.ts +29 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +167 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.d.ts +11 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +165 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +97 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +165 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-get.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-get.js +36 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +100 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-library.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-library.js +32 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-logical-bin-op.d.ts +9 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-logical-bin-op.js +35 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-pipe.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +35 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-quote.d.ts +9 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-quote.js +29 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +32 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-replacement.d.ts +12 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +45 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +11 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-source.js +72 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.d.ts +7 -0
- package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +61 -0
- package/dataflow/internal/process/functions/call/common.d.ts +35 -0
- package/dataflow/internal/process/functions/call/common.js +70 -0
- package/dataflow/internal/process/functions/call/default-call-handling.d.ts +5 -0
- package/dataflow/internal/process/functions/call/default-call-handling.js +15 -0
- package/dataflow/internal/process/functions/call/known-call-handling.d.ts +26 -0
- package/dataflow/internal/process/functions/call/known-call-handling.js +62 -0
- package/dataflow/internal/process/functions/call/named-call-handling.d.ts +7 -0
- package/dataflow/internal/process/functions/call/named-call-handling.js +53 -0
- package/dataflow/internal/process/functions/call/unnamed-call-handling.d.ts +6 -0
- package/dataflow/internal/process/functions/call/unnamed-call-handling.js +58 -0
- package/dataflow/internal/process/functions/process-argument.d.ts +9 -0
- package/dataflow/internal/process/functions/{argument.js → process-argument.js} +25 -20
- package/dataflow/internal/process/functions/{parameter.d.ts → process-parameter.d.ts} +3 -2
- package/dataflow/internal/process/functions/{parameter.js → process-parameter.js} +10 -13
- package/dataflow/internal/process/process-named-call.d.ts +6 -0
- package/dataflow/internal/process/process-named-call.js +17 -0
- package/dataflow/internal/process/process-symbol.d.ts +5 -0
- package/dataflow/internal/process/process-symbol.js +26 -0
- package/dataflow/internal/process/process-uninteresting-leaf.d.ts +4 -0
- package/dataflow/internal/process/process-uninteresting-leaf.js +9 -0
- package/dataflow/internal/process/process-value.d.ts +4 -0
- package/dataflow/internal/process/process-value.js +22 -0
- package/dataflow/logger.d.ts +1 -0
- package/dataflow/logger.js +6 -0
- package/dataflow/processor.d.ts +18 -13
- package/dataflow/processor.js +1 -1
- package/package.json +48 -85
- package/r-bridge/data/data.d.ts +603 -0
- package/r-bridge/data/data.js +753 -0
- package/r-bridge/data/get.d.ts +19 -0
- package/r-bridge/data/get.js +51 -0
- package/r-bridge/data/print.d.ts +1 -0
- package/r-bridge/data/print.js +58 -0
- package/r-bridge/data/types.d.ts +33 -0
- package/r-bridge/data/types.js +3 -0
- package/r-bridge/init.d.ts +3 -0
- package/r-bridge/init.js +22 -0
- package/r-bridge/lang-4.x/ast/model/collect.d.ts +2 -1
- package/r-bridge/lang-4.x/ast/model/collect.js +2 -2
- package/r-bridge/lang-4.x/ast/model/model.d.ts +26 -5
- package/r-bridge/lang-4.x/ast/model/nodes/r-access.d.ts +4 -3
- package/r-bridge/lang-4.x/ast/model/nodes/r-argument.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-binary-op.d.ts +0 -17
- package/r-bridge/lang-4.x/ast/model/nodes/r-expression-list.d.ts +3 -1
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.d.ts +6 -4
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.js +2 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.d.ts +2 -3
- package/r-bridge/lang-4.x/ast/model/nodes/r-number.d.ts +1 -1
- package/r-bridge/lang-4.x/ast/model/nodes/r-string.d.ts +1 -1
- package/r-bridge/lang-4.x/ast/model/nodes/r-symbol.js +2 -2
- package/r-bridge/lang-4.x/ast/model/nodes/r-unary-op.d.ts +0 -11
- package/r-bridge/lang-4.x/ast/model/operators.d.ts +6 -18
- package/r-bridge/lang-4.x/ast/model/operators.js +36 -48
- package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +19 -15
- package/r-bridge/lang-4.x/ast/model/processing/decorate.js +59 -54
- package/r-bridge/lang-4.x/ast/model/processing/node-id.d.ts +8 -0
- package/r-bridge/lang-4.x/ast/model/processing/node-id.js +18 -0
- package/r-bridge/lang-4.x/ast/model/processing/role.d.ts +2 -2
- package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.d.ts +28 -17
- package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.js +7 -34
- package/r-bridge/lang-4.x/ast/model/processing/visitor.js +5 -2
- package/r-bridge/lang-4.x/ast/model/type.js +13 -6
- package/r-bridge/lang-4.x/ast/parser/json/format.d.ts +4 -1
- package/r-bridge/lang-4.x/ast/parser/json/format.js +9 -2
- package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +5 -5
- package/r-bridge/lang-4.x/ast/parser/json/parser.js +22 -27
- package/r-bridge/lang-4.x/ast/parser/xml/input-format.d.ts +10 -7
- package/r-bridge/lang-4.x/ast/parser/xml/input-format.js +19 -11
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then-else.d.ts → normalize-if-then-else.d.ts} +3 -3
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then-else.js → normalize-if-then-else.js} +10 -13
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then.d.ts → normalize-if-then.d.ts} +3 -3
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then.js → normalize-if-then.js} +9 -12
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/normalize-expression.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/normalize-expression.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{argument.d.ts → normalize-argument.d.ts} +4 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{argument.js → normalize-argument.js} +13 -17
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{call.d.ts → normalize-call.d.ts} +6 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{call.js → normalize-call.js} +24 -29
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/normalize-definition.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{definition.js → normalize-definition.js} +14 -19
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{parameter.d.ts → normalize-parameter.d.ts} +4 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{parameter.js → normalize-parameter.js} +12 -16
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-break.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{break.js → normalize-break.js} +6 -8
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-for.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{for.js → normalize-for.js} +18 -20
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-next.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{next.js → normalize-next.js} +6 -8
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-repeat.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{repeat.js → normalize-repeat.js} +13 -16
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-while.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{while.js → normalize-while.js} +10 -12
- package/r-bridge/lang-4.x/ast/parser/xml/internal/{access.d.ts → normalize-access.d.ts} +4 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/{access.js → normalize-access.js} +44 -45
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/{binary.d.ts → normalize-binary.d.ts} +3 -3
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/{binary.js → normalize-binary.js} +23 -73
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/normalize-unary.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/normalize-unary.js +47 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/normalize-comment.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/{comment.js → normalize-comment.js} +5 -10
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/normalize-line-directive.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/{line-directive.js → normalize-line-directive.js} +7 -12
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-delimiter.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-delimiter.js +15 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-expressions.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-expressions.js +182 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-root.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-root.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-single-node.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-single-node.js +59 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/normalize-number.d.ts +16 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{number.js → normalize-number.js} +12 -18
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/normalize-string.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{string.js → normalize-string.js} +7 -12
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{symbol.d.ts → normalize-symbol.d.ts} +4 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{symbol.js → normalize-symbol.js} +12 -15
- package/r-bridge/lang-4.x/ast/parser/xml/{internal/meta.d.ts → normalize-meta.d.ts} +5 -3
- package/r-bridge/lang-4.x/ast/parser/xml/{internal/meta.js → normalize-meta.js} +8 -8
- package/r-bridge/lang-4.x/ast/parser/xml/{data.d.ts → normalizer-data.d.ts} +1 -5
- package/r-bridge/lang-4.x/ast/parser/xml/normalizer-data.js +3 -0
- package/r-bridge/lang-4.x/{values.d.ts → convert-values.d.ts} +2 -2
- package/r-bridge/lang-4.x/{values.js → convert-values.js} +5 -5
- package/r-bridge/retriever.d.ts +5 -5
- package/r-bridge/retriever.js +11 -24
- package/r-bridge/shell-executor.d.ts +0 -1
- package/r-bridge/shell-executor.js +7 -12
- package/r-bridge/shell.d.ts +14 -12
- package/r-bridge/shell.js +50 -45
- package/reconstruct/reconstruct.d.ts +4 -2
- package/reconstruct/reconstruct.js +193 -185
- package/slicing/criterion/collect-all.d.ts +4 -3
- package/slicing/criterion/collect-all.js +5 -1
- package/slicing/criterion/filters/all-variables.js +14 -22
- package/slicing/criterion/parse.d.ts +4 -2
- package/slicing/criterion/parse.js +13 -11
- package/slicing/static/fingerprint.d.ts +5 -0
- package/slicing/static/fingerprint.js +17 -0
- package/slicing/static/slice-call.d.ts +10 -0
- package/slicing/static/slice-call.js +86 -0
- package/slicing/static/slicer-types.d.ts +33 -0
- package/slicing/static/slicer-types.js +3 -0
- package/slicing/static/static-slicer.d.ts +6 -24
- package/slicing/static/static-slicer.js +54 -155
- package/slicing/static/visiting-queue.d.ts +23 -0
- package/slicing/static/visiting-queue.js +53 -0
- package/statistics/features/common-syntax-probability.d.ts +29 -0
- package/statistics/features/common-syntax-probability.js +159 -0
- package/statistics/features/feature.d.ts +182 -0
- package/statistics/features/feature.js +39 -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 +12 -0
- package/statistics/features/supported/assignments/assignments.js +55 -0
- package/statistics/features/supported/assignments/post-process.d.ts +3 -0
- package/statistics/features/supported/assignments/post-process.js +124 -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/post-process.d.ts +3 -0
- package/statistics/features/supported/comments/post-process.js +49 -0
- package/statistics/features/supported/control-flow/control-flow.d.ts +17 -0
- package/statistics/features/supported/control-flow/control-flow.js +68 -0
- package/statistics/features/supported/control-flow/post-process.d.ts +3 -0
- package/statistics/features/supported/control-flow/post-process.js +64 -0
- package/statistics/features/supported/data-access/data-access.d.ts +15 -0
- package/statistics/features/supported/data-access/data-access.js +120 -0
- package/statistics/features/supported/data-access/post-process.d.ts +3 -0
- package/statistics/features/supported/data-access/post-process.js +106 -0
- package/statistics/features/supported/defined-functions/defined-functions.d.ts +34 -0
- package/statistics/features/supported/defined-functions/defined-functions.js +142 -0
- package/statistics/features/supported/defined-functions/post-process.d.ts +6 -0
- package/statistics/features/supported/defined-functions/post-process.js +169 -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/post-process.d.ts +3 -0
- package/statistics/features/supported/expression-list/post-process.js +43 -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 +71 -0
- package/statistics/features/supported/used-functions/post-process.d.ts +6 -0
- package/statistics/features/supported/used-functions/post-process.js +178 -0
- package/statistics/features/supported/used-functions/used-functions.d.ts +24 -0
- package/statistics/features/supported/used-functions/used-functions.js +97 -0
- package/statistics/features/supported/used-packages/post-process.d.ts +3 -0
- package/statistics/features/supported/used-packages/post-process.js +120 -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/post-process.d.ts +3 -0
- package/statistics/features/supported/values/post-process.js +71 -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/post-process.d.ts +9 -0
- package/statistics/features/supported/variables/post-process.js +121 -0
- package/statistics/features/supported/variables/variables.d.ts +15 -0
- package/statistics/features/supported/variables/variables.js +60 -0
- package/statistics/meta-statistics.d.ts +33 -0
- package/statistics/meta-statistics.js +17 -0
- package/statistics/output/file-provider.d.ts +37 -0
- package/statistics/output/file-provider.js +97 -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 +28 -0
- package/statistics/statistics.js +108 -0
- package/statistics/summarizer/auto-detect.d.ts +2 -0
- package/statistics/summarizer/auto-detect.js +32 -0
- package/statistics/summarizer/first-phase/process.d.ts +6 -0
- package/statistics/summarizer/first-phase/process.js +81 -0
- package/statistics/summarizer/post-process/clusterer.d.ts +26 -0
- package/statistics/summarizer/post-process/clusterer.js +43 -0
- package/statistics/summarizer/post-process/file-based-count.d.ts +17 -0
- package/statistics/summarizer/post-process/file-based-count.js +49 -0
- package/statistics/summarizer/post-process/histogram.d.ts +59 -0
- package/statistics/summarizer/post-process/histogram.js +128 -0
- package/statistics/summarizer/post-process/post-process-output.d.ts +16 -0
- package/statistics/summarizer/post-process/post-process-output.js +105 -0
- package/statistics/summarizer/second-phase/process.d.ts +11 -0
- package/statistics/summarizer/second-phase/process.js +116 -0
- package/statistics/summarizer/summarizer.d.ts +35 -0
- package/statistics/summarizer/summarizer.js +135 -0
- package/util/ansi.d.ts +2 -2
- package/util/ansi.js +2 -2
- package/util/arrays.d.ts +11 -1
- package/util/arrays.js +34 -1
- package/util/assert.d.ts +1 -0
- package/util/assert.js +5 -1
- package/util/cfg/cfg.d.ts +3 -2
- package/util/cfg/cfg.js +17 -28
- package/util/cfg/visitor.d.ts +1 -1
- package/util/defaultmap.d.ts +1 -1
- package/util/defaultmap.js +1 -1
- package/util/diff.d.ts +4 -4
- package/util/files.d.ts +2 -2
- package/util/files.js +1 -1
- package/util/log.d.ts +1 -0
- package/util/log.js +7 -1
- package/util/logic.d.ts +1 -0
- package/util/logic.js +3 -0
- package/util/mermaid/ast.d.ts +1 -1
- package/util/mermaid/ast.js +2 -2
- package/util/mermaid/cfg.d.ts +1 -1
- package/util/mermaid/dfg.d.ts +34 -8
- package/util/mermaid/dfg.js +99 -70
- package/util/mermaid/mermaid.d.ts +1 -1
- package/util/mermaid/mermaid.js +6 -7
- package/util/objects.js +4 -0
- package/util/quads.d.ts +3 -3
- package/util/quads.js +0 -1
- package/util/range.d.ts +27 -14
- package/util/range.js +31 -27
- package/util/version.js +1 -1
- package/core/index.d.ts +0 -4
- package/core/index.js +0 -23
- package/core/input.d.ts +0 -42
- package/core/output.d.ts +0 -15
- package/core/slicer.d.ts +0 -124
- package/core/slicer.js +0 -227
- package/core/steps.d.ts +0 -508
- package/core/steps.js +0 -100
- package/dataflow/environments/index.d.ts +0 -7
- package/dataflow/environments/index.js +0 -23
- package/dataflow/environments/register.js +0 -40
- package/dataflow/environments/scopes.d.ts +0 -6
- package/dataflow/environments/scopes.js +0 -6
- package/dataflow/graph/index.d.ts +0 -4
- package/dataflow/graph/index.js +0 -21
- package/dataflow/index.d.ts +0 -5
- package/dataflow/index.js +0 -24
- package/dataflow/internal/info.d.ts +0 -21
- package/dataflow/internal/info.js +0 -16
- package/dataflow/internal/process/access.d.ts +0 -4
- package/dataflow/internal/process/access.js +0 -53
- package/dataflow/internal/process/expression-list.d.ts +0 -8
- package/dataflow/internal/process/expression-list.js +0 -144
- package/dataflow/internal/process/functions/argument.d.ts +0 -8
- package/dataflow/internal/process/functions/exit-points.d.ts +0 -2
- package/dataflow/internal/process/functions/exit-points.js +0 -121
- package/dataflow/internal/process/functions/function-call.d.ts +0 -5
- package/dataflow/internal/process/functions/function-call.js +0 -105
- package/dataflow/internal/process/functions/function-definition.d.ts +0 -4
- package/dataflow/internal/process/functions/function-definition.js +0 -176
- package/dataflow/internal/process/functions/source.d.ts +0 -8
- package/dataflow/internal/process/functions/source.js +0 -81
- package/dataflow/internal/process/if-then-else.d.ts +0 -4
- package/dataflow/internal/process/if-then-else.js +0 -56
- package/dataflow/internal/process/loops/for-loop.d.ts +0 -4
- package/dataflow/internal/process/loops/for-loop.js +0 -54
- package/dataflow/internal/process/loops/repeat-loop.d.ts +0 -4
- package/dataflow/internal/process/loops/repeat-loop.js +0 -21
- package/dataflow/internal/process/loops/while-loop.d.ts +0 -4
- package/dataflow/internal/process/loops/while-loop.js +0 -31
- package/dataflow/internal/process/operators/assignment.d.ts +0 -4
- package/dataflow/internal/process/operators/assignment.js +0 -129
- package/dataflow/internal/process/operators/non-assignment-binary-op.d.ts +0 -4
- package/dataflow/internal/process/operators/non-assignment-binary-op.js +0 -25
- package/dataflow/internal/process/operators/pipe.d.ts +0 -4
- package/dataflow/internal/process/operators/pipe.js +0 -46
- package/dataflow/internal/process/operators/unary-op.d.ts +0 -4
- package/dataflow/internal/process/operators/unary-op.js +0 -10
- package/dataflow/internal/process/symbol.d.ts +0 -4
- package/dataflow/internal/process/symbol.js +0 -21
- package/dataflow/internal/process/uninteresting-leaf.d.ts +0 -3
- package/dataflow/internal/process/uninteresting-leaf.js +0 -9
- package/index.d.ts +0 -4
- package/index.js +0 -21
- package/r-bridge/index.d.ts +0 -11
- package/r-bridge/index.js +0 -28
- package/r-bridge/lang-4.x/ast/index.d.ts +0 -3
- package/r-bridge/lang-4.x/ast/index.js +0 -22
- package/r-bridge/lang-4.x/ast/model/index.d.ts +0 -6
- package/r-bridge/lang-4.x/ast/model/index.js +0 -23
- package/r-bridge/lang-4.x/ast/model/nodes/index.d.ts +0 -21
- package/r-bridge/lang-4.x/ast/model/nodes/index.js +0 -38
- package/r-bridge/lang-4.x/ast/model/nodes/info/index.d.ts +0 -13
- package/r-bridge/lang-4.x/ast/model/nodes/info/index.js +0 -27
- package/r-bridge/lang-4.x/ast/model/processing/index.d.ts +0 -5
- package/r-bridge/lang-4.x/ast/model/processing/index.js +0 -22
- package/r-bridge/lang-4.x/ast/parser/xml/hooks.d.ts +0 -292
- package/r-bridge/lang-4.x/ast/parser/xml/hooks.js +0 -136
- package/r-bridge/lang-4.x/ast/parser/xml/index.d.ts +0 -3
- package/r-bridge/lang-4.x/ast/parser/xml/index.js +0 -20
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.d.ts +0 -2
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.js +0 -19
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.d.ts +0 -10
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.js +0 -65
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.d.ts +0 -1
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.js +0 -18
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.d.ts +0 -12
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.d.ts +0 -2
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.js +0 -20
- package/r-bridge/lang-4.x/ast/parser/xml/internal/index.d.ts +0 -9
- package/r-bridge/lang-4.x/ast/parser/xml/internal/index.js +0 -26
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.d.ts +0 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.d.ts +0 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.d.ts +0 -5
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.js +0 -22
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.d.ts +0 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.d.ts +0 -13
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.d.ts +0 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.d.ts +0 -3
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.js +0 -20
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.d.ts +0 -6
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.js +0 -24
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.d.ts +0 -13
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.js +0 -59
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.d.ts +0 -11
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.d.ts +0 -1
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.js +0 -18
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.d.ts +0 -12
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.d.ts +0 -10
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.js +0 -159
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.d.ts +0 -3
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.js +0 -20
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.d.ts +0 -4
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.js +0 -33
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.d.ts +0 -13
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.js +0 -64
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.d.ts +0 -3
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.js +0 -20
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.d.ts +0 -13
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.d.ts +0 -11
- package/r-bridge/lang-4.x/index.d.ts +0 -2
- package/r-bridge/lang-4.x/index.js +0 -19
- package/slicing/criterion/filters/index.d.ts +0 -1
- package/slicing/criterion/filters/index.js +0 -18
- package/slicing/criterion/index.d.ts +0 -3
- package/slicing/criterion/index.js +0 -20
- package/slicing/index.d.ts +0 -3
- package/slicing/index.js +0 -20
- package/slicing/static/index.d.ts +0 -1
- package/slicing/static/index.js +0 -18
- package/util/mermaid/index.d.ts +0 -3
- package/util/mermaid/index.js +0 -20
- /package/{r-bridge/lang-4.x/ast/parser/xml → benchmark/summarizer}/data.js +0 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NoInfo } from '../../r-bridge/lang-4.x/ast/model/model';
|
|
2
|
+
import { type NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
3
|
+
import type { NormalizedAst, ParentInformation } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
2
4
|
/** Either `line:column`, `line@variable-name`, or `$id` */
|
|
3
5
|
export type SingleSlicingCriterion = `${number}:${number}` | `${number}@${string}` | `$${number}`;
|
|
4
6
|
export type SlicingCriteria = SingleSlicingCriterion[];
|
|
@@ -16,5 +18,5 @@ export interface DecodedCriterion {
|
|
|
16
18
|
criterion: SingleSlicingCriterion;
|
|
17
19
|
id: NodeId;
|
|
18
20
|
}
|
|
19
|
-
export type DecodedCriteria = DecodedCriterion
|
|
21
|
+
export type DecodedCriteria = ReadonlyArray<DecodedCriterion>;
|
|
20
22
|
export declare function convertAllSlicingCriteriaToIds(criteria: SlicingCriteria, decorated: NormalizedAst): DecodedCriteria;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.convertAllSlicingCriteriaToIds = exports.slicingCriterionToId = exports.CriteriaParseError = void 0;
|
|
4
|
-
const
|
|
4
|
+
const log_1 = require("../../util/log");
|
|
5
|
+
const node_id_1 = require("../../r-bridge/lang-4.x/ast/model/processing/node-id");
|
|
6
|
+
const static_slicer_1 = require("../static/static-slicer");
|
|
5
7
|
/**
|
|
6
8
|
* Thrown if the given slicing criteria can not be found
|
|
7
9
|
*/
|
|
@@ -19,14 +21,14 @@ function slicingCriterionToId(criterion, decorated) {
|
|
|
19
21
|
let resolved;
|
|
20
22
|
if (criterion.includes(':')) {
|
|
21
23
|
const [line, column] = criterion.split(':').map(c => parseInt(c));
|
|
22
|
-
resolved = locationToId(
|
|
24
|
+
resolved = locationToId([line, column], decorated.idMap);
|
|
23
25
|
}
|
|
24
26
|
else if (criterion.includes('@')) {
|
|
25
27
|
const [line, name] = criterion.split(/@(.*)/s); // only split at first occurrence
|
|
26
28
|
resolved = conventionalCriteriaToId(parseInt(line), name, decorated.idMap);
|
|
27
29
|
}
|
|
28
30
|
else if (criterion.startsWith('$')) {
|
|
29
|
-
resolved = criterion.substring(1);
|
|
31
|
+
resolved = (0, node_id_1.normalizeIdToNumberIfPossible)(criterion.substring(1));
|
|
30
32
|
}
|
|
31
33
|
if (resolved === undefined) {
|
|
32
34
|
throw new CriteriaParseError(`invalid slicing criterion ${criterion}`);
|
|
@@ -37,38 +39,38 @@ exports.slicingCriterionToId = slicingCriterionToId;
|
|
|
37
39
|
function locationToId(location, dataflowIdMap) {
|
|
38
40
|
let candidate;
|
|
39
41
|
for (const [id, nodeInfo] of dataflowIdMap.entries()) {
|
|
40
|
-
if (nodeInfo.location === undefined || nodeInfo.location
|
|
42
|
+
if (nodeInfo.location === undefined || nodeInfo.location[0] !== location[0] || nodeInfo.location[1] !== location[1]) {
|
|
41
43
|
continue; // only consider those with position information
|
|
42
44
|
}
|
|
43
|
-
|
|
45
|
+
(0, log_1.expensiveTrace)(static_slicer_1.slicerLogger, () => `can resolve id ${id} (${JSON.stringify(nodeInfo.location)}) for location ${JSON.stringify(location)}`);
|
|
44
46
|
// function calls have the same location as the symbol they refer to, so we need to prefer the function call
|
|
45
|
-
if (candidate !== undefined && nodeInfo.type !== "RFunctionCall" /* RType.FunctionCall */
|
|
47
|
+
if (candidate !== undefined && nodeInfo.type !== "RFunctionCall" /* RType.FunctionCall */ || nodeInfo.type === "RArgument" /* RType.Argument */ || nodeInfo.type === "RExpressionList" /* RType.ExpressionList */) {
|
|
46
48
|
continue;
|
|
47
49
|
}
|
|
48
50
|
candidate = nodeInfo;
|
|
49
51
|
}
|
|
50
52
|
const id = candidate?.info.id;
|
|
51
53
|
if (id) {
|
|
52
|
-
|
|
54
|
+
(0, log_1.expensiveTrace)(static_slicer_1.slicerLogger, () => `resolve id ${id} (${JSON.stringify(candidate?.info)}) for location ${JSON.stringify(location)}`);
|
|
53
55
|
}
|
|
54
56
|
return id;
|
|
55
57
|
}
|
|
56
58
|
function conventionalCriteriaToId(line, name, dataflowIdMap) {
|
|
57
59
|
let candidate;
|
|
58
60
|
for (const [id, nodeInfo] of dataflowIdMap.entries()) {
|
|
59
|
-
if (nodeInfo.location === undefined || nodeInfo.location
|
|
61
|
+
if (nodeInfo.location === undefined || nodeInfo.location[0] !== line || nodeInfo.lexeme !== name) {
|
|
60
62
|
continue;
|
|
61
63
|
}
|
|
62
|
-
|
|
64
|
+
static_slicer_1.slicerLogger.trace(`can resolve id ${id} (${JSON.stringify(nodeInfo)}) for line ${line} and name ${name}`);
|
|
63
65
|
// function calls have the same location as the symbol they refer to, so we need to prefer the function call
|
|
64
|
-
if (candidate !== undefined && nodeInfo.type !== "RFunctionCall" /* RType.FunctionCall */
|
|
66
|
+
if (candidate !== undefined && nodeInfo.type !== "RFunctionCall" /* RType.FunctionCall */ || nodeInfo.type === "RArgument" /* RType.Argument */ || nodeInfo.type === "RExpressionList" /* RType.ExpressionList */) {
|
|
65
67
|
continue;
|
|
66
68
|
}
|
|
67
69
|
candidate = nodeInfo;
|
|
68
70
|
}
|
|
69
71
|
const id = candidate?.info.id;
|
|
70
72
|
if (id) {
|
|
71
|
-
|
|
73
|
+
static_slicer_1.slicerLogger.trace(`resolve id ${id} (${JSON.stringify(candidate?.info)}) for line ${line} and name ${name}`);
|
|
72
74
|
}
|
|
73
75
|
return id;
|
|
74
76
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { REnvironmentInformation } from '../../dataflow/environments/environment';
|
|
2
|
+
import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
3
|
+
export type Fingerprint = string;
|
|
4
|
+
export declare function envFingerprint(env: REnvironmentInformation): Fingerprint;
|
|
5
|
+
export declare function fingerprint(id: NodeId, envFingerprint: Fingerprint, onlyForSideEffects: boolean): Fingerprint;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fingerprint = exports.envFingerprint = void 0;
|
|
7
|
+
const object_hash_1 = __importDefault(require("object-hash"));
|
|
8
|
+
const environment_1 = require("../../dataflow/environments/environment");
|
|
9
|
+
function envFingerprint(env) {
|
|
10
|
+
return (0, object_hash_1.default)(env, { excludeKeys: key => key === 'id', replacer: (v) => v === environment_1.BuiltInEnvironment ? undefined : v });
|
|
11
|
+
}
|
|
12
|
+
exports.envFingerprint = envFingerprint;
|
|
13
|
+
function fingerprint(id, envFingerprint, onlyForSideEffects) {
|
|
14
|
+
return `${id}-${envFingerprint}-${onlyForSideEffects ? '0' : '1'}`;
|
|
15
|
+
}
|
|
16
|
+
exports.fingerprint = fingerprint;
|
|
17
|
+
//# sourceMappingURL=fingerprint.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NodeToSlice } from './slicer-types';
|
|
2
|
+
import type { VisitingQueue } from './visiting-queue';
|
|
3
|
+
import type { Fingerprint } from './fingerprint';
|
|
4
|
+
import type { DataflowGraphVertexFunctionCall } from '../../dataflow/graph/vertex';
|
|
5
|
+
import type { REnvironmentInformation } from '../../dataflow/environments/environment';
|
|
6
|
+
import type { DataflowGraph, OutgoingEdges } from '../../dataflow/graph/graph';
|
|
7
|
+
/** returns the new threshold hit count */
|
|
8
|
+
export declare function sliceForCall(current: NodeToSlice, callerInfo: DataflowGraphVertexFunctionCall, dataflowGraph: DataflowGraph, queue: VisitingQueue): void;
|
|
9
|
+
/** Returns true if we found at least one return edge */
|
|
10
|
+
export declare function handleReturns(queue: VisitingQueue, currentEdges: OutgoingEdges, baseEnvFingerprint: Fingerprint, baseEnvironment: REnvironmentInformation): boolean;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleReturns = exports.sliceForCall = void 0;
|
|
4
|
+
const assert_1 = require("../../util/assert");
|
|
5
|
+
const fingerprint_1 = require("./fingerprint");
|
|
6
|
+
const linker_1 = require("../../dataflow/internal/linker");
|
|
7
|
+
const scoping_1 = require("../../dataflow/environments/scoping");
|
|
8
|
+
const overwrite_1 = require("../../dataflow/environments/overwrite");
|
|
9
|
+
const built_in_1 = require("../../dataflow/environments/built-in");
|
|
10
|
+
const resolve_by_name_1 = require("../../dataflow/environments/resolve-by-name");
|
|
11
|
+
const edge_1 = require("../../dataflow/graph/edge");
|
|
12
|
+
function retrieveActiveEnvironment(callerInfo, baseEnvironment) {
|
|
13
|
+
let callerEnvironment = callerInfo.environment;
|
|
14
|
+
if (baseEnvironment.level !== callerEnvironment.level) {
|
|
15
|
+
while (baseEnvironment.level < callerEnvironment.level) {
|
|
16
|
+
baseEnvironment = (0, scoping_1.pushLocalEnvironment)(baseEnvironment);
|
|
17
|
+
}
|
|
18
|
+
while (baseEnvironment.level > callerEnvironment.level) {
|
|
19
|
+
callerEnvironment = (0, scoping_1.pushLocalEnvironment)(callerEnvironment);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return (0, overwrite_1.overwriteEnvironment)(baseEnvironment, callerEnvironment);
|
|
23
|
+
}
|
|
24
|
+
/** returns the new threshold hit count */
|
|
25
|
+
function sliceForCall(current, callerInfo, dataflowGraph, queue) {
|
|
26
|
+
// bind with call-local environments during slicing
|
|
27
|
+
const outgoingEdges = dataflowGraph.get(callerInfo.id, true);
|
|
28
|
+
(0, assert_1.guard)(outgoingEdges !== undefined, () => `outgoing edges of id: ${callerInfo.id} must be in graph but can not be found, keep in slice to be sure`);
|
|
29
|
+
// lift baseEnv on the same level
|
|
30
|
+
const baseEnvironment = current.baseEnvironment;
|
|
31
|
+
const baseEnvPrint = (0, fingerprint_1.envFingerprint)(baseEnvironment);
|
|
32
|
+
const activeEnvironment = retrieveActiveEnvironment(callerInfo, baseEnvironment);
|
|
33
|
+
const activeEnvironmentFingerprint = (0, fingerprint_1.envFingerprint)(activeEnvironment);
|
|
34
|
+
const name = callerInfo.name;
|
|
35
|
+
(0, assert_1.guard)(name !== undefined, () => `name of id: ${callerInfo.id} can not be found in id map`);
|
|
36
|
+
const functionCallDefs = (0, resolve_by_name_1.resolveByName)(name, activeEnvironment)?.filter(d => d.definedAt !== built_in_1.BuiltIn)?.map(d => d.nodeId) ?? [];
|
|
37
|
+
for (const [target, outgoingEdge] of outgoingEdges[1].entries()) {
|
|
38
|
+
if ((0, edge_1.edgeIncludesType)(outgoingEdge.types, 4 /* EdgeType.Calls */)) {
|
|
39
|
+
functionCallDefs.push(target);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const functionCallTargets = (0, linker_1.getAllLinkedFunctionDefinitions)(new Set(functionCallDefs), dataflowGraph);
|
|
43
|
+
for (const [_, functionCallTarget] of functionCallTargets) {
|
|
44
|
+
// all those linked within the scopes of other functions are already linked when exiting a function definition
|
|
45
|
+
for (const openIn of functionCallTarget.subflow.in) {
|
|
46
|
+
const defs = openIn.name ? (0, resolve_by_name_1.resolveByName)(openIn.name, activeEnvironment) : undefined;
|
|
47
|
+
if (defs === undefined) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
for (const def of defs.filter(d => d.nodeId !== built_in_1.BuiltIn)) {
|
|
51
|
+
queue.add(def.nodeId, baseEnvironment, baseEnvPrint, current.onlyForSideEffects);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
for (const exitPoint of functionCallTarget.exitPoints) {
|
|
55
|
+
queue.add(exitPoint, activeEnvironment, activeEnvironmentFingerprint, current.onlyForSideEffects);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.sliceForCall = sliceForCall;
|
|
60
|
+
/** Returns true if we found at least one return edge */
|
|
61
|
+
function handleReturns(queue, currentEdges, baseEnvFingerprint, baseEnvironment) {
|
|
62
|
+
let found = false;
|
|
63
|
+
for (const [, edge] of currentEdges) {
|
|
64
|
+
if ((0, edge_1.edgeIncludesType)(edge.types, 8 /* EdgeType.Returns */)) {
|
|
65
|
+
found = true;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!found) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
for (const [target, edge] of currentEdges) {
|
|
73
|
+
if ((0, edge_1.edgeIncludesType)(edge.types, 8 /* EdgeType.Returns */)) {
|
|
74
|
+
queue.add(target, baseEnvironment, baseEnvFingerprint, false);
|
|
75
|
+
}
|
|
76
|
+
else if ((0, edge_1.edgeIncludesType)(edge.types, 1 /* EdgeType.Reads */)) {
|
|
77
|
+
queue.add(target, baseEnvironment, baseEnvFingerprint, false);
|
|
78
|
+
}
|
|
79
|
+
else if ((0, edge_1.edgeIncludesType)(edge.types, 64 /* EdgeType.Argument */)) {
|
|
80
|
+
queue.potentialArguments.add(target);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
exports.handleReturns = handleReturns;
|
|
86
|
+
//# sourceMappingURL=slice-call.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
2
|
+
import type { REnvironmentInformation } from '../../dataflow/environments/environment';
|
|
3
|
+
import type { DecodedCriteria } from '../criterion/parse';
|
|
4
|
+
/**
|
|
5
|
+
* Represents a node during the slicing process, together with the environment it is traversed in
|
|
6
|
+
* (modified by function calls) and whether it is only used for its side effects.
|
|
7
|
+
*/
|
|
8
|
+
export interface NodeToSlice {
|
|
9
|
+
readonly id: NodeId;
|
|
10
|
+
/** used for calling context, etc. */
|
|
11
|
+
readonly baseEnvironment: REnvironmentInformation;
|
|
12
|
+
/** if we add a function call, we may need it only for its side effects (e.g., a redefinition of a global variable), if so, 'returns' links will not be traced */
|
|
13
|
+
readonly onlyForSideEffects: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The result of the slice step
|
|
17
|
+
*/
|
|
18
|
+
export interface SliceResult {
|
|
19
|
+
/**
|
|
20
|
+
* Number of times the set threshold was hit (i.e., the same node was visited too often).
|
|
21
|
+
* While any number above 0 might indicate a wrong slice, it does not have to as usually even revisiting the same node
|
|
22
|
+
* seldom causes more ids to be included in the slice.
|
|
23
|
+
*/
|
|
24
|
+
readonly timesHitThreshold: number;
|
|
25
|
+
/**
|
|
26
|
+
* The ids of the nodes in the normalized ast that are part of the slice.
|
|
27
|
+
*/
|
|
28
|
+
readonly result: ReadonlySet<NodeId>;
|
|
29
|
+
/**
|
|
30
|
+
* The mapping produced to decode the entered criteria
|
|
31
|
+
*/
|
|
32
|
+
readonly decodedCriteria: DecodedCriteria;
|
|
33
|
+
}
|
|
@@ -1,29 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
1
|
+
import type { SliceResult } from './slicer-types';
|
|
2
|
+
import type { DataflowGraph } from '../../dataflow/graph/graph';
|
|
3
|
+
import type { NormalizedAst } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
|
|
4
|
+
import type { SlicingCriteria } from '../criterion/parse';
|
|
4
5
|
export declare const slicerLogger: import("tslog").Logger<import("tslog").ILogObj>;
|
|
5
|
-
/**
|
|
6
|
-
* The result of the slice step
|
|
7
|
-
*/
|
|
8
|
-
export interface SliceResult {
|
|
9
|
-
/**
|
|
10
|
-
* Number of times the set threshold was hit (i.e., the same node was visited too often).
|
|
11
|
-
* While any number above 0 might indicate a wrong slice, it does not have to as usually even revisiting the same node does not
|
|
12
|
-
* often cause more ids to be included in the slice.
|
|
13
|
-
*/
|
|
14
|
-
timesHitThreshold: number;
|
|
15
|
-
/**
|
|
16
|
-
* The ids of the nodes in the normalized ast that are part of the slice.
|
|
17
|
-
*/
|
|
18
|
-
result: Set<NodeId>;
|
|
19
|
-
/**
|
|
20
|
-
* The mapping produced to decode the entered criteria
|
|
21
|
-
*/
|
|
22
|
-
decodedCriteria: DecodedCriteria;
|
|
23
|
-
}
|
|
24
6
|
/**
|
|
25
7
|
* This returns the ids to include in the slice, when slicing with the given seed id's (must be at least one).
|
|
26
8
|
* <p>
|
|
27
|
-
* The returned ids can be used to {@link reconstructToCode
|
|
9
|
+
* The returned ids can be used to {@link reconstructToCode|reconstruct the slice to R code}.
|
|
28
10
|
*/
|
|
29
|
-
export declare function staticSlicing(
|
|
11
|
+
export declare function staticSlicing(graph: DataflowGraph, ast: NormalizedAst, criteria: SlicingCriteria, threshold?: number): Readonly<SliceResult>;
|
|
@@ -1,186 +1,85 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.staticSlicing = exports.slicerLogger = void 0;
|
|
7
|
-
const dataflow_1 = require("../../dataflow");
|
|
8
4
|
const assert_1 = require("../../util/assert");
|
|
9
|
-
const r_bridge_1 = require("../../r-bridge");
|
|
10
5
|
const log_1 = require("../../util/log");
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
6
|
+
const fingerprint_1 = require("./fingerprint");
|
|
7
|
+
const visiting_queue_1 = require("./visiting-queue");
|
|
8
|
+
const slice_call_1 = require("./slice-call");
|
|
9
|
+
const parse_1 = require("../criterion/parse");
|
|
10
|
+
const environment_1 = require("../../dataflow/environments/environment");
|
|
11
|
+
const edge_1 = require("../../dataflow/graph/edge");
|
|
12
|
+
const built_in_1 = require("../../dataflow/environments/built-in");
|
|
17
13
|
exports.slicerLogger = log_1.log.getSubLogger({ name: 'slicer' });
|
|
18
|
-
function envFingerprint(env) {
|
|
19
|
-
return (0, object_hash_1.default)(env, { excludeKeys: key => key === 'id' });
|
|
20
|
-
}
|
|
21
|
-
function fingerprint(id, envFingerprint, onlyForSideEffects) {
|
|
22
|
-
return `${id}-${envFingerprint}-${onlyForSideEffects ? '0' : '1'}`;
|
|
23
|
-
}
|
|
24
|
-
class VisitingQueue {
|
|
25
|
-
threshold;
|
|
26
|
-
timesHitThreshold = 0;
|
|
27
|
-
seen = new Map();
|
|
28
|
-
idThreshold = new defaultmap_1.DefaultMap(() => 0);
|
|
29
|
-
queue = [];
|
|
30
|
-
constructor(threshold) {
|
|
31
|
-
this.threshold = threshold;
|
|
32
|
-
}
|
|
33
|
-
add(target, env, envFingerprint, onlyForSideEffects) {
|
|
34
|
-
const idCounter = this.idThreshold.get(target);
|
|
35
|
-
if (idCounter > this.threshold) {
|
|
36
|
-
exports.slicerLogger.warn(`id: ${target} has been visited ${idCounter} times, skipping`);
|
|
37
|
-
this.timesHitThreshold++;
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
this.idThreshold.set(target, idCounter + 1);
|
|
42
|
-
}
|
|
43
|
-
const print = fingerprint(target, envFingerprint, onlyForSideEffects);
|
|
44
|
-
if (!this.seen.has(print)) {
|
|
45
|
-
this.seen.set(print, target);
|
|
46
|
-
this.queue.push({ id: target, baseEnvironment: env, onlyForSideEffects: onlyForSideEffects });
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
next() {
|
|
50
|
-
return this.queue.pop();
|
|
51
|
-
}
|
|
52
|
-
has() {
|
|
53
|
-
return this.queue.length > 0;
|
|
54
|
-
}
|
|
55
|
-
status() {
|
|
56
|
-
return {
|
|
57
|
-
timesHitThreshold: this.timesHitThreshold,
|
|
58
|
-
result: new Set(this.seen.values())
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
14
|
/**
|
|
63
15
|
* This returns the ids to include in the slice, when slicing with the given seed id's (must be at least one).
|
|
64
16
|
* <p>
|
|
65
|
-
* The returned ids can be used to {@link reconstructToCode
|
|
17
|
+
* The returned ids can be used to {@link reconstructToCode|reconstruct the slice to R code}.
|
|
66
18
|
*/
|
|
67
|
-
function staticSlicing(
|
|
19
|
+
function staticSlicing(graph, ast, criteria, threshold = 75) {
|
|
68
20
|
(0, assert_1.guard)(criteria.length > 0, 'must have at least one seed id to calculate slice');
|
|
69
|
-
const decodedCriteria = (0,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const queue = new VisitingQueue(threshold);
|
|
21
|
+
const decodedCriteria = (0, parse_1.convertAllSlicingCriteriaToIds)(criteria, ast);
|
|
22
|
+
(0, log_1.expensiveTrace)(exports.slicerLogger, () => `calculating slice for ${decodedCriteria.length} seed criteria: ${decodedCriteria.map(s => JSON.stringify(s)).join(', ')}`);
|
|
23
|
+
const queue = new visiting_queue_1.VisitingQueue(threshold);
|
|
24
|
+
let minDepth = Number.MAX_SAFE_INTEGER;
|
|
25
|
+
const sliceSeedIds = new Set();
|
|
75
26
|
// every node ships the call environment which registers the calling environment
|
|
76
27
|
{
|
|
77
|
-
const
|
|
28
|
+
const emptyEnv = (0, environment_1.initializeCleanEnvironments)();
|
|
29
|
+
const basePrint = (0, fingerprint_1.envFingerprint)(emptyEnv);
|
|
78
30
|
for (const startId of decodedCriteria) {
|
|
79
|
-
queue.add(startId.id,
|
|
31
|
+
queue.add(startId.id, emptyEnv, basePrint, false);
|
|
32
|
+
// retrieve the minimum depth of all nodes to only add control dependencies if they are "part" of the current execution
|
|
33
|
+
minDepth = Math.min(minDepth, ast.idMap.get(startId.id)?.info.depth ?? minDepth);
|
|
34
|
+
sliceSeedIds.add(startId.id);
|
|
80
35
|
}
|
|
81
36
|
}
|
|
82
|
-
while (queue.
|
|
37
|
+
while (queue.nonEmpty()) {
|
|
83
38
|
const current = queue.next();
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const baseEnvFingerprint = envFingerprint(current.baseEnvironment);
|
|
88
|
-
const currentInfo = dataflowGraph.get(current.id, true);
|
|
89
|
-
// slicerLogger.trace(`visiting id: ${current.id} with name: ${currentInfo?.[0].name ?? '<unknown>'}`)
|
|
39
|
+
const { baseEnvironment, id, onlyForSideEffects } = current;
|
|
40
|
+
const baseEnvFingerprint = (0, fingerprint_1.envFingerprint)(baseEnvironment);
|
|
41
|
+
const currentInfo = graph.get(id, true);
|
|
90
42
|
if (currentInfo === undefined) {
|
|
91
|
-
exports.slicerLogger.warn(`id: ${
|
|
43
|
+
exports.slicerLogger.warn(`id: ${id} must be in graph but can not be found, keep in slice to be sure`);
|
|
92
44
|
continue;
|
|
93
45
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
46
|
+
const [currentVertex, currentEdges] = currentInfo;
|
|
47
|
+
// we only add control dependencies iff 1) we are in different function call or 2) they have, at least, the same depth as the slicing seed
|
|
48
|
+
if (currentVertex.controlDependencies) {
|
|
49
|
+
const topLevel = graph.isRoot(id) || sliceSeedIds.has(id);
|
|
50
|
+
for (const cd of currentVertex.controlDependencies) {
|
|
51
|
+
if (!topLevel || (ast.idMap.get(cd)?.info.depth ?? 0) <= minDepth) {
|
|
52
|
+
queue.add(cd, baseEnvironment, baseEnvFingerprint, false);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
97
55
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (edge.types.has(dataflow_1.EdgeType.SideEffectOnCall)) {
|
|
102
|
-
queue.add(target, current.baseEnvironment, baseEnvFingerprint, true);
|
|
56
|
+
if (!onlyForSideEffects) {
|
|
57
|
+
if (currentVertex.tag === "function-call" /* VertexType.FunctionCall */ && !currentVertex.onlyBuiltin) {
|
|
58
|
+
(0, slice_call_1.sliceForCall)(current, currentVertex, graph, queue);
|
|
103
59
|
}
|
|
104
|
-
|
|
105
|
-
|
|
60
|
+
const ret = (0, slice_call_1.handleReturns)(queue, currentEdges, baseEnvFingerprint, baseEnvironment);
|
|
61
|
+
if (ret) {
|
|
62
|
+
continue;
|
|
106
63
|
}
|
|
107
64
|
}
|
|
108
|
-
for (const
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
// slicerLogger.trace(`static slicing produced: ${JSON.stringify([...seen])}`)
|
|
113
|
-
return { ...queue.status(), decodedCriteria };
|
|
114
|
-
}
|
|
115
|
-
exports.staticSlicing = staticSlicing;
|
|
116
|
-
function addAllFrom(current, collected) {
|
|
117
|
-
for (const id of (0, r_bridge_1.collectAllIds)(current)) {
|
|
118
|
-
collected.add(id);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function addControlDependencies(source, ast) {
|
|
122
|
-
const start = ast.get(source);
|
|
123
|
-
const collected = new Set();
|
|
124
|
-
let current = start;
|
|
125
|
-
while (current !== undefined) {
|
|
126
|
-
if (current.type === "RIfThenElse" /* RType.IfThenElse */) {
|
|
127
|
-
addAllFrom(current.condition, collected);
|
|
128
|
-
}
|
|
129
|
-
else if (current.type === "RWhileLoop" /* RType.WhileLoop */) {
|
|
130
|
-
addAllFrom(current.condition, collected);
|
|
131
|
-
}
|
|
132
|
-
else if (current.type === "RForLoop" /* RType.ForLoop */) {
|
|
133
|
-
addAllFrom(current.variable, collected);
|
|
134
|
-
// vector not needed, if required, it is linked by defined-by
|
|
135
|
-
}
|
|
136
|
-
// nothing to do for repeat and rest!
|
|
137
|
-
current = current.info.parent ? ast.get(current.info.parent) : undefined;
|
|
138
|
-
}
|
|
139
|
-
return collected;
|
|
140
|
-
}
|
|
141
|
-
function retrieveActiveEnvironment(callerInfo, baseEnvironment) {
|
|
142
|
-
let callerEnvironment = callerInfo.environment;
|
|
143
|
-
if (baseEnvironment.level !== callerEnvironment.level) {
|
|
144
|
-
while (baseEnvironment.level < callerEnvironment.level) {
|
|
145
|
-
baseEnvironment = (0, environments_1.pushLocalEnvironment)(baseEnvironment);
|
|
146
|
-
}
|
|
147
|
-
while (baseEnvironment.level > callerEnvironment.level) {
|
|
148
|
-
callerEnvironment = (0, environments_1.pushLocalEnvironment)(callerEnvironment);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return (0, environments_1.overwriteEnvironments)(baseEnvironment, callerEnvironment);
|
|
152
|
-
}
|
|
153
|
-
//// returns the new threshold hit count
|
|
154
|
-
function sliceForCall(current, idMap, callerInfo, dataflowGraph, queue) {
|
|
155
|
-
// bind with call-local environments during slicing
|
|
156
|
-
const outgoingEdges = dataflowGraph.get(callerInfo.id, true);
|
|
157
|
-
(0, assert_1.guard)(outgoingEdges !== undefined, () => `outgoing edges of id: ${callerInfo.id} must be in graph but can not be found, keep in slice to be sure`);
|
|
158
|
-
// lift baseEnv on the same level
|
|
159
|
-
const baseEnvironment = current.baseEnvironment;
|
|
160
|
-
const baseEnvPrint = envFingerprint(baseEnvironment);
|
|
161
|
-
const activeEnvironment = retrieveActiveEnvironment(callerInfo, baseEnvironment);
|
|
162
|
-
const activeEnvironmentFingerprint = envFingerprint(activeEnvironment);
|
|
163
|
-
const functionCallDefs = (0, environments_1.resolveByName)(callerInfo.name, scopes_1.LocalScope, activeEnvironment)?.map(d => d.nodeId) ?? [];
|
|
164
|
-
for (const [target, outgoingEdge] of outgoingEdges[1].entries()) {
|
|
165
|
-
if (outgoingEdge.types.has(dataflow_1.EdgeType.Calls)) {
|
|
166
|
-
functionCallDefs.push(target);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const functionCallTargets = (0, linker_1.getAllLinkedFunctionDefinitions)(new Set(functionCallDefs), dataflowGraph);
|
|
170
|
-
for (const [_, functionCallTarget] of functionCallTargets) {
|
|
171
|
-
// all those linked within the scopes of other functions are already linked when exiting a function definition
|
|
172
|
-
for (const openIn of functionCallTarget.subflow.in) {
|
|
173
|
-
const defs = (0, environments_1.resolveByName)(openIn.name, scopes_1.LocalScope, activeEnvironment);
|
|
174
|
-
if (defs === undefined) {
|
|
65
|
+
for (const [target, { types }] of currentEdges) {
|
|
66
|
+
if (target === built_in_1.BuiltIn || (0, edge_1.edgeIncludesType)(types, 256 /* EdgeType.NonStandardEvaluation */)) {
|
|
175
67
|
continue;
|
|
176
68
|
}
|
|
177
|
-
|
|
178
|
-
|
|
69
|
+
const t = (0, edge_1.shouldTraverseEdge)(types);
|
|
70
|
+
if (t === 3 /* TraverseEdge.Always */) {
|
|
71
|
+
queue.add(target, baseEnvironment, baseEnvFingerprint, false);
|
|
72
|
+
}
|
|
73
|
+
else if (t === 2 /* TraverseEdge.DefinedByOnCall */ && queue.potentialArguments.has(target)) {
|
|
74
|
+
queue.add(target, baseEnvironment, baseEnvFingerprint, false);
|
|
75
|
+
queue.potentialArguments.delete(target);
|
|
76
|
+
}
|
|
77
|
+
else if (t === 1 /* TraverseEdge.SideEffect */) {
|
|
78
|
+
queue.add(target, baseEnvironment, baseEnvFingerprint, true);
|
|
179
79
|
}
|
|
180
|
-
}
|
|
181
|
-
for (const exitPoint of functionCallTarget.exitPoints) {
|
|
182
|
-
queue.add(exitPoint, activeEnvironment, activeEnvironmentFingerprint, current.onlyForSideEffects);
|
|
183
80
|
}
|
|
184
81
|
}
|
|
82
|
+
return { ...queue.status(), decodedCriteria };
|
|
185
83
|
}
|
|
84
|
+
exports.staticSlicing = staticSlicing;
|
|
186
85
|
//# sourceMappingURL=static-slicer.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NodeToSlice, SliceResult } from './slicer-types';
|
|
2
|
+
import type { REnvironmentInformation } from '../../dataflow/environments/environment';
|
|
3
|
+
import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
|
|
4
|
+
export declare class VisitingQueue {
|
|
5
|
+
private readonly threshold;
|
|
6
|
+
private timesHitThreshold;
|
|
7
|
+
private seen;
|
|
8
|
+
private idThreshold;
|
|
9
|
+
private queue;
|
|
10
|
+
potentialArguments: Set<NodeId>;
|
|
11
|
+
constructor(threshold: number);
|
|
12
|
+
/**
|
|
13
|
+
* Adds a node to the queue if it has not been seen before.
|
|
14
|
+
* @param target - the node to add
|
|
15
|
+
* @param env - the environment the node is traversed in
|
|
16
|
+
* @param envFingerprint - the fingerprint of the environment
|
|
17
|
+
* @param onlyForSideEffects - whether the node is only used for its side effects
|
|
18
|
+
*/
|
|
19
|
+
add(target: NodeId, env: REnvironmentInformation, envFingerprint: string, onlyForSideEffects: boolean): void;
|
|
20
|
+
next(): NodeToSlice;
|
|
21
|
+
nonEmpty(): boolean;
|
|
22
|
+
status(): Readonly<Pick<SliceResult, 'timesHitThreshold' | 'result'>>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VisitingQueue = void 0;
|
|
4
|
+
const fingerprint_1 = require("./fingerprint");
|
|
5
|
+
const static_slicer_1 = require("./static-slicer");
|
|
6
|
+
class VisitingQueue {
|
|
7
|
+
threshold;
|
|
8
|
+
timesHitThreshold = 0;
|
|
9
|
+
seen = new Map();
|
|
10
|
+
idThreshold = new Map();
|
|
11
|
+
queue = [];
|
|
12
|
+
// the set of potential arguments holds arguments which may be added if found with the `defined-by-on-call` edge
|
|
13
|
+
potentialArguments = new Set();
|
|
14
|
+
constructor(threshold) {
|
|
15
|
+
this.threshold = threshold;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Adds a node to the queue if it has not been seen before.
|
|
19
|
+
* @param target - the node to add
|
|
20
|
+
* @param env - the environment the node is traversed in
|
|
21
|
+
* @param envFingerprint - the fingerprint of the environment
|
|
22
|
+
* @param onlyForSideEffects - whether the node is only used for its side effects
|
|
23
|
+
*/
|
|
24
|
+
add(target, env, envFingerprint, onlyForSideEffects) {
|
|
25
|
+
const idCounter = this.idThreshold.get(target) ?? 0;
|
|
26
|
+
if (idCounter > this.threshold) {
|
|
27
|
+
static_slicer_1.slicerLogger.warn(`id: ${target} has been visited ${idCounter} times, skipping`);
|
|
28
|
+
this.timesHitThreshold++;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
/* we do not include the in call part in the fingerprint as it is 'deterministic' from the source position */
|
|
32
|
+
const print = (0, fingerprint_1.fingerprint)(target, envFingerprint, onlyForSideEffects);
|
|
33
|
+
if (!this.seen.has(print)) {
|
|
34
|
+
this.idThreshold.set(target, idCounter + 1);
|
|
35
|
+
this.seen.set(print, target);
|
|
36
|
+
this.queue.push({ id: target, baseEnvironment: env, onlyForSideEffects });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
next() {
|
|
40
|
+
return this.queue.pop();
|
|
41
|
+
}
|
|
42
|
+
nonEmpty() {
|
|
43
|
+
return this.queue.length > 0;
|
|
44
|
+
}
|
|
45
|
+
status() {
|
|
46
|
+
return {
|
|
47
|
+
timesHitThreshold: this.timesHitThreshold,
|
|
48
|
+
result: new Set(this.seen.values())
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.VisitingQueue = VisitingQueue;
|
|
53
|
+
//# sourceMappingURL=visiting-queue.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SummarizedMeasurement } from '../../util/summarizer';
|
|
2
|
+
import { RFalse, RTrue } from '../../r-bridge/lang-4.x/convert-values';
|
|
3
|
+
import type { RArgument } from '../../r-bridge/lang-4.x/ast/model/nodes/r-argument';
|
|
4
|
+
import type { RNode } from '../../r-bridge/lang-4.x/ast/model/model';
|
|
5
|
+
export interface CommonSyntaxTypeCounts<Measurement = bigint> {
|
|
6
|
+
total: Measurement;
|
|
7
|
+
multiple: Measurement;
|
|
8
|
+
empty: Measurement;
|
|
9
|
+
withArgument: Measurement;
|
|
10
|
+
noValue: Measurement;
|
|
11
|
+
singleVar: Record<string, Measurement>;
|
|
12
|
+
number: Record<number, Measurement>;
|
|
13
|
+
integer: Record<number, Measurement>;
|
|
14
|
+
complex: Record<number, Measurement>;
|
|
15
|
+
string: Record<string, Measurement>;
|
|
16
|
+
logical: Record<typeof RTrue | typeof RFalse, Measurement>;
|
|
17
|
+
call: Record<string, Measurement>;
|
|
18
|
+
unnamedCall: Measurement;
|
|
19
|
+
binOp: Record<string, Measurement>;
|
|
20
|
+
unaryOp: Record<string, Measurement>;
|
|
21
|
+
other: Record<string, Measurement>;
|
|
22
|
+
}
|
|
23
|
+
export declare function emptyCommonSyntaxTypeCounts<T = bigint>(init?: () => T): CommonSyntaxTypeCounts<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Updates the given counts based on the type of the given node.
|
|
26
|
+
*/
|
|
27
|
+
export declare function updateCommonSyntaxTypeCounts(current: CommonSyntaxTypeCounts, ...nodes: (RNode | RArgument)[]): CommonSyntaxTypeCounts;
|
|
28
|
+
export declare function appendCommonSyntaxTypeCounter(a: CommonSyntaxTypeCounts<number[][]>, b: CommonSyntaxTypeCounts): void;
|
|
29
|
+
export declare function summarizeCommonSyntaxTypeCounter(a: CommonSyntaxTypeCounts<number[][]>): CommonSyntaxTypeCounts<SummarizedMeasurement>;
|