@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.
Files changed (570) hide show
  1. package/abstract-interpretation/handler/binop/binop.d.ts +3 -4
  2. package/abstract-interpretation/handler/binop/binop.js +4 -2
  3. package/abstract-interpretation/handler/binop/operators.d.ts +2 -2
  4. package/abstract-interpretation/handler/binop/operators.js +14 -28
  5. package/abstract-interpretation/processor.d.ts +3 -2
  6. package/abstract-interpretation/processor.js +2 -2
  7. package/benchmark/slicer.d.ts +101 -0
  8. package/benchmark/slicer.js +214 -0
  9. package/benchmark/stats/print.d.ts +7 -0
  10. package/benchmark/stats/print.js +151 -0
  11. package/benchmark/stats/stats.d.ts +42 -0
  12. package/benchmark/stats/stats.js +6 -0
  13. package/benchmark/stopwatch.d.ts +35 -0
  14. package/benchmark/stopwatch.js +79 -0
  15. package/benchmark/summarizer/data.d.ts +54 -0
  16. package/benchmark/summarizer/first-phase/input.d.ts +3 -0
  17. package/benchmark/summarizer/first-phase/input.js +76 -0
  18. package/benchmark/summarizer/first-phase/process.d.ts +11 -0
  19. package/benchmark/summarizer/first-phase/process.js +205 -0
  20. package/benchmark/summarizer/second-phase/graph.d.ts +2 -0
  21. package/benchmark/summarizer/second-phase/graph.js +54 -0
  22. package/benchmark/summarizer/second-phase/process.d.ts +6 -0
  23. package/benchmark/summarizer/second-phase/process.js +127 -0
  24. package/benchmark/summarizer/summarizer.d.ts +31 -0
  25. package/benchmark/summarizer/summarizer.js +58 -0
  26. package/cli/benchmark-app.d.ts +10 -0
  27. package/cli/benchmark-app.js +67 -0
  28. package/cli/benchmark-helper-app.d.ts +9 -0
  29. package/cli/benchmark-helper-app.js +69 -0
  30. package/cli/common/features.d.ts +3 -0
  31. package/cli/common/features.js +30 -0
  32. package/cli/common/options.d.ts +20 -0
  33. package/cli/common/options.js +85 -0
  34. package/cli/common/script.d.ts +21 -0
  35. package/cli/common/script.js +61 -0
  36. package/cli/common/scripts-info.d.ts +25 -0
  37. package/cli/common/scripts-info.js +83 -0
  38. package/cli/export-quads-app.d.ts +7 -0
  39. package/cli/export-quads-app.js +43 -0
  40. package/cli/flowr.d.ts +29 -0
  41. package/cli/flowr.js +141 -0
  42. package/cli/repl/commands/cfg.d.ts +3 -0
  43. package/cli/repl/commands/cfg.js +37 -0
  44. package/cli/repl/commands/commands.d.ts +13 -0
  45. package/cli/repl/commands/commands.js +142 -0
  46. package/cli/repl/commands/dataflow.d.ts +3 -0
  47. package/cli/repl/commands/dataflow.js +34 -0
  48. package/cli/repl/commands/execute.d.ts +4 -0
  49. package/cli/repl/commands/execute.js +27 -0
  50. package/cli/repl/commands/main.d.ts +39 -0
  51. package/cli/repl/commands/main.js +14 -0
  52. package/cli/repl/commands/normalize.d.ts +3 -0
  53. package/cli/repl/commands/normalize.js +34 -0
  54. package/cli/repl/commands/parse.d.ts +2 -0
  55. package/cli/repl/commands/parse.js +110 -0
  56. package/cli/repl/commands/quit.d.ts +2 -0
  57. package/cli/repl/commands/quit.js +15 -0
  58. package/cli/repl/commands/version.d.ts +16 -0
  59. package/cli/repl/commands/version.js +28 -0
  60. package/cli/repl/core.d.ts +36 -0
  61. package/cli/repl/core.js +174 -0
  62. package/cli/repl/execute.d.ts +28 -0
  63. package/cli/repl/execute.js +79 -0
  64. package/cli/repl/print-version.d.ts +2 -0
  65. package/cli/repl/print-version.js +10 -0
  66. package/cli/repl/prompt.d.ts +2 -0
  67. package/cli/repl/prompt.js +9 -0
  68. package/cli/repl/server/connection.d.ts +21 -0
  69. package/cli/repl/server/connection.js +218 -0
  70. package/cli/repl/server/messages/analysis.d.ts +72 -0
  71. package/cli/repl/server/messages/analysis.js +21 -0
  72. package/cli/repl/server/messages/error.d.ts +11 -0
  73. package/{core/input.js → cli/repl/server/messages/error.js} +1 -1
  74. package/cli/repl/server/messages/hello.d.ts +20 -0
  75. package/{core/output.js → cli/repl/server/messages/hello.js} +1 -1
  76. package/cli/repl/server/messages/messages.d.ts +35 -0
  77. package/cli/repl/server/messages/messages.js +40 -0
  78. package/cli/repl/server/messages/repl.d.ts +33 -0
  79. package/cli/repl/server/messages/repl.js +37 -0
  80. package/cli/repl/server/messages/slice.d.ts +26 -0
  81. package/cli/repl/server/messages/slice.js +37 -0
  82. package/cli/repl/server/net.d.ts +49 -0
  83. package/cli/repl/server/net.js +63 -0
  84. package/cli/repl/server/send.d.ts +4 -0
  85. package/cli/repl/server/send.js +18 -0
  86. package/cli/repl/server/server.d.ts +20 -0
  87. package/cli/repl/server/server.js +66 -0
  88. package/cli/repl/server/validate.d.ts +15 -0
  89. package/cli/repl/server/validate.js +34 -0
  90. package/cli/slicer-app.d.ts +11 -0
  91. package/cli/slicer-app.js +83 -0
  92. package/cli/statistics-app.d.ts +11 -0
  93. package/cli/statistics-app.js +99 -0
  94. package/cli/statistics-helper-app.d.ts +11 -0
  95. package/cli/statistics-helper-app.js +87 -0
  96. package/cli/summarizer-app.d.ts +18 -0
  97. package/cli/summarizer-app.js +66 -0
  98. package/core/pipeline-executor.d.ts +154 -0
  99. package/core/pipeline-executor.js +221 -0
  100. package/core/print/dataflow-printer.d.ts +3 -4
  101. package/core/print/dataflow-printer.js +5 -5
  102. package/core/print/normalize-printer.d.ts +1 -1
  103. package/core/print/normalize-printer.js +3 -3
  104. package/core/print/parse-printer.js +3 -3
  105. package/core/print/print.d.ts +13 -4
  106. package/core/print/print.js +13 -2
  107. package/core/print/slice-diff-ansi.d.ts +3 -2
  108. package/core/print/slice-diff-ansi.js +4 -4
  109. package/core/steps/all/core/00-parse.d.ts +28 -0
  110. package/core/steps/all/core/00-parse.js +24 -0
  111. package/core/steps/all/core/10-normalize.d.ts +29 -0
  112. package/core/steps/all/core/10-normalize.js +26 -0
  113. package/core/steps/all/core/20-dataflow.d.ts +27 -0
  114. package/core/steps/all/core/20-dataflow.js +29 -0
  115. package/core/steps/all/static-slicing/00-slice.d.ts +28 -0
  116. package/core/steps/all/static-slicing/00-slice.js +21 -0
  117. package/core/steps/all/static-slicing/10-reconstruct.d.ts +25 -0
  118. package/core/steps/all/static-slicing/10-reconstruct.js +21 -0
  119. package/core/steps/pipeline/create-pipeline.d.ts +6 -0
  120. package/core/steps/pipeline/create-pipeline.js +130 -0
  121. package/core/steps/pipeline/default-pipelines.d.ts +251 -0
  122. package/core/steps/pipeline/default-pipelines.js +18 -0
  123. package/core/steps/pipeline/invalid-pipeline-error.d.ts +6 -0
  124. package/core/steps/pipeline/invalid-pipeline-error.js +14 -0
  125. package/core/steps/pipeline/pipeline.d.ts +60 -0
  126. package/core/steps/pipeline/pipeline.js +28 -0
  127. package/core/steps/pipeline-step.d.ts +85 -0
  128. package/core/steps/pipeline-step.js +8 -0
  129. package/dataflow/environments/append.d.ts +4 -4
  130. package/dataflow/environments/append.js +4 -4
  131. package/dataflow/environments/built-in.d.ts +25 -0
  132. package/dataflow/environments/built-in.js +123 -0
  133. package/dataflow/environments/clone.d.ts +2 -0
  134. package/dataflow/environments/clone.js +23 -0
  135. package/dataflow/environments/{register.d.ts → define.d.ts} +3 -3
  136. package/dataflow/environments/define.js +51 -0
  137. package/dataflow/environments/diff.d.ts +6 -0
  138. package/dataflow/environments/diff.js +85 -0
  139. package/dataflow/environments/environment.d.ts +10 -43
  140. package/dataflow/environments/environment.js +32 -138
  141. package/dataflow/environments/identifier.d.ts +31 -0
  142. package/dataflow/environments/identifier.js +3 -0
  143. package/dataflow/environments/overwrite.d.ts +4 -4
  144. package/dataflow/environments/overwrite.js +9 -22
  145. package/dataflow/environments/resolve-by-name.d.ts +7 -6
  146. package/dataflow/environments/resolve-by-name.js +35 -19
  147. package/dataflow/environments/scoping.js +1 -4
  148. package/dataflow/extractor.d.ts +6 -6
  149. package/dataflow/extractor.js +47 -57
  150. package/dataflow/graph/diff.d.ts +24 -7
  151. package/dataflow/graph/diff.js +114 -74
  152. package/dataflow/graph/edge.d.ts +66 -20
  153. package/dataflow/graph/edge.js +73 -27
  154. package/dataflow/graph/graph.d.ts +53 -29
  155. package/dataflow/graph/graph.js +84 -89
  156. package/dataflow/graph/quads.js +2 -2
  157. package/dataflow/graph/vertex.d.ts +37 -34
  158. package/dataflow/info.d.ts +49 -0
  159. package/dataflow/info.js +29 -0
  160. package/dataflow/internal/linker.d.ts +11 -10
  161. package/dataflow/internal/linker.js +64 -90
  162. package/dataflow/internal/process/functions/call/argument/make-argument.d.ts +6 -0
  163. package/dataflow/internal/process/functions/call/argument/make-argument.js +31 -0
  164. package/dataflow/internal/process/functions/call/argument/unpack-argument.d.ts +3 -0
  165. package/dataflow/internal/process/functions/call/argument/unpack-argument.js +18 -0
  166. package/dataflow/internal/process/functions/call/built-in/built-in-access.d.ts +9 -0
  167. package/dataflow/internal/process/functions/call/built-in/built-in-access.js +82 -0
  168. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.d.ts +29 -0
  169. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +167 -0
  170. package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.d.ts +11 -0
  171. package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +165 -0
  172. package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.d.ts +7 -0
  173. package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +97 -0
  174. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.d.ts +7 -0
  175. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +165 -0
  176. package/dataflow/internal/process/functions/call/built-in/built-in-get.d.ts +7 -0
  177. package/dataflow/internal/process/functions/call/built-in/built-in-get.js +36 -0
  178. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.d.ts +7 -0
  179. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +100 -0
  180. package/dataflow/internal/process/functions/call/built-in/built-in-library.d.ts +7 -0
  181. package/dataflow/internal/process/functions/call/built-in/built-in-library.js +32 -0
  182. package/dataflow/internal/process/functions/call/built-in/built-in-logical-bin-op.d.ts +9 -0
  183. package/dataflow/internal/process/functions/call/built-in/built-in-logical-bin-op.js +35 -0
  184. package/dataflow/internal/process/functions/call/built-in/built-in-pipe.d.ts +7 -0
  185. package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +35 -0
  186. package/dataflow/internal/process/functions/call/built-in/built-in-quote.d.ts +9 -0
  187. package/dataflow/internal/process/functions/call/built-in/built-in-quote.js +29 -0
  188. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.d.ts +7 -0
  189. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +32 -0
  190. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.d.ts +12 -0
  191. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +45 -0
  192. package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +11 -0
  193. package/dataflow/internal/process/functions/call/built-in/built-in-source.js +72 -0
  194. package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.d.ts +7 -0
  195. package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +61 -0
  196. package/dataflow/internal/process/functions/call/common.d.ts +35 -0
  197. package/dataflow/internal/process/functions/call/common.js +70 -0
  198. package/dataflow/internal/process/functions/call/default-call-handling.d.ts +5 -0
  199. package/dataflow/internal/process/functions/call/default-call-handling.js +15 -0
  200. package/dataflow/internal/process/functions/call/known-call-handling.d.ts +26 -0
  201. package/dataflow/internal/process/functions/call/known-call-handling.js +62 -0
  202. package/dataflow/internal/process/functions/call/named-call-handling.d.ts +7 -0
  203. package/dataflow/internal/process/functions/call/named-call-handling.js +53 -0
  204. package/dataflow/internal/process/functions/call/unnamed-call-handling.d.ts +6 -0
  205. package/dataflow/internal/process/functions/call/unnamed-call-handling.js +58 -0
  206. package/dataflow/internal/process/functions/process-argument.d.ts +9 -0
  207. package/dataflow/internal/process/functions/{argument.js → process-argument.js} +25 -20
  208. package/dataflow/internal/process/functions/{parameter.d.ts → process-parameter.d.ts} +3 -2
  209. package/dataflow/internal/process/functions/{parameter.js → process-parameter.js} +10 -13
  210. package/dataflow/internal/process/process-named-call.d.ts +6 -0
  211. package/dataflow/internal/process/process-named-call.js +17 -0
  212. package/dataflow/internal/process/process-symbol.d.ts +5 -0
  213. package/dataflow/internal/process/process-symbol.js +26 -0
  214. package/dataflow/internal/process/process-uninteresting-leaf.d.ts +4 -0
  215. package/dataflow/internal/process/process-uninteresting-leaf.js +9 -0
  216. package/dataflow/internal/process/process-value.d.ts +4 -0
  217. package/dataflow/internal/process/process-value.js +22 -0
  218. package/dataflow/logger.d.ts +1 -0
  219. package/dataflow/logger.js +6 -0
  220. package/dataflow/processor.d.ts +18 -13
  221. package/dataflow/processor.js +1 -1
  222. package/package.json +48 -85
  223. package/r-bridge/data/data.d.ts +603 -0
  224. package/r-bridge/data/data.js +753 -0
  225. package/r-bridge/data/get.d.ts +19 -0
  226. package/r-bridge/data/get.js +51 -0
  227. package/r-bridge/data/print.d.ts +1 -0
  228. package/r-bridge/data/print.js +58 -0
  229. package/r-bridge/data/types.d.ts +33 -0
  230. package/r-bridge/data/types.js +3 -0
  231. package/r-bridge/init.d.ts +3 -0
  232. package/r-bridge/init.js +22 -0
  233. package/r-bridge/lang-4.x/ast/model/collect.d.ts +2 -1
  234. package/r-bridge/lang-4.x/ast/model/collect.js +2 -2
  235. package/r-bridge/lang-4.x/ast/model/model.d.ts +26 -5
  236. package/r-bridge/lang-4.x/ast/model/nodes/r-access.d.ts +4 -3
  237. package/r-bridge/lang-4.x/ast/model/nodes/r-argument.d.ts +4 -0
  238. package/r-bridge/lang-4.x/ast/model/nodes/r-binary-op.d.ts +0 -17
  239. package/r-bridge/lang-4.x/ast/model/nodes/r-expression-list.d.ts +3 -1
  240. package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.d.ts +6 -4
  241. package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.js +2 -0
  242. package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.d.ts +2 -3
  243. package/r-bridge/lang-4.x/ast/model/nodes/r-number.d.ts +1 -1
  244. package/r-bridge/lang-4.x/ast/model/nodes/r-string.d.ts +1 -1
  245. package/r-bridge/lang-4.x/ast/model/nodes/r-symbol.js +2 -2
  246. package/r-bridge/lang-4.x/ast/model/nodes/r-unary-op.d.ts +0 -11
  247. package/r-bridge/lang-4.x/ast/model/operators.d.ts +6 -18
  248. package/r-bridge/lang-4.x/ast/model/operators.js +36 -48
  249. package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +19 -15
  250. package/r-bridge/lang-4.x/ast/model/processing/decorate.js +59 -54
  251. package/r-bridge/lang-4.x/ast/model/processing/node-id.d.ts +8 -0
  252. package/r-bridge/lang-4.x/ast/model/processing/node-id.js +18 -0
  253. package/r-bridge/lang-4.x/ast/model/processing/role.d.ts +2 -2
  254. package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.d.ts +28 -17
  255. package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.js +7 -34
  256. package/r-bridge/lang-4.x/ast/model/processing/visitor.js +5 -2
  257. package/r-bridge/lang-4.x/ast/model/type.js +13 -6
  258. package/r-bridge/lang-4.x/ast/parser/json/format.d.ts +4 -1
  259. package/r-bridge/lang-4.x/ast/parser/json/format.js +9 -2
  260. package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +5 -5
  261. package/r-bridge/lang-4.x/ast/parser/json/parser.js +22 -27
  262. package/r-bridge/lang-4.x/ast/parser/xml/input-format.d.ts +10 -7
  263. package/r-bridge/lang-4.x/ast/parser/xml/input-format.js +19 -11
  264. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then-else.d.ts → normalize-if-then-else.d.ts} +3 -3
  265. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then-else.js → normalize-if-then-else.js} +10 -13
  266. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then.d.ts → normalize-if-then.d.ts} +3 -3
  267. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/{if-then.js → normalize-if-then.js} +9 -12
  268. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/normalize-expression.d.ts +10 -0
  269. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/normalize-expression.js +64 -0
  270. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{argument.d.ts → normalize-argument.d.ts} +4 -4
  271. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{argument.js → normalize-argument.js} +13 -17
  272. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{call.d.ts → normalize-call.d.ts} +6 -4
  273. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{call.js → normalize-call.js} +24 -29
  274. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/normalize-definition.d.ts +12 -0
  275. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{definition.js → normalize-definition.js} +14 -19
  276. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{parameter.d.ts → normalize-parameter.d.ts} +4 -4
  277. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/{parameter.js → normalize-parameter.js} +12 -16
  278. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-break.d.ts +4 -0
  279. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{break.js → normalize-break.js} +6 -8
  280. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-for.d.ts +4 -0
  281. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{for.js → normalize-for.js} +18 -20
  282. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-next.d.ts +4 -0
  283. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{next.js → normalize-next.js} +6 -8
  284. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-repeat.d.ts +13 -0
  285. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{repeat.js → normalize-repeat.js} +13 -16
  286. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/normalize-while.d.ts +4 -0
  287. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/{while.js → normalize-while.js} +10 -12
  288. package/r-bridge/lang-4.x/ast/parser/xml/internal/{access.d.ts → normalize-access.d.ts} +4 -4
  289. package/r-bridge/lang-4.x/ast/parser/xml/internal/{access.js → normalize-access.js} +44 -45
  290. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/{binary.d.ts → normalize-binary.d.ts} +3 -3
  291. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/{binary.js → normalize-binary.js} +23 -73
  292. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/normalize-unary.d.ts +13 -0
  293. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/normalize-unary.js +47 -0
  294. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/normalize-comment.d.ts +11 -0
  295. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/{comment.js → normalize-comment.js} +5 -10
  296. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/normalize-line-directive.d.ts +13 -0
  297. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/{line-directive.js → normalize-line-directive.js} +7 -12
  298. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-delimiter.d.ts +3 -0
  299. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-delimiter.js +15 -0
  300. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-expressions.d.ts +10 -0
  301. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-expressions.js +182 -0
  302. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-root.d.ts +4 -0
  303. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-root.js +34 -0
  304. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-single-node.d.ts +13 -0
  305. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/normalize-single-node.js +59 -0
  306. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/normalize-number.d.ts +16 -0
  307. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{number.js → normalize-number.js} +12 -18
  308. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/normalize-string.d.ts +11 -0
  309. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{string.js → normalize-string.js} +7 -12
  310. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{symbol.d.ts → normalize-symbol.d.ts} +4 -4
  311. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/{symbol.js → normalize-symbol.js} +12 -15
  312. package/r-bridge/lang-4.x/ast/parser/xml/{internal/meta.d.ts → normalize-meta.d.ts} +5 -3
  313. package/r-bridge/lang-4.x/ast/parser/xml/{internal/meta.js → normalize-meta.js} +8 -8
  314. package/r-bridge/lang-4.x/ast/parser/xml/{data.d.ts → normalizer-data.d.ts} +1 -5
  315. package/r-bridge/lang-4.x/ast/parser/xml/normalizer-data.js +3 -0
  316. package/r-bridge/lang-4.x/{values.d.ts → convert-values.d.ts} +2 -2
  317. package/r-bridge/lang-4.x/{values.js → convert-values.js} +5 -5
  318. package/r-bridge/retriever.d.ts +5 -5
  319. package/r-bridge/retriever.js +11 -24
  320. package/r-bridge/shell-executor.d.ts +0 -1
  321. package/r-bridge/shell-executor.js +7 -12
  322. package/r-bridge/shell.d.ts +14 -12
  323. package/r-bridge/shell.js +50 -45
  324. package/reconstruct/reconstruct.d.ts +4 -2
  325. package/reconstruct/reconstruct.js +193 -185
  326. package/slicing/criterion/collect-all.d.ts +4 -3
  327. package/slicing/criterion/collect-all.js +5 -1
  328. package/slicing/criterion/filters/all-variables.js +14 -22
  329. package/slicing/criterion/parse.d.ts +4 -2
  330. package/slicing/criterion/parse.js +13 -11
  331. package/slicing/static/fingerprint.d.ts +5 -0
  332. package/slicing/static/fingerprint.js +17 -0
  333. package/slicing/static/slice-call.d.ts +10 -0
  334. package/slicing/static/slice-call.js +86 -0
  335. package/slicing/static/slicer-types.d.ts +33 -0
  336. package/slicing/static/slicer-types.js +3 -0
  337. package/slicing/static/static-slicer.d.ts +6 -24
  338. package/slicing/static/static-slicer.js +54 -155
  339. package/slicing/static/visiting-queue.d.ts +23 -0
  340. package/slicing/static/visiting-queue.js +53 -0
  341. package/statistics/features/common-syntax-probability.d.ts +29 -0
  342. package/statistics/features/common-syntax-probability.js +159 -0
  343. package/statistics/features/feature.d.ts +182 -0
  344. package/statistics/features/feature.js +39 -0
  345. package/statistics/features/post-processing.d.ts +12 -0
  346. package/statistics/features/post-processing.js +21 -0
  347. package/statistics/features/supported/assignments/assignments.d.ts +12 -0
  348. package/statistics/features/supported/assignments/assignments.js +55 -0
  349. package/statistics/features/supported/assignments/post-process.d.ts +3 -0
  350. package/statistics/features/supported/assignments/post-process.js +124 -0
  351. package/statistics/features/supported/comments/comments.d.ts +18 -0
  352. package/statistics/features/supported/comments/comments.js +133 -0
  353. package/statistics/features/supported/comments/post-process.d.ts +3 -0
  354. package/statistics/features/supported/comments/post-process.js +49 -0
  355. package/statistics/features/supported/control-flow/control-flow.d.ts +17 -0
  356. package/statistics/features/supported/control-flow/control-flow.js +68 -0
  357. package/statistics/features/supported/control-flow/post-process.d.ts +3 -0
  358. package/statistics/features/supported/control-flow/post-process.js +64 -0
  359. package/statistics/features/supported/data-access/data-access.d.ts +15 -0
  360. package/statistics/features/supported/data-access/data-access.js +120 -0
  361. package/statistics/features/supported/data-access/post-process.d.ts +3 -0
  362. package/statistics/features/supported/data-access/post-process.js +106 -0
  363. package/statistics/features/supported/defined-functions/defined-functions.d.ts +34 -0
  364. package/statistics/features/supported/defined-functions/defined-functions.js +142 -0
  365. package/statistics/features/supported/defined-functions/post-process.d.ts +6 -0
  366. package/statistics/features/supported/defined-functions/post-process.js +169 -0
  367. package/statistics/features/supported/expression-list/expression-list.d.ts +9 -0
  368. package/statistics/features/supported/expression-list/expression-list.js +36 -0
  369. package/statistics/features/supported/expression-list/post-process.d.ts +3 -0
  370. package/statistics/features/supported/expression-list/post-process.js +43 -0
  371. package/statistics/features/supported/loops/loops.d.ts +20 -0
  372. package/statistics/features/supported/loops/loops.js +79 -0
  373. package/statistics/features/supported/loops/post-process.d.ts +3 -0
  374. package/statistics/features/supported/loops/post-process.js +71 -0
  375. package/statistics/features/supported/used-functions/post-process.d.ts +6 -0
  376. package/statistics/features/supported/used-functions/post-process.js +178 -0
  377. package/statistics/features/supported/used-functions/used-functions.d.ts +24 -0
  378. package/statistics/features/supported/used-functions/used-functions.js +97 -0
  379. package/statistics/features/supported/used-packages/post-process.d.ts +3 -0
  380. package/statistics/features/supported/used-packages/post-process.js +120 -0
  381. package/statistics/features/supported/used-packages/used-packages.d.ts +16 -0
  382. package/statistics/features/supported/used-packages/used-packages.js +130 -0
  383. package/statistics/features/supported/values/post-process.d.ts +3 -0
  384. package/statistics/features/supported/values/post-process.js +71 -0
  385. package/statistics/features/supported/values/values.d.ts +14 -0
  386. package/statistics/features/supported/values/values.js +101 -0
  387. package/statistics/features/supported/variables/post-process.d.ts +9 -0
  388. package/statistics/features/supported/variables/post-process.js +121 -0
  389. package/statistics/features/supported/variables/variables.d.ts +15 -0
  390. package/statistics/features/supported/variables/variables.js +60 -0
  391. package/statistics/meta-statistics.d.ts +33 -0
  392. package/statistics/meta-statistics.js +17 -0
  393. package/statistics/output/file-provider.d.ts +37 -0
  394. package/statistics/output/file-provider.js +97 -0
  395. package/statistics/output/print-stats.d.ts +17 -0
  396. package/statistics/output/print-stats.js +69 -0
  397. package/statistics/output/statistics-file.d.ts +37 -0
  398. package/statistics/output/statistics-file.js +69 -0
  399. package/statistics/statistics.d.ts +28 -0
  400. package/statistics/statistics.js +108 -0
  401. package/statistics/summarizer/auto-detect.d.ts +2 -0
  402. package/statistics/summarizer/auto-detect.js +32 -0
  403. package/statistics/summarizer/first-phase/process.d.ts +6 -0
  404. package/statistics/summarizer/first-phase/process.js +81 -0
  405. package/statistics/summarizer/post-process/clusterer.d.ts +26 -0
  406. package/statistics/summarizer/post-process/clusterer.js +43 -0
  407. package/statistics/summarizer/post-process/file-based-count.d.ts +17 -0
  408. package/statistics/summarizer/post-process/file-based-count.js +49 -0
  409. package/statistics/summarizer/post-process/histogram.d.ts +59 -0
  410. package/statistics/summarizer/post-process/histogram.js +128 -0
  411. package/statistics/summarizer/post-process/post-process-output.d.ts +16 -0
  412. package/statistics/summarizer/post-process/post-process-output.js +105 -0
  413. package/statistics/summarizer/second-phase/process.d.ts +11 -0
  414. package/statistics/summarizer/second-phase/process.js +116 -0
  415. package/statistics/summarizer/summarizer.d.ts +35 -0
  416. package/statistics/summarizer/summarizer.js +135 -0
  417. package/util/ansi.d.ts +2 -2
  418. package/util/ansi.js +2 -2
  419. package/util/arrays.d.ts +11 -1
  420. package/util/arrays.js +34 -1
  421. package/util/assert.d.ts +1 -0
  422. package/util/assert.js +5 -1
  423. package/util/cfg/cfg.d.ts +3 -2
  424. package/util/cfg/cfg.js +17 -28
  425. package/util/cfg/visitor.d.ts +1 -1
  426. package/util/defaultmap.d.ts +1 -1
  427. package/util/defaultmap.js +1 -1
  428. package/util/diff.d.ts +4 -4
  429. package/util/files.d.ts +2 -2
  430. package/util/files.js +1 -1
  431. package/util/log.d.ts +1 -0
  432. package/util/log.js +7 -1
  433. package/util/logic.d.ts +1 -0
  434. package/util/logic.js +3 -0
  435. package/util/mermaid/ast.d.ts +1 -1
  436. package/util/mermaid/ast.js +2 -2
  437. package/util/mermaid/cfg.d.ts +1 -1
  438. package/util/mermaid/dfg.d.ts +34 -8
  439. package/util/mermaid/dfg.js +99 -70
  440. package/util/mermaid/mermaid.d.ts +1 -1
  441. package/util/mermaid/mermaid.js +6 -7
  442. package/util/objects.js +4 -0
  443. package/util/quads.d.ts +3 -3
  444. package/util/quads.js +0 -1
  445. package/util/range.d.ts +27 -14
  446. package/util/range.js +31 -27
  447. package/util/version.js +1 -1
  448. package/core/index.d.ts +0 -4
  449. package/core/index.js +0 -23
  450. package/core/input.d.ts +0 -42
  451. package/core/output.d.ts +0 -15
  452. package/core/slicer.d.ts +0 -124
  453. package/core/slicer.js +0 -227
  454. package/core/steps.d.ts +0 -508
  455. package/core/steps.js +0 -100
  456. package/dataflow/environments/index.d.ts +0 -7
  457. package/dataflow/environments/index.js +0 -23
  458. package/dataflow/environments/register.js +0 -40
  459. package/dataflow/environments/scopes.d.ts +0 -6
  460. package/dataflow/environments/scopes.js +0 -6
  461. package/dataflow/graph/index.d.ts +0 -4
  462. package/dataflow/graph/index.js +0 -21
  463. package/dataflow/index.d.ts +0 -5
  464. package/dataflow/index.js +0 -24
  465. package/dataflow/internal/info.d.ts +0 -21
  466. package/dataflow/internal/info.js +0 -16
  467. package/dataflow/internal/process/access.d.ts +0 -4
  468. package/dataflow/internal/process/access.js +0 -53
  469. package/dataflow/internal/process/expression-list.d.ts +0 -8
  470. package/dataflow/internal/process/expression-list.js +0 -144
  471. package/dataflow/internal/process/functions/argument.d.ts +0 -8
  472. package/dataflow/internal/process/functions/exit-points.d.ts +0 -2
  473. package/dataflow/internal/process/functions/exit-points.js +0 -121
  474. package/dataflow/internal/process/functions/function-call.d.ts +0 -5
  475. package/dataflow/internal/process/functions/function-call.js +0 -105
  476. package/dataflow/internal/process/functions/function-definition.d.ts +0 -4
  477. package/dataflow/internal/process/functions/function-definition.js +0 -176
  478. package/dataflow/internal/process/functions/source.d.ts +0 -8
  479. package/dataflow/internal/process/functions/source.js +0 -81
  480. package/dataflow/internal/process/if-then-else.d.ts +0 -4
  481. package/dataflow/internal/process/if-then-else.js +0 -56
  482. package/dataflow/internal/process/loops/for-loop.d.ts +0 -4
  483. package/dataflow/internal/process/loops/for-loop.js +0 -54
  484. package/dataflow/internal/process/loops/repeat-loop.d.ts +0 -4
  485. package/dataflow/internal/process/loops/repeat-loop.js +0 -21
  486. package/dataflow/internal/process/loops/while-loop.d.ts +0 -4
  487. package/dataflow/internal/process/loops/while-loop.js +0 -31
  488. package/dataflow/internal/process/operators/assignment.d.ts +0 -4
  489. package/dataflow/internal/process/operators/assignment.js +0 -129
  490. package/dataflow/internal/process/operators/non-assignment-binary-op.d.ts +0 -4
  491. package/dataflow/internal/process/operators/non-assignment-binary-op.js +0 -25
  492. package/dataflow/internal/process/operators/pipe.d.ts +0 -4
  493. package/dataflow/internal/process/operators/pipe.js +0 -46
  494. package/dataflow/internal/process/operators/unary-op.d.ts +0 -4
  495. package/dataflow/internal/process/operators/unary-op.js +0 -10
  496. package/dataflow/internal/process/symbol.d.ts +0 -4
  497. package/dataflow/internal/process/symbol.js +0 -21
  498. package/dataflow/internal/process/uninteresting-leaf.d.ts +0 -3
  499. package/dataflow/internal/process/uninteresting-leaf.js +0 -9
  500. package/index.d.ts +0 -4
  501. package/index.js +0 -21
  502. package/r-bridge/index.d.ts +0 -11
  503. package/r-bridge/index.js +0 -28
  504. package/r-bridge/lang-4.x/ast/index.d.ts +0 -3
  505. package/r-bridge/lang-4.x/ast/index.js +0 -22
  506. package/r-bridge/lang-4.x/ast/model/index.d.ts +0 -6
  507. package/r-bridge/lang-4.x/ast/model/index.js +0 -23
  508. package/r-bridge/lang-4.x/ast/model/nodes/index.d.ts +0 -21
  509. package/r-bridge/lang-4.x/ast/model/nodes/index.js +0 -38
  510. package/r-bridge/lang-4.x/ast/model/nodes/info/index.d.ts +0 -13
  511. package/r-bridge/lang-4.x/ast/model/nodes/info/index.js +0 -27
  512. package/r-bridge/lang-4.x/ast/model/processing/index.d.ts +0 -5
  513. package/r-bridge/lang-4.x/ast/model/processing/index.js +0 -22
  514. package/r-bridge/lang-4.x/ast/parser/xml/hooks.d.ts +0 -292
  515. package/r-bridge/lang-4.x/ast/parser/xml/hooks.js +0 -136
  516. package/r-bridge/lang-4.x/ast/parser/xml/index.d.ts +0 -3
  517. package/r-bridge/lang-4.x/ast/parser/xml/index.js +0 -20
  518. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.d.ts +0 -2
  519. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.js +0 -19
  520. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.d.ts +0 -10
  521. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.js +0 -65
  522. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.d.ts +0 -1
  523. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.js +0 -18
  524. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.d.ts +0 -12
  525. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.d.ts +0 -2
  526. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.js +0 -20
  527. package/r-bridge/lang-4.x/ast/parser/xml/internal/index.d.ts +0 -9
  528. package/r-bridge/lang-4.x/ast/parser/xml/internal/index.js +0 -26
  529. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.d.ts +0 -4
  530. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.d.ts +0 -4
  531. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.d.ts +0 -5
  532. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.js +0 -22
  533. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.d.ts +0 -4
  534. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.d.ts +0 -13
  535. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.d.ts +0 -4
  536. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.d.ts +0 -3
  537. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.js +0 -20
  538. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.d.ts +0 -6
  539. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.js +0 -24
  540. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.d.ts +0 -13
  541. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.js +0 -59
  542. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.d.ts +0 -11
  543. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.d.ts +0 -1
  544. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.js +0 -18
  545. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.d.ts +0 -12
  546. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.d.ts +0 -10
  547. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.js +0 -159
  548. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.d.ts +0 -3
  549. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.js +0 -20
  550. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.d.ts +0 -4
  551. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.js +0 -33
  552. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.d.ts +0 -13
  553. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.js +0 -64
  554. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.d.ts +0 -3
  555. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.js +0 -20
  556. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.d.ts +0 -13
  557. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.d.ts +0 -11
  558. package/r-bridge/lang-4.x/index.d.ts +0 -2
  559. package/r-bridge/lang-4.x/index.js +0 -19
  560. package/slicing/criterion/filters/index.d.ts +0 -1
  561. package/slicing/criterion/filters/index.js +0 -18
  562. package/slicing/criterion/index.d.ts +0 -3
  563. package/slicing/criterion/index.js +0 -20
  564. package/slicing/index.d.ts +0 -3
  565. package/slicing/index.js +0 -20
  566. package/slicing/static/index.d.ts +0 -1
  567. package/slicing/static/index.js +0 -18
  568. package/util/mermaid/index.d.ts +0 -3
  569. package/util/mermaid/index.js +0 -20
  570. /package/{r-bridge/lang-4.x/ast/parser/xml → benchmark/summarizer}/data.js +0 -0
@@ -1,4 +1,6 @@
1
- import type { NormalizedAst, NodeId, NoInfo, ParentInformation } from '../../r-bridge';
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 static_1 = require("../static");
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({ line, column }, decorated.idMap);
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.start.line !== location.line || nodeInfo.location.start.column !== location.column) {
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
- static_1.slicerLogger.trace(`can resolve id ${id} (${JSON.stringify(nodeInfo.location)}) for location ${JSON.stringify(location)}`);
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 */ && nodeInfo.type !== "RArgument" /* RType.Argument */ || nodeInfo.type === "RExpressionList" /* RType.ExpressionList */) {
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
- static_1.slicerLogger.trace(`resolve id ${id} (${JSON.stringify(candidate?.info)}) for location ${JSON.stringify(location)}`);
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.start.line !== line || nodeInfo.lexeme !== name) {
61
+ if (nodeInfo.location === undefined || nodeInfo.location[0] !== line || nodeInfo.lexeme !== name) {
60
62
  continue;
61
63
  }
62
- static_1.slicerLogger.trace(`can resolve id ${id} (${JSON.stringify(nodeInfo)}) for line ${line} and name ${name}`);
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 */ && nodeInfo.type !== "RArgument" /* RType.Argument */ || nodeInfo.type === "RExpressionList" /* RType.ExpressionList */) {
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
- static_1.slicerLogger.trace(`resolve id ${id} (${JSON.stringify(candidate?.info)}) for line ${line} and name ${name}`);
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
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=slicer-types.js.map
@@ -1,29 +1,11 @@
1
- import type { DataflowGraph } from '../../dataflow';
2
- import type { NodeId, NormalizedAst } from '../../r-bridge';
3
- import type { DecodedCriteria, SlicingCriteria } from '../criterion';
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 | reconstruct the slice to R code}.
9
+ * The returned ids can be used to {@link reconstructToCode|reconstruct the slice to R code}.
28
10
  */
29
- export declare function staticSlicing(dataflowGraph: DataflowGraph, ast: NormalizedAst, criteria: SlicingCriteria, threshold?: number): Readonly<SliceResult>;
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 linker_1 = require("../../dataflow/internal/linker");
12
- const environments_1 = require("../../dataflow/environments");
13
- const object_hash_1 = __importDefault(require("object-hash"));
14
- const defaultmap_1 = require("../../util/defaultmap");
15
- const scopes_1 = require("../../dataflow/environments/scopes");
16
- const criterion_1 = require("../criterion");
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 | reconstruct the slice to R code}.
17
+ * The returned ids can be used to {@link reconstructToCode|reconstruct the slice to R code}.
66
18
  */
67
- function staticSlicing(dataflowGraph, ast, criteria, threshold = 75) {
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, criterion_1.convertAllSlicingCriteriaToIds)(criteria, ast);
70
- const idMap = ast.idMap;
71
- if (exports.slicerLogger.settings.minLevel <= 1 /* LogLevel.Trace */) {
72
- exports.slicerLogger.trace(`calculating slice for ${decodedCriteria.length} seed criteria: ${decodedCriteria.map(s => JSON.stringify(s)).join(', ')}`);
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 basePrint = envFingerprint((0, dataflow_1.initializeCleanEnvironments)());
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, (0, dataflow_1.initializeCleanEnvironments)(), basePrint, false);
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.has()) {
37
+ while (queue.nonEmpty()) {
83
38
  const current = queue.next();
84
- if (current === undefined) {
85
- continue;
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: ${current.id} must be in graph but can not be found, keep in slice to be sure`);
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
- if (currentInfo[0].tag === 'function-call' && !current.onlyForSideEffects) {
95
- exports.slicerLogger.trace(`${current.id} is a function call`);
96
- sliceForCall(current, idMap, currentInfo[0], dataflowGraph, queue);
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
- const currentNode = idMap.get(current.id);
99
- (0, assert_1.guard)(currentNode !== undefined, () => `id: ${current.id} must be in dataflowIdMap is not in ${(0, dataflow_1.graphToMermaidUrl)(dataflowGraph, idMap)}`);
100
- for (const [target, edge] of currentInfo[1]) {
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
- if (edge.types.has(dataflow_1.EdgeType.Reads) || edge.types.has(dataflow_1.EdgeType.DefinedBy) || edge.types.has(dataflow_1.EdgeType.Argument) || edge.types.has(dataflow_1.EdgeType.Calls) || edge.types.has(dataflow_1.EdgeType.Relates) || edge.types.has(dataflow_1.EdgeType.DefinesOnCall)) {
105
- queue.add(target, current.baseEnvironment, baseEnvFingerprint, false);
60
+ const ret = (0, slice_call_1.handleReturns)(queue, currentEdges, baseEnvFingerprint, baseEnvironment);
61
+ if (ret) {
62
+ continue;
106
63
  }
107
64
  }
108
- for (const controlFlowDependency of addControlDependencies(currentInfo[0].id, idMap)) {
109
- queue.add(controlFlowDependency, current.baseEnvironment, baseEnvFingerprint, false);
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
- for (const def of defs) {
178
- queue.add(def.nodeId, baseEnvironment, baseEnvPrint, current.onlyForSideEffects);
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>;