@eagleoutice/flowr 2.6.2 → 2.7.0

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 (435) hide show
  1. package/README.md +36 -34
  2. package/abstract-interpretation/data-frame/absint-visitor.d.ts +1 -1
  3. package/abstract-interpretation/data-frame/absint-visitor.js +6 -6
  4. package/abstract-interpretation/data-frame/dataframe-domain.d.ts +4 -7
  5. package/abstract-interpretation/data-frame/dataframe-domain.js +5 -11
  6. package/abstract-interpretation/data-frame/mappers/access-mapper.d.ts +3 -1
  7. package/abstract-interpretation/data-frame/mappers/access-mapper.js +3 -2
  8. package/abstract-interpretation/data-frame/mappers/arguments.js +2 -2
  9. package/abstract-interpretation/data-frame/mappers/assignment-mapper.d.ts +3 -1
  10. package/abstract-interpretation/data-frame/mappers/assignment-mapper.js +3 -2
  11. package/abstract-interpretation/data-frame/mappers/function-mapper.d.ts +7 -7
  12. package/abstract-interpretation/data-frame/mappers/function-mapper.js +28 -24
  13. package/abstract-interpretation/data-frame/mappers/replacement-mapper.d.ts +3 -1
  14. package/abstract-interpretation/data-frame/mappers/replacement-mapper.js +3 -2
  15. package/abstract-interpretation/data-frame/semantics.js +54 -41
  16. package/abstract-interpretation/data-frame/shape-inference.d.ts +3 -3
  17. package/abstract-interpretation/data-frame/shape-inference.js +3 -3
  18. package/abstract-interpretation/domains/abstract-domain.d.ts +1 -0
  19. package/abstract-interpretation/domains/abstract-domain.js +3 -2
  20. package/abstract-interpretation/domains/bounded-set-domain.js +1 -1
  21. package/abstract-interpretation/domains/interval-domain.d.ts +2 -2
  22. package/abstract-interpretation/domains/interval-domain.js +3 -6
  23. package/abstract-interpretation/domains/lattice.d.ts +2 -0
  24. package/abstract-interpretation/domains/lattice.js +3 -1
  25. package/abstract-interpretation/domains/positive-interval-domain.d.ts +1 -1
  26. package/abstract-interpretation/domains/positive-interval-domain.js +1 -1
  27. package/abstract-interpretation/domains/satisfiable-domain.d.ts +2 -2
  28. package/abstract-interpretation/domains/satisfiable-domain.js +2 -2
  29. package/abstract-interpretation/domains/set-range-domain.d.ts +98 -0
  30. package/abstract-interpretation/domains/set-range-domain.js +400 -0
  31. package/abstract-interpretation/domains/set-upper-bound-domain.js +2 -2
  32. package/abstract-interpretation/domains/singleton-domain.js +2 -2
  33. package/abstract-interpretation/normalized-ast-fold.d.ts +1 -1
  34. package/benchmark/slicer.d.ts +3 -1
  35. package/benchmark/slicer.js +50 -27
  36. package/benchmark/stats/print.js +8 -5
  37. package/benchmark/stats/stats.d.ts +3 -2
  38. package/benchmark/summarizer/data.d.ts +11 -8
  39. package/benchmark/summarizer/first-phase/process.js +12 -9
  40. package/benchmark/summarizer/second-phase/graph.d.ts +3 -1
  41. package/benchmark/summarizer/second-phase/graph.js +3 -1
  42. package/benchmark/summarizer/second-phase/process.js +24 -18
  43. package/cli/export-quads-app.js +1 -1
  44. package/cli/repl/commands/repl-dataflow.js +2 -1
  45. package/cli/repl/commands/repl-parse.js +16 -4
  46. package/cli/repl/commands/repl-query.js +1 -1
  47. package/cli/repl/core.js +16 -13
  48. package/cli/repl/server/connection.js +2 -1
  49. package/cli/script-core/statistics-helper-core.js +2 -1
  50. package/cli/slicer-app.js +3 -4
  51. package/cli/wiki.d.ts +4 -0
  52. package/cli/wiki.js +165 -0
  53. package/config.d.ts +4 -0
  54. package/config.js +6 -0
  55. package/control-flow/cfg-dead-code.js +14 -3
  56. package/control-flow/cfg-simplification.d.ts +5 -2
  57. package/control-flow/cfg-simplification.js +3 -0
  58. package/control-flow/extract-cfg.d.ts +9 -3
  59. package/control-flow/extract-cfg.js +44 -4
  60. package/control-flow/semantic-cfg-guided-visitor.d.ts +2 -2
  61. package/control-flow/simple-visitor.js +2 -2
  62. package/control-flow/useless-loop.d.ts +3 -3
  63. package/control-flow/useless-loop.js +16 -5
  64. package/core/pipeline-executor.d.ts +3 -6
  65. package/core/pipeline-executor.js +4 -7
  66. package/core/print/normalize-printer.d.ts +1 -1
  67. package/core/print/normalize-printer.js +2 -2
  68. package/core/steps/all/core/00-parse.d.ts +1 -1
  69. package/core/steps/all/core/00-parse.js +1 -1
  70. package/core/steps/all/core/10-normalize.d.ts +3 -9
  71. package/core/steps/all/core/10-normalize.js +1 -16
  72. package/core/steps/all/core/11-normalize-tree-sitter.d.ts +2 -3
  73. package/core/steps/all/core/11-normalize-tree-sitter.js +2 -3
  74. package/core/steps/all/core/20-dataflow.d.ts +3 -4
  75. package/core/steps/all/core/20-dataflow.js +2 -2
  76. package/core/steps/all/static-slicing/00-slice.d.ts +4 -2
  77. package/core/steps/all/static-slicing/00-slice.js +3 -2
  78. package/core/steps/all/static-slicing/10-reconstruct.d.ts +8 -0
  79. package/core/steps/all/static-slicing/10-reconstruct.js +4 -1
  80. package/core/steps/pipeline/default-pipelines.d.ts +94 -95
  81. package/core/steps/pipeline/default-pipelines.js +8 -8
  82. package/dataflow/cluster.js +2 -2
  83. package/dataflow/environments/append.d.ts +5 -0
  84. package/dataflow/environments/append.js +6 -20
  85. package/dataflow/environments/built-in.d.ts +2 -1
  86. package/dataflow/environments/clone.d.ts +1 -2
  87. package/dataflow/environments/clone.js +3 -17
  88. package/dataflow/environments/define.d.ts +7 -3
  89. package/dataflow/environments/define.js +9 -56
  90. package/dataflow/environments/diff.js +3 -3
  91. package/dataflow/environments/environment.d.ts +48 -28
  92. package/dataflow/environments/environment.js +187 -62
  93. package/dataflow/environments/overwrite.d.ts +1 -5
  94. package/dataflow/environments/overwrite.js +2 -61
  95. package/dataflow/environments/reference-to-maybe.d.ts +13 -0
  96. package/dataflow/environments/reference-to-maybe.js +54 -0
  97. package/dataflow/environments/resolve-by-name.d.ts +6 -1
  98. package/dataflow/environments/resolve-by-name.js +56 -4
  99. package/dataflow/environments/scoping.d.ts +8 -4
  100. package/dataflow/environments/scoping.js +13 -9
  101. package/dataflow/eval/resolve/alias-tracking.d.ts +10 -4
  102. package/dataflow/eval/resolve/alias-tracking.js +15 -13
  103. package/dataflow/eval/resolve/resolve-argument.d.ts +2 -1
  104. package/dataflow/eval/resolve/resolve-argument.js +10 -10
  105. package/dataflow/eval/resolve/resolve.d.ts +13 -11
  106. package/dataflow/eval/resolve/resolve.js +16 -15
  107. package/dataflow/eval/values/string/string-constants.d.ts +9 -3
  108. package/dataflow/eval/values/string/string-constants.js +9 -3
  109. package/dataflow/extractor.d.ts +2 -3
  110. package/dataflow/extractor.js +25 -28
  111. package/dataflow/fn/higher-order-function.d.ts +2 -1
  112. package/dataflow/fn/higher-order-function.js +4 -4
  113. package/dataflow/graph/dataflowgraph-builder.d.ts +9 -5
  114. package/dataflow/graph/dataflowgraph-builder.js +21 -11
  115. package/dataflow/graph/diff-dataflow-graph.js +2 -2
  116. package/dataflow/graph/graph.d.ts +13 -11
  117. package/dataflow/graph/graph.js +40 -24
  118. package/dataflow/graph/invert-dfg.d.ts +3 -2
  119. package/dataflow/graph/invert-dfg.js +3 -3
  120. package/dataflow/graph/resolve-graph.d.ts +2 -1
  121. package/dataflow/graph/resolve-graph.js +2 -2
  122. package/dataflow/graph/unknown-replacement.d.ts +4 -2
  123. package/dataflow/graph/unknown-replacement.js +4 -2
  124. package/dataflow/graph/vertex.d.ts +3 -3
  125. package/dataflow/graph/vertex.js +3 -3
  126. package/dataflow/info.d.ts +8 -1
  127. package/dataflow/info.js +21 -0
  128. package/dataflow/internal/linker.js +10 -11
  129. package/dataflow/internal/process/functions/call/argument/make-argument.d.ts +2 -2
  130. package/dataflow/internal/process/functions/call/argument/make-argument.js +2 -3
  131. package/dataflow/internal/process/functions/call/argument/unpack-argument.d.ts +7 -1
  132. package/dataflow/internal/process/functions/call/argument/unpack-argument.js +12 -3
  133. package/dataflow/internal/process/functions/call/built-in/built-in-access.d.ts +1 -1
  134. package/dataflow/internal/process/functions/call/built-in/built-in-access.js +7 -7
  135. package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +2 -2
  136. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.d.ts +3 -1
  137. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +6 -6
  138. package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +14 -14
  139. package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +10 -8
  140. package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +4 -4
  141. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.d.ts +2 -1
  142. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +10 -14
  143. package/dataflow/internal/process/functions/call/built-in/built-in-get.d.ts +1 -1
  144. package/dataflow/internal/process/functions/call/built-in/built-in-get.js +2 -2
  145. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.d.ts +3 -1
  146. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +8 -6
  147. package/dataflow/internal/process/functions/call/built-in/built-in-library.js +1 -1
  148. package/dataflow/internal/process/functions/call/built-in/built-in-list.js +2 -2
  149. package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +4 -4
  150. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.d.ts +6 -1
  151. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +7 -2
  152. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +5 -5
  153. package/dataflow/internal/process/functions/call/built-in/built-in-rm.js +6 -4
  154. package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +15 -10
  155. package/dataflow/internal/process/functions/call/built-in/built-in-source.js +78 -75
  156. package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.d.ts +3 -1
  157. package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.js +3 -1
  158. package/dataflow/internal/process/functions/call/built-in/built-in-vector.js +2 -2
  159. package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +5 -5
  160. package/dataflow/internal/process/functions/call/common.d.ts +1 -1
  161. package/dataflow/internal/process/functions/call/common.js +6 -7
  162. package/dataflow/internal/process/functions/call/default-call-handling.d.ts +3 -1
  163. package/dataflow/internal/process/functions/call/default-call-handling.js +3 -1
  164. package/dataflow/internal/process/functions/call/known-call-handling.js +4 -4
  165. package/dataflow/internal/process/functions/call/named-call-handling.js +4 -4
  166. package/dataflow/internal/process/functions/call/unnamed-call-handling.js +1 -1
  167. package/dataflow/internal/process/functions/process-argument.js +1 -1
  168. package/dataflow/internal/process/functions/process-parameter.js +4 -4
  169. package/dataflow/internal/process/process-symbol.js +1 -1
  170. package/dataflow/internal/process/process-value.d.ts +1 -1
  171. package/dataflow/internal/process/process-value.js +7 -7
  172. package/dataflow/origin/dfg-get-symbol-refs.d.ts +1 -1
  173. package/dataflow/origin/dfg-get-symbol-refs.js +1 -1
  174. package/dataflow/processor.d.ts +7 -16
  175. package/documentation/data/dfg/doc-data-dfg-util.d.ts +0 -2
  176. package/documentation/data/faq/faqs.js +27 -18
  177. package/documentation/data/faq/recommended-configs.d.ts +36 -0
  178. package/documentation/data/faq/recommended-configs.js +40 -0
  179. package/documentation/data/faq/wiki-faq-store.d.ts +1 -0
  180. package/documentation/data/faq/wiki-faq-store.js +10 -2
  181. package/documentation/data/server/doc-data-server-messages.js +1 -1
  182. package/documentation/doc-capabilities.d.ts +9 -0
  183. package/documentation/{print-capabilities-markdown.js → doc-capabilities.js} +18 -21
  184. package/documentation/doc-readme.d.ts +9 -0
  185. package/documentation/{print-readme.js → doc-readme.js} +31 -35
  186. package/documentation/doc-util/doc-benchmarks.d.ts +6 -4
  187. package/documentation/doc-util/doc-benchmarks.js +6 -4
  188. package/documentation/doc-util/doc-cfg.js +5 -8
  189. package/documentation/doc-util/doc-dfg.d.ts +7 -7
  190. package/documentation/doc-util/doc-dfg.js +15 -14
  191. package/documentation/doc-util/doc-escape.d.ts +6 -0
  192. package/documentation/doc-util/doc-escape.js +11 -0
  193. package/documentation/doc-util/doc-general.d.ts +22 -2
  194. package/documentation/doc-util/doc-general.js +22 -2
  195. package/documentation/doc-util/doc-normalized-ast.d.ts +10 -5
  196. package/documentation/doc-util/doc-normalized-ast.js +14 -10
  197. package/documentation/doc-util/doc-query.d.ts +12 -4
  198. package/documentation/doc-util/doc-query.js +18 -11
  199. package/documentation/doc-util/doc-search.d.ts +0 -30
  200. package/documentation/doc-util/doc-search.js +2 -73
  201. package/documentation/doc-util/doc-server-message.d.ts +5 -5
  202. package/documentation/doc-util/doc-server-message.js +4 -4
  203. package/documentation/doc-util/doc-types.d.ts +69 -32
  204. package/documentation/doc-util/doc-types.js +109 -62
  205. package/documentation/index.d.ts +9 -9
  206. package/documentation/index.js +9 -9
  207. package/documentation/issue-linting-rule.d.ts +9 -0
  208. package/documentation/{print-linter-issue.js → issue-linting-rule.js} +20 -23
  209. package/documentation/wiki-analyzer.d.ts +9 -0
  210. package/documentation/wiki-analyzer.js +425 -0
  211. package/documentation/wiki-cfg.d.ts +9 -0
  212. package/documentation/{print-cfg-wiki.js → wiki-cfg.js} +144 -160
  213. package/documentation/wiki-core.d.ts +14 -0
  214. package/documentation/{print-core-wiki.js → wiki-core.js} +164 -175
  215. package/documentation/wiki-dataflow-graph.d.ts +9 -0
  216. package/documentation/{print-dataflow-graph-wiki.js → wiki-dataflow-graph.js} +146 -177
  217. package/documentation/wiki-engine.d.ts +9 -0
  218. package/documentation/{print-engines-wiki.js → wiki-engine.js} +27 -42
  219. package/documentation/wiki-faq.d.ts +8 -0
  220. package/documentation/wiki-faq.js +21 -0
  221. package/documentation/wiki-interface.d.ts +9 -0
  222. package/documentation/{print-interface-wiki.js → wiki-interface.js} +59 -56
  223. package/documentation/wiki-linter.d.ts +9 -0
  224. package/documentation/{print-linter-wiki.js → wiki-linter.js} +52 -48
  225. package/documentation/wiki-linting-and-testing.d.ts +9 -0
  226. package/documentation/{print-linting-and-testing-wiki.js → wiki-linting-and-testing.js} +25 -32
  227. package/documentation/wiki-mk/doc-context.d.ts +186 -0
  228. package/documentation/wiki-mk/doc-context.js +84 -0
  229. package/documentation/wiki-mk/doc-maker.d.ts +95 -0
  230. package/documentation/wiki-mk/doc-maker.js +134 -0
  231. package/documentation/wiki-normalized-ast.d.ts +9 -0
  232. package/documentation/{print-normalized-ast-wiki.js → wiki-normalized-ast.js} +64 -47
  233. package/documentation/wiki-onboarding.d.ts +8 -0
  234. package/documentation/{print-onboarding-wiki.js → wiki-onboarding.js} +18 -15
  235. package/documentation/wiki-query.d.ts +9 -0
  236. package/documentation/{print-query-wiki.js → wiki-query.js} +62 -47
  237. package/documentation/wiki-search.d.ts +9 -0
  238. package/documentation/wiki-search.js +61 -0
  239. package/linter/linter-executor.js +3 -2
  240. package/linter/linter-format.d.ts +2 -2
  241. package/linter/linter-rules.d.ts +15 -19
  242. package/linter/rules/absolute-path.d.ts +1 -2
  243. package/linter/rules/absolute-path.js +5 -5
  244. package/linter/rules/dataframe-access-validation.d.ts +2 -2
  245. package/linter/rules/dataframe-access-validation.js +13 -9
  246. package/linter/rules/dead-code.d.ts +1 -1
  247. package/linter/rules/deprecated-functions.d.ts +1 -5
  248. package/linter/rules/file-path-validity.d.ts +1 -1
  249. package/linter/rules/file-path-validity.js +4 -4
  250. package/linter/rules/function-finder-util.d.ts +3 -7
  251. package/linter/rules/function-finder-util.js +1 -1
  252. package/linter/rules/naming-convention.d.ts +2 -2
  253. package/linter/rules/naming-convention.js +1 -1
  254. package/linter/rules/network-functions.d.ts +1 -1
  255. package/linter/rules/network-functions.js +1 -1
  256. package/linter/rules/seeded-randomness.d.ts +4 -3
  257. package/linter/rules/seeded-randomness.js +38 -18
  258. package/linter/rules/unused-definition.d.ts +1 -1
  259. package/linter/rules/useless-loop.d.ts +2 -2
  260. package/linter/rules/useless-loop.js +2 -2
  261. package/package.json +5 -17
  262. package/project/cache/flowr-analyzer-cache.d.ts +7 -10
  263. package/project/cache/flowr-analyzer-cache.js +17 -38
  264. package/project/cache/flowr-analyzer-controlflow-cache.d.ts +34 -0
  265. package/project/cache/flowr-analyzer-controlflow-cache.js +79 -0
  266. package/project/context/flowr-analyzer-context.d.ts +37 -5
  267. package/project/context/flowr-analyzer-context.js +51 -4
  268. package/project/context/flowr-analyzer-environment-context.d.ts +47 -0
  269. package/project/context/flowr-analyzer-environment-context.js +50 -0
  270. package/project/context/flowr-analyzer-files-context.d.ts +63 -13
  271. package/project/context/flowr-analyzer-files-context.js +110 -39
  272. package/project/context/flowr-file.d.ts +32 -10
  273. package/project/context/flowr-file.js +30 -9
  274. package/project/flowr-analyzer-builder.d.ts +22 -28
  275. package/project/flowr-analyzer-builder.js +32 -70
  276. package/project/flowr-analyzer.d.ts +55 -14
  277. package/project/flowr-analyzer.js +53 -8
  278. package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.d.ts +7 -1
  279. package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.js +13 -5
  280. package/project/plugins/file-plugins/flowr-analyzer-file-plugin.d.ts +3 -3
  281. package/project/plugins/file-plugins/flowr-analyzer-file-plugin.js +11 -5
  282. package/project/plugins/file-plugins/flowr-description-file.d.ts +3 -3
  283. package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.d.ts +22 -0
  284. package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.js +33 -0
  285. package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.d.ts +22 -0
  286. package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.js +33 -0
  287. package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.d.ts +22 -0
  288. package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.js +33 -0
  289. package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.d.ts +20 -0
  290. package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.js +42 -0
  291. package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.d.ts +59 -0
  292. package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.js +132 -0
  293. package/project/plugins/file-plugins/notebooks/notebook.d.ts +0 -0
  294. package/project/plugins/file-plugins/notebooks/notebook.js +2 -0
  295. package/project/plugins/flowr-analyzer-plugin-defaults.d.ts +5 -0
  296. package/project/plugins/flowr-analyzer-plugin-defaults.js +23 -0
  297. package/project/plugins/flowr-analyzer-plugin.d.ts +2 -0
  298. package/project/plugins/flowr-analyzer-plugin.js +2 -0
  299. package/project/plugins/loading-order-plugins/flowr-analyzer-loading-order-description-file-plugin.js +1 -1
  300. package/project/plugins/package-version-plugins/flowr-analyzer-package-versions-description-file-plugin.js +1 -1
  301. package/project/plugins/plugin-registry.d.ts +34 -0
  302. package/project/plugins/plugin-registry.js +62 -0
  303. package/project/plugins/project-discovery/flowr-analyzer-project-discovery-plugin.js +7 -1
  304. package/queries/catalog/call-context-query/call-context-query-executor.js +5 -6
  305. package/queries/catalog/call-context-query/identify-link-to-last-call-relation.d.ts +5 -2
  306. package/queries/catalog/call-context-query/identify-link-to-last-call-relation.js +25 -18
  307. package/queries/catalog/cluster-query/cluster-query-format.d.ts +1 -1
  308. package/queries/catalog/control-flow-query/control-flow-query-format.d.ts +1 -1
  309. package/queries/catalog/control-flow-query/control-flow-query-format.js +3 -2
  310. package/queries/catalog/dataflow-lens-query/dataflow-lens-query-executor.js +1 -1
  311. package/queries/catalog/dataflow-lens-query/dataflow-lens-query-format.d.ts +1 -1
  312. package/queries/catalog/dataflow-query/dataflow-query-format.d.ts +1 -1
  313. package/queries/catalog/dependencies-query/dependencies-query-executor.d.ts +1 -1
  314. package/queries/catalog/dependencies-query/dependencies-query-executor.js +5 -5
  315. package/queries/catalog/dependencies-query/dependencies-query-format.d.ts +1 -1
  316. package/queries/catalog/dependencies-query/dependencies-query-format.js +1 -1
  317. package/queries/catalog/df-shape-query/df-shape-query-executor.d.ts +1 -1
  318. package/queries/catalog/df-shape-query/df-shape-query-executor.js +2 -2
  319. package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +6 -6
  320. package/queries/catalog/df-shape-query/df-shape-query-format.js +8 -7
  321. package/queries/catalog/happens-before-query/happens-before-query-executor.d.ts +2 -1
  322. package/queries/catalog/happens-before-query/happens-before-query-executor.js +2 -1
  323. package/queries/catalog/happens-before-query/happens-before-query-format.d.ts +1 -1
  324. package/queries/catalog/id-map-query/id-map-query-format.d.ts +1 -1
  325. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.d.ts +1 -1
  326. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.js +4 -4
  327. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-format.d.ts +1 -1
  328. package/queries/catalog/linter-query/linter-query-format.d.ts +1 -1
  329. package/queries/catalog/linter-query/linter-query-format.js +13 -2
  330. package/queries/catalog/location-map-query/location-map-query-executor.js +2 -1
  331. package/queries/catalog/location-map-query/location-map-query-format.d.ts +1 -1
  332. package/queries/catalog/location-map-query/location-map-query-format.js +1 -1
  333. package/queries/catalog/normalized-ast-query/normalized-ast-query-format.d.ts +1 -1
  334. package/queries/catalog/origin-query/origin-query-format.d.ts +1 -1
  335. package/queries/catalog/project-query/project-query-executor.js +3 -1
  336. package/queries/catalog/project-query/project-query-format.d.ts +1 -1
  337. package/queries/catalog/resolve-value-query/resolve-value-query-executor.d.ts +2 -2
  338. package/queries/catalog/resolve-value-query/resolve-value-query-executor.js +3 -3
  339. package/queries/catalog/resolve-value-query/resolve-value-query-format.d.ts +1 -1
  340. package/queries/catalog/search-query/search-query-format.d.ts +1 -1
  341. package/queries/catalog/static-slice-query/static-slice-query-executor.js +2 -2
  342. package/queries/catalog/static-slice-query/static-slice-query-format.d.ts +1 -1
  343. package/queries/catalog/static-slice-query/static-slice-query-format.js +13 -1
  344. package/queries/query.d.ts +26 -18
  345. package/queries/query.js +21 -1
  346. package/r-bridge/lang-4.x/ast/model/collect.d.ts +2 -1
  347. package/r-bridge/lang-4.x/ast/model/collect.js +4 -0
  348. package/r-bridge/lang-4.x/ast/model/nodes/r-project.d.ts +29 -0
  349. package/r-bridge/lang-4.x/ast/model/nodes/r-project.js +15 -0
  350. package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +5 -7
  351. package/r-bridge/lang-4.x/ast/model/processing/decorate.js +24 -11
  352. package/r-bridge/lang-4.x/ast/model/type.d.ts +2 -0
  353. package/r-bridge/lang-4.x/ast/model/type.js +2 -0
  354. package/r-bridge/lang-4.x/ast/parser/json/format.js +1 -1
  355. package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +9 -8
  356. package/r-bridge/lang-4.x/ast/parser/json/parser.js +11 -10
  357. package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.d.ts +4 -3
  358. package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.js +20 -11
  359. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.d.ts +3 -3
  360. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.js +5 -4
  361. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.d.ts +3 -2
  362. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.js +14 -5
  363. package/r-bridge/parser.d.ts +15 -5
  364. package/r-bridge/parser.js +27 -13
  365. package/r-bridge/retriever.d.ts +9 -15
  366. package/r-bridge/retriever.js +14 -5
  367. package/r-bridge/shell.d.ts +1 -1
  368. package/r-bridge/shell.js +1 -1
  369. package/reconstruct/auto-select/auto-select-defaults.d.ts +0 -1
  370. package/reconstruct/auto-select/magic-comments.js +1 -1
  371. package/reconstruct/reconstruct.d.ts +17 -9
  372. package/reconstruct/reconstruct.js +19 -8
  373. package/search/flowr-search.d.ts +12 -0
  374. package/search/search-executor/search-enrichers.d.ts +9 -2
  375. package/search/search-executor/search-enrichers.js +1 -3
  376. package/search/search-executor/search-generators.d.ts +1 -1
  377. package/search/search-executor/search-generators.js +9 -4
  378. package/slicing/criterion/collect-all.d.ts +3 -2
  379. package/slicing/criterion/collect-all.js +1 -1
  380. package/slicing/criterion/parse.js +4 -4
  381. package/slicing/static/slice-call.d.ts +3 -2
  382. package/slicing/static/slice-call.js +4 -4
  383. package/slicing/static/static-slicer.d.ts +3 -1
  384. package/slicing/static/static-slicer.js +6 -7
  385. package/statistics/features/supported/assignments/assignments.js +1 -1
  386. package/statistics/features/supported/control-flow/control-flow.js +2 -2
  387. package/statistics/features/supported/data-access/data-access.js +1 -1
  388. package/statistics/features/supported/defined-functions/defined-functions.js +1 -1
  389. package/statistics/features/supported/expression-list/statistics-expression-list.js +1 -1
  390. package/statistics/features/supported/loops/loops.js +1 -1
  391. package/statistics/features/supported/used-functions/used-functions.js +2 -2
  392. package/statistics/features/supported/variables/variables.js +3 -2
  393. package/statistics/statistics.js +3 -2
  394. package/util/assert.d.ts +4 -0
  395. package/util/assert.js +4 -0
  396. package/util/containers.js +1 -1
  397. package/util/files.d.ts +1 -1
  398. package/util/files.js +1 -1
  399. package/util/mermaid/ast.d.ts +4 -3
  400. package/util/mermaid/ast.js +36 -8
  401. package/util/mermaid/cfg.js +1 -1
  402. package/util/mermaid/dfg.d.ts +1 -0
  403. package/util/mermaid/dfg.js +3 -3
  404. package/util/simple-df/dfg-view.d.ts +2 -1
  405. package/util/simple-df/dfg-view.js +2 -2
  406. package/util/version.js +1 -1
  407. package/dataflow/environments/remove.d.ts +0 -12
  408. package/dataflow/environments/remove.js +0 -52
  409. package/documentation/print-analyzer-wiki.d.ts +0 -1
  410. package/documentation/print-analyzer-wiki.js +0 -141
  411. package/documentation/print-capabilities-markdown.d.ts +0 -1
  412. package/documentation/print-cfg-wiki.d.ts +0 -1
  413. package/documentation/print-core-wiki.d.ts +0 -5
  414. package/documentation/print-dataflow-graph-wiki.d.ts +0 -1
  415. package/documentation/print-engines-wiki.d.ts +0 -1
  416. package/documentation/print-faq-wiki.d.ts +0 -1
  417. package/documentation/print-faq-wiki.js +0 -18
  418. package/documentation/print-interface-wiki.d.ts +0 -1
  419. package/documentation/print-linter-issue.d.ts +0 -1
  420. package/documentation/print-linter-wiki.d.ts +0 -1
  421. package/documentation/print-linting-and-testing-wiki.d.ts +0 -1
  422. package/documentation/print-normalized-ast-wiki.d.ts +0 -1
  423. package/documentation/print-onboarding-wiki.d.ts +0 -1
  424. package/documentation/print-query-wiki.d.ts +0 -1
  425. package/documentation/print-readme.d.ts +0 -1
  426. package/documentation/print-search-wiki.d.ts +0 -1
  427. package/documentation/print-search-wiki.js +0 -74
  428. package/util/formats/adapter-format.d.ts +0 -6
  429. package/util/formats/adapter-format.js +0 -3
  430. package/util/formats/adapter.d.ts +0 -27
  431. package/util/formats/adapter.js +0 -58
  432. package/util/formats/adapters/r-adapter.d.ts +0 -4
  433. package/util/formats/adapters/r-adapter.js +0 -7
  434. package/util/formats/adapters/rmd-adapter.d.ts +0 -35
  435. package/util/formats/adapters/rmd-adapter.js +0 -100
@@ -3,9 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getSourceProvider = getSourceProvider;
7
- exports.setSourceProvider = setSourceProvider;
8
6
  exports.inferWdFromScript = inferWdFromScript;
7
+ exports.platformBasename = platformBasename;
8
+ exports.platformDirname = platformDirname;
9
9
  exports.findSource = findSource;
10
10
  exports.processSourceCall = processSourceCall;
11
11
  exports.sourceRequest = sourceRequest;
@@ -21,7 +21,6 @@ const logger_1 = require("../../../../../logger");
21
21
  const type_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/type");
22
22
  const overwrite_1 = require("../../../../../environments/overwrite");
23
23
  const log_1 = require("../../../../../../util/log");
24
- const fs_1 = __importDefault(require("fs"));
25
24
  const parser_1 = require("../../../../../../r-bridge/lang-4.x/ast/parser/json/parser");
26
25
  const shell_executor_1 = require("../../../../../../r-bridge/shell-executor");
27
26
  const assert_1 = require("../../../../../../util/assert");
@@ -30,40 +29,36 @@ const general_1 = require("../../../../../eval/values/general");
30
29
  const r_value_1 = require("../../../../../eval/values/r-value");
31
30
  const unknown_side_effect_1 = require("../../../../../graph/unknown-side-effect");
32
31
  const alias_tracking_1 = require("../../../../../eval/resolve/alias-tracking");
33
- let sourceProvider = (0, retriever_1.requestProviderFromFile)();
34
- /**
35
- * Returns the current (global) source provider
36
- */
37
- function getSourceProvider() {
38
- return sourceProvider;
39
- }
40
- /**
41
- * Sets the current (global) source provider
42
- */
43
- function setSourceProvider(provider) {
44
- sourceProvider = provider;
45
- }
46
32
  /**
47
33
  * Infers working directories based on the given option and reference chain
48
34
  */
49
35
  function inferWdFromScript(option, referenceChain) {
50
36
  switch (option) {
51
37
  case config_1.InferWorkingDirectory.MainScript:
52
- return referenceChain[0]?.request === 'file' ? [platformDirname(referenceChain[0].content)] : [];
53
- case config_1.InferWorkingDirectory.ActiveScript:
54
- return referenceChain[referenceChain.length - 1] ? [platformDirname(referenceChain[referenceChain.length - 1].content)] : [];
38
+ return referenceChain[0] ? [platformDirname(referenceChain[0])] : [];
39
+ case config_1.InferWorkingDirectory.ActiveScript: {
40
+ const secondToLast = referenceChain[referenceChain.length - 1];
41
+ return secondToLast ? [platformDirname(secondToLast)] : [];
42
+ }
55
43
  case config_1.InferWorkingDirectory.AnyScript:
56
- return referenceChain.filter(e => e.request === 'file').map(e => platformDirname(e.content));
44
+ return referenceChain.filter(assert_1.isNotUndefined).map(e => platformDirname(e));
57
45
  case config_1.InferWorkingDirectory.No:
58
46
  default:
59
47
  return [];
60
48
  }
61
49
  }
62
50
  const AnyPathSeparator = /[/\\]/g;
51
+ /**
52
+ * Return the basename of a path in a platform-agnostic way
53
+ * @see {@link platformDirname} - for the dirname counterpart
54
+ */
63
55
  function platformBasename(p) {
64
56
  const normalized = p.replaceAll(path_1.default.win32.sep, path_1.default.posix.sep);
65
57
  return path_1.default.posix.basename(normalized);
66
58
  }
59
+ /**
60
+ * Return the dirname of a path in a platform-agnostic way
61
+ */
67
62
  function platformDirname(p) {
68
63
  const normalized = p.replaceAll(path_1.default.win32.sep, path_1.default.posix.sep);
69
64
  return path_1.default.posix.dirname(normalized);
@@ -87,10 +82,7 @@ function applyReplacements(path, replacements) {
87
82
  */
88
83
  function findSource(resolveSource, seed, data) {
89
84
  const capitalization = resolveSource?.ignoreCapitalization ?? false;
90
- const explorePaths = [
91
- ...(resolveSource?.searchPath ?? []),
92
- ...(inferWdFromScript(resolveSource?.inferWorkingDirectory ?? config_1.InferWorkingDirectory.No, data.referenceChain))
93
- ];
85
+ const explorePaths = (resolveSource?.searchPath ?? []).concat(inferWdFromScript(resolveSource?.inferWorkingDirectory ?? config_1.InferWorkingDirectory.No, data.referenceChain));
94
86
  let tryPaths = [seed];
95
87
  switch (resolveSource?.dropPaths ?? config_1.DropPathsOption.No) {
96
88
  case config_1.DropPathsOption.Once: {
@@ -122,7 +114,8 @@ function findSource(resolveSource, seed, data) {
122
114
  for (const explore of [undefined, ...explorePaths]) {
123
115
  for (const tryPath of tryPaths) {
124
116
  const effectivePath = explore ? path_1.default.join(explore, tryPath) : tryPath;
125
- const get = sourceProvider.exists(effectivePath, capitalization) ?? sourceProvider.exists(returnPlatformPath(effectivePath), capitalization);
117
+ const context = data.ctx.files;
118
+ const get = context.exists(effectivePath, capitalization) ?? context.exists(returnPlatformPath(effectivePath), capitalization);
126
119
  if (get && !found.includes(effectivePath)) {
127
120
  found.push(returnPlatformPath(effectivePath));
128
121
  }
@@ -145,7 +138,7 @@ function processSourceCall(name, args, rootId, data, config) {
145
138
  (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'builtin:source' }).information
146
139
  : (0, info_1.initializeCleanDataflowInformation)(rootId, data);
147
140
  const sourceFileArgument = args[0];
148
- if (!config.forceFollow && data.flowrConfig.ignoreSourceCalls) {
141
+ if (!config.forceFollow && data.ctx.config.ignoreSourceCalls) {
149
142
  (0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Skipping source call ${JSON.stringify(sourceFileArgument)} (disabled in config file)`);
150
143
  (0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
151
144
  return information;
@@ -155,26 +148,25 @@ function processSourceCall(name, args, rootId, data, config) {
155
148
  sourceFile = [(0, retriever_1.removeRQuotes)(sourceFileArgument.lexeme)];
156
149
  }
157
150
  else if (sourceFileArgument !== r_function_call_1.EmptyArgument) {
158
- const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(sourceFileArgument.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.flowrConfig.solver.variables }));
151
+ const resolved = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(sourceFileArgument.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.ctx.config.solver.variables, ctx: data.ctx }));
159
152
  sourceFile = resolved?.elements.map(r => r.type === 'string' && (0, r_value_1.isValue)(r.value) ? r.value.str : undefined).filter(assert_1.isNotUndefined);
160
153
  }
161
154
  if (sourceFile && sourceFile.length === 1) {
162
155
  const path = (0, retriever_1.removeRQuotes)(sourceFile[0]);
163
- let filepath = path ? findSource(data.flowrConfig.solver.resolveSource, path, data) : path;
156
+ let filepath = path ? findSource(data.ctx.config.solver.resolveSource, path, data) : path;
164
157
  if (Array.isArray(filepath)) {
165
158
  filepath = filepath?.[0];
166
159
  }
167
160
  if (filepath !== undefined) {
168
- const request = sourceProvider.createRequest(filepath);
169
161
  // check if the sourced file has already been dataflow analyzed, and if so, skip it
170
- const limit = data.flowrConfig.solver.resolveSource?.repeatedSourceLimit ?? 0;
171
- const findCount = data.referenceChain.filter(e => e.request === request.request && e.content === request.content).length;
162
+ const limit = data.ctx.config.solver.resolveSource?.repeatedSourceLimit ?? 0;
163
+ const findCount = data.referenceChain.filter(e => e !== undefined && filepath === e).length;
172
164
  if (findCount > limit) {
173
- logger_1.dataflowLogger.warn(`Found cycle (>=${limit + 1}) in dataflow analysis for ${JSON.stringify(request)}: ${JSON.stringify(data.referenceChain)}, skipping further dataflow analysis`);
165
+ logger_1.dataflowLogger.warn(`Found cycle (>=${limit + 1}) in dataflow analysis for ${JSON.stringify(filepath)}: ${JSON.stringify(data.referenceChain)}, skipping further dataflow analysis`);
174
166
  (0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
175
167
  return information;
176
168
  }
177
- return sourceRequest(rootId, request, data, information, (0, decorate_1.sourcedDeterministicCountingIdGenerator)((findCount > 0 ? findCount + '::' : '') + path, name.location));
169
+ return sourceRequest(rootId, { request: 'file', content: filepath }, data, information, (0, decorate_1.sourcedDeterministicCountingIdGenerator)((findCount > 0 ? findCount + '::' : '') + path, name.location));
178
170
  }
179
171
  }
180
172
  (0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Non-constant argument ${JSON.stringify(sourceFile)} for source is currently not supported, skipping`);
@@ -183,30 +175,48 @@ function processSourceCall(name, args, rootId, data, config) {
183
175
  }
184
176
  /**
185
177
  * Processes a source request with the given dataflow processor information and existing dataflow information
178
+ * Otherwise, this can be an {@link RProjectFile} representing a standalone source file
186
179
  */
187
180
  function sourceRequest(rootId, request, data, information, getId) {
188
- if (request.request === 'file') {
189
- /* check if the file exists and if not, fail */
190
- if (!fs_1.default.existsSync(request.content)) {
181
+ // parse, normalize and dataflow the sourced file
182
+ let dataflow;
183
+ let fst;
184
+ let filePath;
185
+ if ('root' in request) {
186
+ fst = request;
187
+ filePath = request.filePath;
188
+ }
189
+ else {
190
+ const textRequest = data.ctx.files.resolveRequest(request);
191
+ if (textRequest === undefined && request.request === 'file') {
192
+ // if translation failed there is nothing we can do!!
191
193
  logger_1.dataflowLogger.warn(`Failed to analyze sourced file ${JSON.stringify(request)}: file does not exist`);
192
194
  (0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, rootId);
193
195
  return information;
194
196
  }
197
+ else {
198
+ (0, assert_1.guard)(textRequest !== undefined, `Expected text request to be defined for sourced file ${JSON.stringify(request)}`);
199
+ }
200
+ const parsed = (!data.parser.async ? data.parser : new shell_executor_1.RShellExecutor()).parse(textRequest.r);
201
+ const normalized = (typeof parsed !== 'string' ?
202
+ (0, parser_1.normalizeTreeSitter)({ files: [{ parsed, filePath: textRequest.path }] }, getId, data.ctx.config)
203
+ : (0, parser_1.normalize)({ files: [{ parsed, filePath: textRequest.path }] }, getId));
204
+ fst = normalized.ast.files[0];
205
+ // this can be improved, see issue #628
206
+ for (const [k, v] of normalized.idMap) {
207
+ data.completeAst.idMap.set(k, v);
208
+ }
209
+ // add to the main ast
210
+ if (!data.completeAst.ast.files.find(f => f.filePath === fst.filePath)) {
211
+ data.completeAst.ast.files.push(fst);
212
+ }
213
+ filePath = textRequest.path;
195
214
  }
196
- // parse, normalize and dataflow the sourced file
197
- let normalized;
198
- let dataflow;
199
215
  try {
200
- const file = request.request === 'file' ? request.content : undefined;
201
- const parsed = (!data.parser.async ? data.parser : new shell_executor_1.RShellExecutor()).parse(request);
202
- normalized = (typeof parsed !== 'string' ?
203
- (0, parser_1.normalizeTreeSitter)({ parsed }, getId, data.flowrConfig, file)
204
- : (0, parser_1.normalize)({ parsed }, getId, file));
205
- dataflow = (0, processor_1.processDataflowFor)(normalized.ast, {
216
+ dataflow = (0, processor_1.processDataflowFor)(fst.root, {
206
217
  ...data,
207
- currentRequest: request,
208
218
  environment: information.environment,
209
- referenceChain: [...data.referenceChain, request]
219
+ referenceChain: [...data.referenceChain, fst.filePath]
210
220
  });
211
221
  }
212
222
  catch (e) {
@@ -216,47 +226,40 @@ function sourceRequest(rootId, request, data, information, getId) {
216
226
  return information;
217
227
  }
218
228
  // take the entry point as well as all the written references, and give them a control dependency to the source call to show that they are conditional
219
- if (dataflow.graph.hasVertex(dataflow.entryPoint)) {
220
- dataflow.graph.addControlDependency(dataflow.entryPoint, rootId, true);
221
- }
222
- for (const out of dataflow.out) {
223
- dataflow.graph.addControlDependency(out.nodeId, rootId, true);
229
+ if (!String(rootId).startsWith('file-')) {
230
+ if (dataflow.graph.hasVertex(dataflow.entryPoint)) {
231
+ dataflow.graph.addControlDependency(dataflow.entryPoint, rootId, true);
232
+ }
233
+ for (const out of dataflow.out) {
234
+ dataflow.graph.addControlDependency(out.nodeId, rootId, true);
235
+ }
224
236
  }
225
- dataflow.graph.addFile(request.request === 'file' ? request.content : '<inline>');
237
+ data.ctx.files.addConsideredFile(filePath ?? '<inline>');
226
238
  // update our graph with the sourced file's information
227
- const newInformation = { ...information };
228
- newInformation.environment = (0, overwrite_1.overwriteEnvironment)(information.environment, dataflow.environment);
229
- newInformation.graph.mergeWith(dataflow.graph);
230
- // this can be improved, see issue #628
231
- for (const [k, v] of normalized.idMap) {
232
- data.completeAst.idMap.set(k, v);
233
- }
234
239
  return {
235
- ...newInformation,
236
- in: newInformation.in.concat(dataflow.in),
237
- out: newInformation.out.concat(dataflow.out),
238
- unknownReferences: newInformation.unknownReferences.concat(dataflow.unknownReferences),
240
+ ...information,
241
+ environment: (0, overwrite_1.overwriteEnvironment)(information.environment, dataflow.environment),
242
+ graph: information.graph.mergeWith(dataflow.graph),
243
+ in: information.in.concat(dataflow.in),
244
+ out: information.out.concat(dataflow.out),
245
+ unknownReferences: information.unknownReferences.concat(dataflow.unknownReferences),
239
246
  exitPoints: dataflow.exitPoints
240
247
  };
241
248
  }
242
249
  /**
243
250
  * Processes a standalone source file (i.e., not from a source function call)
244
251
  */
245
- function standaloneSourceFile(inputRequest, data, uniqueSourceId, information) {
246
- const path = inputRequest.request === 'file' ? inputRequest.content : '-inline-';
247
- /* this way we can still pass content */
248
- const request = inputRequest.request === 'file' ? sourceProvider.createRequest(inputRequest.content) : inputRequest;
252
+ function standaloneSourceFile(idx, file, data, information) {
249
253
  // check if the sourced file has already been dataflow analyzed, and if so, skip it
250
- if (data.referenceChain.find(e => e.request === request.request && e.content === request.content)) {
251
- logger_1.dataflowLogger.info(`Found loop in dataflow analysis for ${JSON.stringify(request)}: ${JSON.stringify(data.referenceChain)}, skipping further dataflow analysis`);
252
- (0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, uniqueSourceId);
254
+ if (data.referenceChain.find(e => e !== undefined && e === file.filePath)) {
255
+ logger_1.dataflowLogger.info(`Found loop in dataflow analysis for ${JSON.stringify(file.filePath)}: ${JSON.stringify(data.referenceChain)}, skipping further dataflow analysis`);
256
+ (0, unknown_side_effect_1.handleUnknownSideEffect)(information.graph, information.environment, file.root.info.id);
253
257
  return information;
254
258
  }
255
- return sourceRequest(uniqueSourceId, request, {
259
+ return sourceRequest('file-' + idx, file, {
256
260
  ...data,
257
- currentRequest: request,
258
261
  environment: information.environment,
259
- referenceChain: [...data.referenceChain, inputRequest]
260
- }, information, (0, decorate_1.deterministicPrefixIdGenerator)(path + '::' + uniqueSourceId));
262
+ referenceChain: [...data.referenceChain, file.filePath]
263
+ }, information);
261
264
  }
262
265
  //# sourceMappingURL=built-in-source.js.map
@@ -6,7 +6,9 @@ import type { RSymbol } from '../../../../../../r-bridge/lang-4.x/ast/model/node
6
6
  import type { NodeId } from '../../../../../../r-bridge/lang-4.x/ast/model/processing/node-id';
7
7
  import type { ForceArguments } from '../common';
8
8
  /**
9
- *
9
+ * Process a special built-in binary operator, possibly lazily.
10
+ * For example, the logical AND `&&` and OR `||` operators only evaluate their right-hand side if necessary.
11
+ * Please note that this is not (directly) related to R's special binary operators like `%in%`.
10
12
  */
11
13
  export declare function processSpecialBinOp<OtherInfo>(name: RSymbol<OtherInfo & ParentInformation>, args: readonly RFunctionArgument<OtherInfo & ParentInformation>[], rootId: NodeId, data: DataflowProcessorInformation<OtherInfo & ParentInformation>, config: {
12
14
  lazy: boolean;
@@ -5,7 +5,9 @@ const known_call_handling_1 = require("../known-call-handling");
5
5
  const logger_1 = require("../../../../../logger");
6
6
  const edge_1 = require("../../../../../graph/edge");
7
7
  /**
8
- *
8
+ * Process a special built-in binary operator, possibly lazily.
9
+ * For example, the logical AND `&&` and OR `||` operators only evaluate their right-hand side if necessary.
10
+ * Please note that this is not (directly) related to R's special binary operators like `%in%`.
9
11
  */
10
12
  function processSpecialBinOp(name, args, rootId, data, config) {
11
13
  if (!config.lazy) {
@@ -16,7 +16,7 @@ const containers_1 = require("../../../../../../util/containers");
16
16
  */
17
17
  function processVector(name, args, rootId, data) {
18
18
  const fnCall = (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'builtin:vector' });
19
- if (!data.flowrConfig.solver.pointerTracking) {
19
+ if (!data.ctx.config.solver.pointerTracking) {
20
20
  return fnCall.information;
21
21
  }
22
22
  let vectorArgs = [];
@@ -52,7 +52,7 @@ function processVector(name, args, rootId, data) {
52
52
  vectorArgs = vectorArgs.concat(flattenedIndices);
53
53
  }
54
54
  }
55
- if ((0, config_1.isOverPointerAnalysisThreshold)(data.flowrConfig, vectorArgs.length)) {
55
+ if ((0, config_1.isOverPointerAnalysisThreshold)(data.ctx.config, vectorArgs.length)) {
56
56
  return fnCall.information;
57
57
  }
58
58
  const indices = {
@@ -8,11 +8,11 @@ const assert_1 = require("../../../../../../util/assert");
8
8
  const unpack_argument_1 = require("../argument/unpack-argument");
9
9
  const r_function_call_1 = require("../../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
10
10
  const logger_1 = require("../../../../../logger");
11
- const environment_1 = require("../../../../../environments/environment");
12
11
  const edge_1 = require("../../../../../graph/edge");
13
12
  const identifier_1 = require("../../../../../environments/identifier");
14
13
  const general_1 = require("../../../../../eval/values/general");
15
14
  const alias_tracking_1 = require("../../../../../eval/resolve/alias-tracking");
15
+ const reference_to_maybe_1 = require("../../../../../environments/reference-to-maybe");
16
16
  /**
17
17
  *
18
18
  */
@@ -21,13 +21,13 @@ function processWhileLoop(name, args, rootId, data) {
21
21
  logger_1.dataflowLogger.warn(`While-Loop ${name.content} does not have 2 arguments, skipping`);
22
22
  return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information;
23
23
  }
24
- const unpackedArgs = args.map(e => (0, unpack_argument_1.unpackArgument)(e));
24
+ const unpackedArgs = args.map(e => (0, unpack_argument_1.unpackNonameArg)(e));
25
25
  if (unpackedArgs.some(assert_1.isUndefined)) {
26
26
  logger_1.dataflowLogger.warn(`While-Loop ${name.content} has empty arguments in ${JSON.stringify(args)}, skipping`);
27
27
  return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: 'default' }).information;
28
28
  }
29
29
  // we should defer this to the abstract interpretation
30
- const values = (0, alias_tracking_1.resolveIdToValue)(unpackedArgs[0]?.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.flowrConfig.solver.variables });
30
+ const values = (0, alias_tracking_1.resolveIdToValue)(unpackedArgs[0]?.info.id, { environment: data.environment, idMap: data.completeAst.idMap, resolve: data.ctx.config.solver.variables, ctx: data.ctx });
31
31
  const conditionIsAlwaysFalse = (0, general_1.valueSetGuard)(values)?.elements.every(d => d.type === 'logical' && d.value === false) ?? false;
32
32
  //We don't care about the body if it never executes
33
33
  if (conditionIsAlwaysFalse) {
@@ -69,7 +69,7 @@ function processWhileLoop(name, args, rootId, data) {
69
69
  return condition;
70
70
  }
71
71
  const cdTrue = { id: name.info.id, when: true };
72
- const remainingInputs = (0, linker_1.linkInputs)((0, environment_1.makeAllMaybe)(body.unknownReferences, information.graph, information.environment, false, cdTrue).concat((0, environment_1.makeAllMaybe)(body.in, information.graph, information.environment, false, cdTrue)), information.environment, condition.in.concat(condition.unknownReferences), information.graph, true);
72
+ const remainingInputs = (0, linker_1.linkInputs)((0, reference_to_maybe_1.makeAllMaybe)(body.unknownReferences, information.graph, information.environment, false, cdTrue).concat((0, reference_to_maybe_1.makeAllMaybe)(body.in, information.graph, information.environment, false, cdTrue)), information.environment, condition.in.concat(condition.unknownReferences), information.graph, true);
73
73
  (0, linker_1.linkCircularRedefinitionsWithinALoop)(information.graph, (0, linker_1.produceNameSharedIdMap)((0, linker_1.findNonLocalReads)(information.graph, condition.in)), body.out);
74
74
  (0, linker_1.reapplyLoopExitPoints)(body.exitPoints, body.in.concat(body.out, body.unknownReferences));
75
75
  // as the while-loop always evaluates its condition
@@ -77,7 +77,7 @@ function processWhileLoop(name, args, rootId, data) {
77
77
  return {
78
78
  unknownReferences: [],
79
79
  in: [{ nodeId: name.info.id, name: name.lexeme, controlDependencies: originalDependency, type: identifier_1.ReferenceType.Function }, ...remainingInputs],
80
- out: condition.out.concat((0, environment_1.makeAllMaybe)(body.out, information.graph, information.environment, true, cdTrue)),
80
+ out: condition.out.concat((0, reference_to_maybe_1.makeAllMaybe)(body.out, information.graph, information.environment, true, cdTrue)),
81
81
  entryPoint: name.info.id,
82
82
  exitPoints: (0, info_1.filterOutLoopExitPoints)(body.exitPoints),
83
83
  graph: information.graph,
@@ -30,7 +30,7 @@ export interface ProcessAllArgumentResult {
30
30
  readonly processedArguments: (DataflowInformation | undefined)[];
31
31
  }
32
32
  /**
33
- *
33
+ * Processes all arguments for a function call, updating the given final graph and environment.
34
34
  */
35
35
  export declare function processAllArguments<OtherInfo>({ functionName, args, data, finalGraph, functionRootId, forceArgs, patchData }: ProcessAllArgumentInput<OtherInfo>): ProcessAllArgumentResult;
36
36
  export interface PatchFunctionCallInput<OtherInfo> {
@@ -29,8 +29,7 @@ function forceVertexArgumentValueReferences(rootId, value, graph, env) {
29
29
  }
30
30
  }
31
31
  }
32
- const containedSubflowIn = graph.vertices(true)
33
- .filter(([, info]) => (0, vertex_1.isFunctionDefinitionVertex)(info))
32
+ const containedSubflowIn = graph.verticesOfType(vertex_1.VertexType.FunctionDefinition)
34
33
  .flatMap(([, info]) => info.subflow.in)
35
34
  .toArray();
36
35
  // try to resolve them against the current environment
@@ -44,9 +43,9 @@ function forceVertexArgumentValueReferences(rootId, value, graph, env) {
44
43
  }
45
44
  }
46
45
  /**
47
- *
46
+ * Processes all arguments for a function call, updating the given final graph and environment.
48
47
  */
49
- function processAllArguments({ functionName, args, data, finalGraph, functionRootId, forceArgs = [], patchData = d => d }) {
48
+ function processAllArguments({ functionName, args, data, finalGraph, functionRootId, forceArgs = [], patchData }) {
50
49
  let finalEnv = functionName.environment;
51
50
  // arg env contains the environments with other args defined
52
51
  let argEnv = functionName.environment;
@@ -56,7 +55,7 @@ function processAllArguments({ functionName, args, data, finalGraph, functionRoo
56
55
  let i = -1;
57
56
  for (const arg of args) {
58
57
  i++;
59
- data = patchData(data, i);
58
+ data = patchData?.(data, i) ?? data;
60
59
  if (arg === r_function_call_1.EmptyArgument) {
61
60
  callArgs.push(r_function_call_1.EmptyArgument);
62
61
  processedArguments.push(undefined);
@@ -70,7 +69,7 @@ function processAllArguments({ functionName, args, data, finalGraph, functionRoo
70
69
  finalEnv = (0, overwrite_1.overwriteEnvironment)(finalEnv, processed.environment);
71
70
  finalGraph.mergeWith(processed.graph);
72
71
  // resolve reads within argument, we resolve before adding the `processed.environment` to avoid cyclic dependencies
73
- for (const ingoing of [...processed.in, ...processed.unknownReferences]) {
72
+ for (const ingoing of processed.in.concat(processed.unknownReferences)) {
74
73
  // check if it is called directly
75
74
  const vtx = finalGraph.getVertex(ingoing.nodeId);
76
75
  const tryToResolve = ingoing.name ? (0, resolve_by_name_1.resolveByName)(ingoing.name, argEnv, vtx?.tag === vertex_1.VertexType.FunctionCall ? identifier_1.ReferenceType.Function : identifier_1.ReferenceType.Unknown) : undefined;
@@ -122,7 +121,7 @@ function patchFunctionCall({ nextGraph, rootId, name, data, argumentProcessResul
122
121
  args: argumentProcessResult.map(arg => arg === undefined ? r_function_call_1.EmptyArgument : { nodeId: arg.entryPoint, controlDependencies: undefined, call: undefined, type: identifier_1.ReferenceType.Argument }),
123
122
  origin: [origin],
124
123
  link
125
- }, !nextGraph.hasVertex(rootId) || nextGraph.isRoot(rootId), true);
124
+ }, data.ctx.env.makeCleanEnv(), !nextGraph.hasVertex(rootId) || nextGraph.isRoot(rootId), true);
126
125
  for (const arg of argumentProcessResult) {
127
126
  if (arg) {
128
127
  nextGraph.addEdge(rootId, arg.entryPoint, edge_1.EdgeType.Argument);
@@ -3,6 +3,8 @@ import type { DataflowProcessorInformation } from '../../../../processor';
3
3
  import type { ParentInformation } from '../../../../../r-bridge/lang-4.x/ast/model/processing/decorate';
4
4
  import type { RFunctionCall } from '../../../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
5
5
  /**
6
- *
6
+ * Processes a function call, either named or unnamed.
7
+ * @see {@link processNamedCall}
8
+ * @see {@link processUnnamedFunctionCall}
7
9
  */
8
10
  export declare function processFunctionCall<OtherInfo>(functionCall: RFunctionCall<OtherInfo & ParentInformation>, data: DataflowProcessorInformation<OtherInfo & ParentInformation>): DataflowInformation;
@@ -4,7 +4,9 @@ exports.processFunctionCall = processFunctionCall;
4
4
  const named_call_handling_1 = require("./named-call-handling");
5
5
  const unnamed_call_handling_1 = require("./unnamed-call-handling");
6
6
  /**
7
- *
7
+ * Processes a function call, either named or unnamed.
8
+ * @see {@link processNamedCall}
9
+ * @see {@link processUnnamedFunctionCall}
8
10
  */
9
11
  function processFunctionCall(functionCall, data) {
10
12
  if (functionCall.named) {
@@ -36,7 +36,7 @@ function processKnownFunctionCall({ name, args, rootId, data, reverseOrder = fal
36
36
  const finalGraph = new graph_1.DataflowGraph(data.completeAst.idMap);
37
37
  const functionCallName = name.content;
38
38
  (0, log_1.expensiveTrace)(logger_1.dataflowLogger, () => `Processing known function call ${functionCallName} with ${args.length} arguments`);
39
- const processArgs = reverseOrder ? [...args].reverse() : args;
39
+ const processArgs = reverseOrder ? args.toReversed() : args;
40
40
  const { finalEnv, callArgs, remainingReadInArgs, processedArguments } = (0, common_1.processAllArguments)({ functionName, args: processArgs, data, finalGraph, functionRootId: rootId, patchData, forceArgs });
41
41
  if (markAsNSE) {
42
42
  markNonStandardEvaluationEdges(markAsNSE, processedArguments, finalGraph, rootId);
@@ -49,10 +49,10 @@ function processKnownFunctionCall({ name, args, rootId, data, reverseOrder = fal
49
49
  /* will be overwritten accordingly */
50
50
  onlyBuiltin: false,
51
51
  cds: data.controlDependencies,
52
- args: reverseOrder ? [...callArgs].reverse() : callArgs,
52
+ args: reverseOrder ? callArgs.reverse() : callArgs,
53
53
  indicesCollection: indicesCollection,
54
54
  origin: origin === 'default' ? ['function'] : [origin]
55
- });
55
+ }, data.ctx.env.makeCleanEnv());
56
56
  if (hasUnknownSideEffect) {
57
57
  (0, unknown_side_effect_1.handleUnknownSideEffect)(finalGraph, data.environment, rootId);
58
58
  }
@@ -70,7 +70,7 @@ function processKnownFunctionCall({ name, args, rootId, data, reverseOrder = fal
70
70
  entryPoint: rootId,
71
71
  exitPoints: [{ nodeId: rootId, type: 0 /* ExitPointType.Default */, controlDependencies: data.controlDependencies }]
72
72
  },
73
- processedArguments: reverseOrder ? [...processedArguments].reverse() : processedArguments,
73
+ processedArguments: reverseOrder ? processedArguments.reverse() : processedArguments,
74
74
  fnRef
75
75
  };
76
76
  }
@@ -13,13 +13,13 @@ function mergeInformation(info, newInfo) {
13
13
  return newInfo;
14
14
  }
15
15
  return {
16
- unknownReferences: [...info.unknownReferences, ...newInfo.unknownReferences],
17
- in: [...info.in, ...newInfo.in],
18
- out: [...info.out, ...newInfo.out],
16
+ unknownReferences: info.unknownReferences.concat(newInfo.unknownReferences),
17
+ in: info.in.concat(newInfo.in),
18
+ out: info.out.concat(newInfo.out),
19
19
  graph: info.graph.mergeWith(newInfo.graph),
20
20
  environment: (0, append_1.appendEnvironment)(info.environment, newInfo.environment),
21
21
  entryPoint: newInfo.entryPoint,
22
- exitPoints: [...info.exitPoints, ...newInfo.exitPoints],
22
+ exitPoints: info.exitPoints.concat(newInfo.exitPoints),
23
23
  };
24
24
  }
25
25
  function processDefaultFunctionProcessor(information, name, args, rootId, data) {
@@ -45,7 +45,7 @@ function processUnnamedFunctionCall(functionCall, data) {
45
45
  cds: data.controlDependencies,
46
46
  args: callArgs, // same reference
47
47
  origin: [exports.UnnamedFunctionCallOrigin]
48
- });
48
+ }, data.ctx.env.makeCleanEnv());
49
49
  let inIds = remainingReadInArgs;
50
50
  inIds.push({ nodeId: functionRootId, name: functionCallName, controlDependencies: data.controlDependencies, type: identifier_1.ReferenceType.Function });
51
51
  if (functionCall.calledFunction.type === type_1.RType.FunctionDefinition) {
@@ -34,7 +34,7 @@ function processFunctionArgument(argument, data) {
34
34
  tag: vertex_1.VertexType.Use,
35
35
  id: argument.info.id,
36
36
  cds: data.controlDependencies
37
- });
37
+ }, data.ctx.env.makeCleanEnv());
38
38
  entryPoint = argument.info.id;
39
39
  }
40
40
  const ingoingRefs = [...value?.unknownReferences ?? [], ...value?.in ?? [], ...(name === undefined ? [] : [...name.in])];
@@ -23,13 +23,13 @@ function processFunctionParameter(parameter, data) {
23
23
  for (const writtenNode of writtenNodes) {
24
24
  log_1.log.trace(`parameter ${writtenNode.name} (${writtenNode.nodeId}) is defined at id ${writtenNode.definedAt} with ${defaultValue === undefined ? 'no default value' : ' no default value'}`);
25
25
  graph.setDefinitionOfVertex(writtenNode);
26
- environment = (0, define_1.define)(writtenNode, false, environment, data.flowrConfig);
26
+ environment = (0, define_1.define)(writtenNode, false, environment, data.ctx.config);
27
27
  if (defaultValue !== undefined) {
28
28
  if (parameter.defaultValue?.type === type_1.RType.FunctionDefinition) {
29
29
  graph.addEdge(writtenNode, parameter.defaultValue.info.id, edge_1.EdgeType.DefinedBy);
30
30
  }
31
31
  else {
32
- const definedBy = [...defaultValue.in, ...defaultValue.unknownReferences];
32
+ const definedBy = defaultValue.in.concat(defaultValue.unknownReferences);
33
33
  for (const node of definedBy) {
34
34
  graph.addEdge(writtenNode, node, edge_1.EdgeType.DefinedBy);
35
35
  }
@@ -38,8 +38,8 @@ function processFunctionParameter(parameter, data) {
38
38
  }
39
39
  return {
40
40
  unknownReferences: [],
41
- in: defaultValue === undefined ? [] : [...defaultValue.in, ...defaultValue.unknownReferences, ...name.in],
42
- out: [...(defaultValue?.out ?? []), ...name.out, ...name.unknownReferences],
41
+ in: defaultValue === undefined ? [] : defaultValue.in.concat(defaultValue.unknownReferences, name.in),
42
+ out: (defaultValue?.out ?? []).concat(name.out, name.unknownReferences),
43
43
  graph: graph,
44
44
  environment: environment,
45
45
  entryPoint: parameter.info.id,
@@ -22,7 +22,7 @@ function processSymbol(symbol, data) {
22
22
  tag: vertex_1.VertexType.Use,
23
23
  id: symbol.info.id,
24
24
  cds: data.controlDependencies
25
- }),
25
+ }, data.ctx.env.makeCleanEnv()),
26
26
  entryPoint: symbol.info.id,
27
27
  exitPoints: [{ nodeId: symbol.info.id, type: 0 /* ExitPointType.Default */, controlDependencies: data.controlDependencies }]
28
28
  };
@@ -4,4 +4,4 @@ import type { RNodeWithParent } from '../../../r-bridge/lang-4.x/ast/model/proce
4
4
  /**
5
5
  *
6
6
  */
7
- export declare function processValue<OtherInfo>({ info: { id } }: RNodeWithParent, data: DataflowProcessorInformation<OtherInfo>): DataflowInformation;
7
+ export declare function processValue<OtherInfo>({ info: { id } }: RNodeWithParent, { controlDependencies, completeAst: { idMap }, ctx: { env }, environment }: DataflowProcessorInformation<OtherInfo>): DataflowInformation;
@@ -7,18 +7,18 @@ const identifier_1 = require("../../environments/identifier");
7
7
  /**
8
8
  *
9
9
  */
10
- function processValue({ info: { id } }, data) {
10
+ function processValue({ info: { id } }, { controlDependencies, completeAst: { idMap }, ctx: { env }, environment }) {
11
11
  return {
12
12
  unknownReferences: [],
13
- in: [{ nodeId: id, name: undefined, controlDependencies: data.controlDependencies, type: identifier_1.ReferenceType.Constant }],
13
+ in: [{ nodeId: id, name: undefined, controlDependencies, type: identifier_1.ReferenceType.Constant }],
14
14
  out: [],
15
- environment: data.environment,
16
- graph: new graph_1.DataflowGraph(data.completeAst.idMap).addVertex({
15
+ environment,
16
+ graph: new graph_1.DataflowGraph(idMap).addVertex({
17
17
  tag: vertex_1.VertexType.Value,
18
18
  id: id,
19
- cds: data.controlDependencies
20
- }),
21
- exitPoints: [{ nodeId: id, type: 0 /* ExitPointType.Default */, controlDependencies: data.controlDependencies }],
19
+ cds: controlDependencies
20
+ }, env.makeCleanEnv()),
21
+ exitPoints: [{ nodeId: id, type: 0 /* ExitPointType.Default */, controlDependencies }],
22
22
  entryPoint: id
23
23
  };
24
24
  }
@@ -14,6 +14,6 @@ import type { DataflowGraph } from '../graph/graph';
14
14
  * @example getAllRefsToSymbol('3\@y') returns ['3\@y', '4\@y']
15
15
  * @param graph - Dataflow Graph
16
16
  * @param nodeId - NodeId of Symbol to resolve
17
- * @returns List including the Definitions and Refereneces to that definition
17
+ * @returns List including the Definitions and References to that definition
18
18
  */
19
19
  export declare function getAllRefsToSymbol(graph: DataflowGraph, nodeId: NodeId): NodeId[] | undefined;
@@ -18,7 +18,7 @@ const dfg_get_origin_1 = require("./dfg-get-origin");
18
18
  * @example getAllRefsToSymbol('3\@y') returns ['3\@y', '4\@y']
19
19
  * @param graph - Dataflow Graph
20
20
  * @param nodeId - NodeId of Symbol to resolve
21
- * @returns List including the Definitions and Refereneces to that definition
21
+ * @returns List including the Definitions and References to that definition
22
22
  */
23
23
  function getAllRefsToSymbol(graph, nodeId) {
24
24
  // Get all origins and filter for ones that happen for sure