@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
@@ -519,16 +519,16 @@ const DataFrameFunctionParamsMapper = {
519
519
  };
520
520
  /**
521
521
  * Maps a concrete data frame function call to abstract data frame operations.
522
- * @param node - The R node of the function call
523
- * @param dfg - The data flow graph for resolving the arguments
524
- * @param config - The flowR configuration to use
522
+ * @param node - The R node of the function call
523
+ * @param dfg - The data flow graph for resolving the arguments
524
+ * @param ctx - The current flowR analyzer context
525
525
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame function call
526
526
  */
527
- function mapDataFrameFunctionCall(node, dfg, config) {
527
+ function mapDataFrameFunctionCall(node, dfg, ctx) {
528
528
  if (node.type !== type_1.RType.FunctionCall || !node.named) {
529
529
  return;
530
530
  }
531
- const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias };
531
+ const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias, ctx };
532
532
  let operations;
533
533
  if (isDataFrameFunction(node.functionName.content)) {
534
534
  const functionName = node.functionName.content;
@@ -539,7 +539,7 @@ function mapDataFrameFunctionCall(node, dfg, config) {
539
539
  operations = [{ operation: 'unknown', operand: undefined }];
540
540
  }
541
541
  else {
542
- operations = mapper(args, params, resolveInfo, config);
542
+ operations = mapper(args, params, resolveInfo, ctx);
543
543
  }
544
544
  }
545
545
  else {
@@ -605,10 +605,10 @@ function mapDataFrameConvert(args, params, info) {
605
605
  operand: dataFrame.value.info.id
606
606
  }];
607
607
  }
608
- function mapDataFrameRead(args, params, info, config) {
608
+ function mapDataFrameRead(args, params, info, ctx) {
609
609
  const fileNameArg = (0, arguments_1.getFunctionArgument)(args, params.fileName, info);
610
610
  const textArg = params.text ? (0, arguments_1.getFunctionArgument)(args, params.text, info) : undefined;
611
- const { source, request } = getRequestFromRead(fileNameArg, textArg, params, info, config);
611
+ const { source, request } = getRequestFromRead(fileNameArg, textArg, params, info, ctx);
612
612
  const header = (0, arguments_1.getArgumentValue)(args, params.header, info);
613
613
  const separator = (0, arguments_1.getArgumentValue)(args, params.separator, info);
614
614
  const quote = (0, arguments_1.getArgumentValue)(args, params.quote, info);
@@ -618,7 +618,7 @@ function mapDataFrameRead(args, params, info, config) {
618
618
  const noDupNames = (0, arguments_1.getArgumentValue)(args, params.noDupNames, info);
619
619
  const validArguments = typeof header === 'boolean' && typeof separator === 'string' && typeof quote === 'string' && typeof comment === 'string' &&
620
620
  typeof skipLines === 'number' && typeof checkNames === 'boolean' && typeof noDupNames === 'boolean';
621
- if (request === undefined || !config.abstractInterpretation.dataFrame.readLoadedData.readExternalFiles || !validArguments) {
621
+ if (request === undefined || !ctx.config.abstractInterpretation.dataFrame.readLoadedData.readExternalFiles || !validArguments) {
622
622
  return [{
623
623
  operation: 'read',
624
624
  operand: undefined,
@@ -643,7 +643,7 @@ function mapDataFrameRead(args, params, info, config) {
643
643
  }
644
644
  }
645
645
  };
646
- const allLines = parseRequestContent(request, parseLine, config.abstractInterpretation.dataFrame.readLoadedData.maxReadLines);
646
+ const allLines = parseRequestContent(request, parseLine, ctx.config.abstractInterpretation.dataFrame.readLoadedData.maxReadLines);
647
647
  let colnames;
648
648
  if (header) {
649
649
  colnames = (0, arguments_1.filterValidNames)(firstLine, checkNames, noDupNames, params.noEmptyNames);
@@ -946,20 +946,20 @@ function mapDataFrameMutate(args, params, info) {
946
946
  columns: accessedNames
947
947
  });
948
948
  }
949
- if (deletedCols === undefined || deletedCols.length > 0) {
949
+ if (mutatedCols === undefined || mutatedCols.length > 0 || deletedCols?.length === 0) {
950
950
  result.push({
951
- operation: 'removeCols',
951
+ operation: 'mutateCols',
952
952
  operand: operand?.info.id,
953
- colnames: deletedCols,
954
- options: { maybe: true }
953
+ colnames: mutatedCols
955
954
  });
956
955
  operand = undefined;
957
956
  }
958
- if (mutatedCols === undefined || mutatedCols.length > 0 || deletedCols?.length === 0) {
957
+ if (deletedCols === undefined || deletedCols.length > 0) {
959
958
  result.push({
960
- operation: 'mutateCols',
959
+ operation: 'removeCols',
961
960
  operand: operand?.info.id,
962
- colnames: mutatedCols
961
+ colnames: deletedCols,
962
+ options: { maybe: true }
963
963
  });
964
964
  operand = undefined;
965
965
  }
@@ -1002,8 +1002,11 @@ function mapDataFrameSummarize(args, params, info) {
1002
1002
  }
1003
1003
  const result = [];
1004
1004
  const summarizeArgs = args.filter(arg => arg !== dataFrame);
1005
- const accessedNames = summarizeArgs.flatMap(arg => (0, arguments_1.getUnresolvedSymbolsInExpression)(arg, info.graph));
1006
1005
  const summarizedCols = summarizeArgs.map(arg => (0, resolve_args_1.resolveIdToArgName)(arg, info));
1006
+ // only column names that are not created by summarize are preconditions on the operand
1007
+ const accessedNames = summarizeArgs
1008
+ .flatMap(arg => (0, arguments_1.getUnresolvedSymbolsInExpression)(arg, info.graph))
1009
+ .filter(arg => !summarizedCols.includes(arg));
1007
1010
  if (accessedNames.length > 0) {
1008
1011
  result.push({
1009
1012
  operation: 'accessCols',
@@ -1018,7 +1021,7 @@ function mapDataFrameSummarize(args, params, info) {
1018
1021
  });
1019
1022
  return result;
1020
1023
  }
1021
- function mapDataFrameJoin(args, params, info, config) {
1024
+ function mapDataFrameJoin(args, params, info, ctx) {
1022
1025
  const dataFrame = (0, arguments_1.getFunctionArgument)(args, params.dataFrame, info);
1023
1026
  const joinAll = (0, arguments_1.getArgumentValue)(args, params.joinAll, info);
1024
1027
  const joinLeft = (0, arguments_1.getArgumentValue)(args, params.joinLeft, info);
@@ -1035,7 +1038,7 @@ function mapDataFrameJoin(args, params, info, config) {
1035
1038
  const result = [];
1036
1039
  const otherArg = (0, arguments_1.getFunctionArgument)(args, params.otherDataFrame, info);
1037
1040
  const byArg = (0, arguments_1.getFunctionArgument)(args, params.by, info);
1038
- const otherDataFrame = (0, shape_inference_1.resolveIdToDataFrameShape)(otherArg, info.graph) ?? dataframe_domain_1.DataFrameDomain.top(config.abstractInterpretation.dataFrame.maxColNames);
1041
+ const otherDataFrame = (0, shape_inference_1.resolveIdToDataFrameShape)(otherArg, info.graph) ?? dataframe_domain_1.DataFrameDomain.top(ctx.config.abstractInterpretation.dataFrame.maxColNames);
1039
1042
  let byCols;
1040
1043
  const joinType = getJoinType(joinAll, joinLeft, joinRight);
1041
1044
  if (byArg !== undefined) {
@@ -1101,19 +1104,19 @@ function mapDataFrameUnknown(args, params, info) {
1101
1104
  ...(params.constraintType !== undefined ? { type: params.constraintType } : {})
1102
1105
  }];
1103
1106
  }
1104
- function getRequestFromRead(fileNameArg, textArg, params, info, config) {
1107
+ function getRequestFromRead(fileNameArg, textArg, params, info, ctx) {
1105
1108
  let source;
1106
1109
  let request;
1107
1110
  if (fileNameArg !== undefined && fileNameArg !== r_function_call_1.EmptyArgument) {
1108
1111
  const fileName = (0, resolve_args_1.resolveIdToArgValue)(fileNameArg, info);
1109
1112
  if (typeof fileName === 'string') {
1110
1113
  source = fileName;
1111
- const referenceChain = fileNameArg.info.file ? [(0, retriever_1.requestFromInput)(`file://${fileNameArg.info.file}`)] : [];
1112
- const sources = (0, built_in_source_1.findSource)(config.solver.resolveSource, fileName, { referenceChain });
1114
+ const referenceChain = fileNameArg.info.file ? [fileNameArg.info.file] : [];
1115
+ const sources = (0, built_in_source_1.findSource)(ctx.config.solver.resolveSource, fileName, { referenceChain, ctx });
1113
1116
  if (sources?.length === 1) {
1114
1117
  source = sources[0];
1115
1118
  // create request from resolved source file path
1116
- request = (0, built_in_source_1.getSourceProvider)().createRequest(source);
1119
+ request = { request: 'file', content: sources[0] };
1117
1120
  }
1118
1121
  else if (params.text === undefined && (0, resolve_args_1.unescapeSpecialChars)(fileName).includes('\n')) {
1119
1122
  // create request from string if file name argument contains newline
@@ -1128,6 +1131,7 @@ function getRequestFromRead(fileNameArg, textArg, params, info, config) {
1128
1131
  request = (0, retriever_1.requestFromInput)((0, resolve_args_1.unescapeSpecialChars)(text));
1129
1132
  }
1130
1133
  }
1134
+ request = request ? ctx.files.resolveRequest(request).r : undefined;
1131
1135
  return { source, request };
1132
1136
  }
1133
1137
  function parseRequestContent(request, parser, maxLines) {
@@ -2,10 +2,12 @@ import type { DataflowGraph } from '../../../dataflow/graph/graph';
2
2
  import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
3
3
  import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
4
4
  import type { DataFrameExpressionInfo } from '../absint-info';
5
+ import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
5
6
  /**
6
7
  * Maps a concrete data frame replacement function to abstract data frame operations.
7
8
  * @param node - The R node of the replacement function
8
9
  * @param dfg - The data flow graph for resolving the arguments
10
+ * @param ctx - The read-only Flowr analysis context
9
11
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame replacement function
10
12
  */
11
- export declare function mapDataFrameReplacementFunction(node: RNode<ParentInformation>, expression: RNode<ParentInformation>, dfg: DataflowGraph): DataFrameExpressionInfo | undefined;
13
+ export declare function mapDataFrameReplacementFunction(node: RNode<ParentInformation>, expression: RNode<ParentInformation>, dfg: DataflowGraph, ctx: ReadOnlyFlowrAnalyzerContext): DataFrameExpressionInfo | undefined;
@@ -21,11 +21,12 @@ const DataFrameReplacementFunctionMapper = {
21
21
  * Maps a concrete data frame replacement function to abstract data frame operations.
22
22
  * @param node - The R node of the replacement function
23
23
  * @param dfg - The data flow graph for resolving the arguments
24
+ * @param ctx - The read-only Flowr analysis context
24
25
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame replacement function
25
26
  */
26
- function mapDataFrameReplacementFunction(node, expression, dfg) {
27
+ function mapDataFrameReplacementFunction(node, expression, dfg, ctx) {
27
28
  const parent = hasParentReplacement(node, dfg) ? dfg.idMap?.get(node.info.parent) : undefined;
28
- const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias };
29
+ const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias, ctx };
29
30
  let operations;
30
31
  if (node.type === type_1.RType.Access) {
31
32
  if (node.access.every(arg => arg === r_function_call_1.EmptyArgument)) {
@@ -70,7 +70,7 @@ function getConstraintType(operation) {
70
70
  return DataFrameSemanticsMapper[operation].type;
71
71
  }
72
72
  function applyCreateSemantics(value, { colnames, rows }) {
73
- const colnamesValue = colnames?.every(assert_1.isNotUndefined) ? colnames : lattice_1.Top;
73
+ const colnamesValue = setRange(colnames);
74
74
  const colsValue = colnames !== undefined ? [colnames.length, colnames.length] : positive_interval_domain_1.PosIntervalTop;
75
75
  const rowsValue = Array.isArray(rows) ? rows : typeof rows === 'number' ? [rows, rows] : positive_interval_domain_1.PosIntervalTop;
76
76
  return new dataframe_domain_1.DataFrameDomain({
@@ -85,7 +85,7 @@ function applyReadSemantics(value, { colnames, rows }) {
85
85
  function applyAccessColsSemantics(value, { columns }) {
86
86
  if (columns?.every(col => typeof col === 'string')) {
87
87
  return new dataframe_domain_1.DataFrameDomain({
88
- colnames: value.colnames.join(columns),
88
+ colnames: value.colnames.union(setRange(columns)),
89
89
  cols: value.cols,
90
90
  rows: value.rows
91
91
  });
@@ -93,7 +93,7 @@ function applyAccessColsSemantics(value, { columns }) {
93
93
  else if (columns?.every(col => typeof col === 'number')) {
94
94
  return new dataframe_domain_1.DataFrameDomain({
95
95
  colnames: value.colnames,
96
- cols: columns?.reduce((current, col) => current.max([col, col]), value.cols),
96
+ cols: columns.reduce((current, col) => current.max([col, col]), value.cols),
97
97
  rows: value.rows
98
98
  });
99
99
  }
@@ -113,21 +113,21 @@ function applyAssignColsSemantics(value, { columns }) {
113
113
  if (columns?.every(col => typeof col === 'string')) {
114
114
  const cols = columns.length;
115
115
  return new dataframe_domain_1.DataFrameDomain({
116
- colnames: value.colnames.join(columns),
116
+ colnames: value.colnames.union(setRange(columns)),
117
117
  cols: value.cols.add([0, cols]).max([cols, cols]),
118
118
  rows: value.rows
119
119
  });
120
120
  }
121
121
  else if (columns?.every(col => typeof col === 'number')) {
122
122
  return new dataframe_domain_1.DataFrameDomain({
123
- colnames: value.colnames.top(),
123
+ colnames: value.colnames.widenUp(),
124
124
  cols: columns.reduce((current, col) => current.max([col, col]), value.cols),
125
125
  rows: value.rows
126
126
  });
127
127
  }
128
128
  return new dataframe_domain_1.DataFrameDomain({
129
- colnames: value.colnames.top(),
130
- cols: value.cols.extendUp(),
129
+ colnames: value.colnames.widenUp(),
130
+ cols: value.cols.widenUp(),
131
131
  rows: value.rows
132
132
  });
133
133
  }
@@ -142,49 +142,57 @@ function applyAssignRowsSemantics(value, { rows }) {
142
142
  return new dataframe_domain_1.DataFrameDomain({
143
143
  colnames: value.colnames,
144
144
  cols: value.cols,
145
- rows: value.rows.extendUp()
145
+ rows: value.rows.widenUp()
146
146
  });
147
147
  }
148
148
  function applySetColNamesSemantics(value, { colnames }, options) {
149
149
  if (options?.partial) {
150
150
  return new dataframe_domain_1.DataFrameDomain({
151
- colnames: colnames?.every(assert_1.isNotUndefined) ? value.colnames.join(colnames) : value.colnames.top(),
151
+ colnames: value.colnames.widenDown().union(setRange(colnames)),
152
152
  cols: value.cols,
153
153
  rows: value.rows
154
154
  });
155
155
  }
156
156
  const allColNames = colnames?.every(assert_1.isNotUndefined) && value.cols.value !== lattice_1.Bottom && colnames.length >= value.cols.value[1];
157
157
  return new dataframe_domain_1.DataFrameDomain({
158
- colnames: allColNames ? value.colnames.create(colnames) : value.colnames.top(),
158
+ colnames: allColNames ? value.colnames.create(setRange(colnames)) : value.colnames.widenDown().union(setRange(colnames)).widenUp(),
159
159
  cols: value.cols,
160
160
  rows: value.rows
161
161
  });
162
162
  }
163
163
  function applyAddColsSemantics(value, { colnames }) {
164
164
  return new dataframe_domain_1.DataFrameDomain({
165
- colnames: colnames?.every(assert_1.isNotUndefined) ? value.colnames.join(colnames) : value.colnames.top(),
166
- cols: colnames !== undefined ? value.cols.add([colnames.length, colnames.length]) : value.cols.extendUp(),
165
+ colnames: colnames !== undefined ? value.colnames.union(setRange(colnames)) : value.colnames.widenUp(),
166
+ cols: colnames !== undefined ? value.cols.add([colnames.length, colnames.length]) : value.cols.widenUp(),
167
167
  rows: value.rows
168
168
  });
169
169
  }
170
170
  function applyAddRowsSemantics(value, { rows }) {
171
+ if (value.cols.value !== lattice_1.Bottom && value.cols.value[0] === 0) {
172
+ return new dataframe_domain_1.DataFrameDomain({
173
+ ...value,
174
+ colnames: value.colnames.top(),
175
+ cols: rows !== undefined ? value.cols.add([1, 1]) : value.cols.top(),
176
+ rows: rows !== undefined ? value.rows.add([rows, rows]) : value.rows.widenUp()
177
+ });
178
+ }
171
179
  return new dataframe_domain_1.DataFrameDomain({
172
180
  colnames: value.colnames,
173
181
  cols: value.cols,
174
- rows: rows !== undefined ? value.rows.add([rows, rows]) : value.rows.extendUp()
182
+ rows: rows !== undefined ? value.rows.add([rows, rows]) : value.rows.widenUp()
175
183
  });
176
184
  }
177
185
  function applyRemoveColsSemantics(value, { colnames }, options) {
178
186
  if (options?.maybe) {
179
187
  return new dataframe_domain_1.DataFrameDomain({
180
- colnames: colnames !== undefined ? value.colnames.subtract(colnames.filter(assert_1.isNotUndefined)) : value.colnames,
181
- cols: colnames !== undefined ? value.cols.subtract([colnames.length, 0]) : value.cols.extendDown(),
188
+ colnames: colnames !== undefined ? value.colnames.subtract(setRange(colnames)) : value.colnames.widenDown(),
189
+ cols: colnames !== undefined ? value.cols.subtract([colnames.length, 0]) : value.cols.widenDown(),
182
190
  rows: value.rows
183
191
  });
184
192
  }
185
193
  return new dataframe_domain_1.DataFrameDomain({
186
- colnames: colnames !== undefined ? value.colnames.subtract(colnames.filter(assert_1.isNotUndefined)) : value.colnames,
187
- cols: colnames !== undefined ? value.cols.subtract([colnames.length, colnames.length]) : value.cols.extendDown(),
194
+ colnames: colnames !== undefined ? value.colnames.subtract(setRange(colnames)) : value.colnames.widenDown(),
195
+ cols: colnames !== undefined ? value.cols.subtract([colnames.length, colnames.length]) : value.cols.widenDown(),
188
196
  rows: value.rows
189
197
  });
190
198
  }
@@ -193,18 +201,18 @@ function applyRemoveRowsSemantics(value, { rows }, options) {
193
201
  return new dataframe_domain_1.DataFrameDomain({
194
202
  colnames: value.colnames,
195
203
  cols: value.cols,
196
- rows: rows !== undefined ? value.rows.subtract([rows, 0]) : value.rows.extendDown()
204
+ rows: rows !== undefined ? value.rows.subtract([rows, 0]) : value.rows.widenDown()
197
205
  });
198
206
  }
199
207
  return new dataframe_domain_1.DataFrameDomain({
200
208
  colnames: value.colnames,
201
209
  cols: value.cols,
202
- rows: rows !== undefined ? value.rows.subtract([rows, rows]) : value.rows.extendDown()
210
+ rows: rows !== undefined ? value.rows.subtract([rows, rows]) : value.rows.widenDown()
203
211
  });
204
212
  }
205
213
  function applyConcatColsSemantics(value, { other }) {
206
214
  return new dataframe_domain_1.DataFrameDomain({
207
- colnames: value.colnames.join(other.colnames),
215
+ colnames: value.colnames.union(other.colnames),
208
216
  cols: value.cols.add(other.cols),
209
217
  rows: value.rows
210
218
  });
@@ -235,13 +243,13 @@ function applySubsetColsSemantics(value, { colnames }, options) {
235
243
  else if (options?.renamedCols) {
236
244
  return new dataframe_domain_1.DataFrameDomain({
237
245
  colnames: value.colnames.top(),
238
- cols: colnames !== undefined ? value.cols.min([colnames.length, colnames.length]) : value.cols.extendDown(),
246
+ cols: colnames !== undefined ? value.cols.min([colnames.length, colnames.length]) : value.cols.widenDown(),
239
247
  rows: value.rows
240
248
  });
241
249
  }
242
250
  return new dataframe_domain_1.DataFrameDomain({
243
- colnames: colnames?.every(assert_1.isNotUndefined) ? value.colnames.meet(colnames) : value.colnames,
244
- cols: colnames !== undefined ? value.cols.min([colnames.length, colnames.length]) : value.cols.extendDown(),
251
+ colnames: colnames !== undefined ? value.colnames.intersect(setRange(colnames)) : value.colnames.widenDown(),
252
+ cols: colnames !== undefined ? value.cols.min([colnames.length, colnames.length]) : value.cols.widenDown(),
245
253
  rows: value.rows
246
254
  });
247
255
  }
@@ -256,27 +264,27 @@ function applySubsetRowsSemantics(value, { rows }, options) {
256
264
  return new dataframe_domain_1.DataFrameDomain({
257
265
  colnames: value.colnames,
258
266
  cols: value.cols,
259
- rows: rows !== undefined ? value.rows.min([rows, rows]) : value.rows.extendDown()
267
+ rows: rows !== undefined ? value.rows.min([rows, rows]) : value.rows.widenDown()
260
268
  });
261
269
  }
262
270
  function applyFilterRowsSemantics(value, { condition }) {
263
271
  return new dataframe_domain_1.DataFrameDomain({
264
272
  colnames: value.colnames,
265
273
  cols: value.cols,
266
- rows: condition ? value.rows : condition === false ? value.rows.create([0, 0]) : value.rows.extendDown()
274
+ rows: condition ? value.rows : condition === false ? value.rows.create([0, 0]) : value.rows.widenDown()
267
275
  });
268
276
  }
269
277
  function applyMutateColsSemantics(value, { colnames }) {
270
278
  return new dataframe_domain_1.DataFrameDomain({
271
- colnames: colnames?.every(assert_1.isNotUndefined) ? value.colnames.join(colnames) : value.colnames.top(),
272
- cols: colnames !== undefined ? value.cols.add([0, colnames.length]).max([colnames.length, colnames.length]) : value.cols.extendUp(),
279
+ colnames: colnames !== undefined ? value.colnames.union(setRange(colnames)) : value.colnames.widenUp(),
280
+ cols: colnames !== undefined ? value.cols.add([0, colnames.length]).max([colnames.length, colnames.length]) : value.cols.widenUp(),
273
281
  rows: value.rows
274
282
  });
275
283
  }
276
284
  function applyGroupBySemantics(value, { by }, options) {
277
285
  if (options?.mutatedCols) {
278
286
  return new dataframe_domain_1.DataFrameDomain({
279
- colnames: by.every(assert_1.isNotUndefined) ? value.colnames.join(by) : value.colnames.top(),
287
+ colnames: value.colnames.union(setRange(by)),
280
288
  cols: value.cols.add([0, by.length]),
281
289
  rows: value.rows
282
290
  });
@@ -286,8 +294,8 @@ function applyGroupBySemantics(value, { by }, options) {
286
294
  }
287
295
  function applySummarizeSemantics(value, { colnames }) {
288
296
  return new dataframe_domain_1.DataFrameDomain({
289
- colnames: colnames?.every(assert_1.isNotUndefined) ? value.colnames.join(colnames) : value.colnames.top(),
290
- cols: colnames !== undefined ? value.cols.add([0, colnames.length]).min([colnames.length, +Infinity]) : value.cols.extendUp(),
297
+ colnames: colnames !== undefined ? value.colnames.join(setRange([])).union(setRange(colnames)) : value.colnames.widenUp(),
298
+ cols: colnames !== undefined ? value.cols.add([0, colnames.length]).min([colnames.length, +Infinity]) : value.cols.widenUp(),
291
299
  rows: value.rows.min([1, +Infinity]).max([0, 1])
292
300
  });
293
301
  }
@@ -310,35 +318,36 @@ function applyJoinSemantics(value, { other, by }, options) {
310
318
  return new positive_interval_domain_1.PosIntervalDomain([lower.value[0], interval1.value[1] * interval2.value[1]]);
311
319
  }
312
320
  };
313
- const commonCols = value.colnames.meet(other.colnames);
314
- let duplicateCols; // whether columns may be renamed due to occurrence in both data frames
321
+ let duplicateCols; // columns that may be renamed due to occurring in both data frames
315
322
  let productRows; // whether the resulting rows may be a Cartesian product of the rows of the data frames
316
323
  if (options?.natural) {
317
- duplicateCols = false;
318
- productRows = commonCols.isValue() && commonCols.value.size === 0;
324
+ const commonCols = value.colnames.intersect(other.colnames).upper();
325
+ duplicateCols = [];
326
+ productRows = commonCols !== lattice_1.Bottom && commonCols !== lattice_1.Top && commonCols.size === 0;
319
327
  }
320
328
  else if (by === undefined) {
321
- duplicateCols = true;
329
+ duplicateCols = undefined;
322
330
  productRows = true;
323
331
  }
324
332
  else if (by.length === 0) {
325
- duplicateCols = commonCols.isTop() || (commonCols.isValue() && commonCols.value.size > 0);
333
+ const commonCols = value.colnames.intersect(other.colnames).upper();
334
+ duplicateCols = commonCols !== lattice_1.Bottom ? commonCols !== lattice_1.Top ? [...commonCols] : undefined : [];
326
335
  productRows = true;
327
336
  }
328
337
  else if (by.every(assert_1.isNotUndefined)) {
329
- const remainingCols = commonCols.subtract(by);
330
- duplicateCols = remainingCols.isTop() || (remainingCols.isValue() && remainingCols.value.size > 0);
338
+ const remainingCols = value.colnames.intersect(other.colnames).subtract(setRange(by)).upper();
339
+ duplicateCols = remainingCols !== lattice_1.Bottom ? remainingCols !== lattice_1.Top ? [...remainingCols] : undefined : [];
331
340
  productRows = false;
332
341
  }
333
342
  else {
334
- duplicateCols = true;
343
+ duplicateCols = undefined;
335
344
  productRows = false;
336
345
  }
337
346
  const joinType = options?.join ?? 'inner';
338
347
  let rows;
339
348
  switch (joinType) {
340
349
  case 'inner':
341
- rows = value.rows.min(other.rows).extendDown();
350
+ rows = value.rows.min(other.rows).widenDown();
342
351
  break;
343
352
  case 'left':
344
353
  rows = value.rows;
@@ -354,7 +363,7 @@ function applyJoinSemantics(value, { other, by }, options) {
354
363
  }
355
364
  return new dataframe_domain_1.DataFrameDomain({
356
365
  ...value,
357
- colnames: duplicateCols ? value.colnames.top() : value.colnames.join(other.colnames),
366
+ colnames: duplicateCols === undefined ? value.colnames.top() : duplicateCols.length > 0 ? value.colnames.union(other.colnames).subtract(setRange(duplicateCols)).widenUp() : value.colnames.union(other.colnames),
358
367
  cols: by !== undefined ? value.cols.add(other.cols).subtract([by.length, by.length]) : mergeInterval(value.cols, other.cols),
359
368
  rows: productRows ? productInterval(rows, value.rows, other.rows) : rows
360
369
  });
@@ -369,4 +378,8 @@ function applyUnknownSemantics(value,
369
378
  _args) {
370
379
  return value.top();
371
380
  }
381
+ function setRange(colnames) {
382
+ const names = colnames?.filter(assert_1.isNotUndefined) ?? [];
383
+ return { min: names, range: names.length === colnames?.length ? [] : lattice_1.Top };
384
+ }
372
385
  //# sourceMappingURL=semantics.js.map
@@ -1,6 +1,6 @@
1
- import type { FlowrConfigOptions } from '../../config';
2
1
  import { type ControlFlowInformation } from '../../control-flow/control-flow-graph';
3
2
  import type { DataflowGraph } from '../../dataflow/graph/graph';
3
+ import type { ReadOnlyFlowrAnalyzerContext } from '../../project/context/flowr-analyzer-context';
4
4
  import type { RNode } from '../../r-bridge/lang-4.x/ast/model/model';
5
5
  import type { NormalizedAst, ParentInformation } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
6
6
  import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
@@ -12,11 +12,11 @@ import { type DataFrameDomain, DataFrameStateDomain } from './dataframe-domain';
12
12
  * @param cfinfo - The control flow information containing the control flow graph
13
13
  * @param dfg - The data flow graph to resolve variable origins and function arguments
14
14
  * @param ast - The abstract syntax tree to resolve node IDs to AST nodes
15
- * @param config - The flowR configuration to use for the shape inference
15
+ * @param ctx - The current flowr analyzer context
16
16
  * @returns The abstract data frame state at the exit node of the control flow graph (see {@link DataFrameStateDomain}).
17
17
  * The abstract data frame states for all other nodes are attached to the AST.
18
18
  */
19
- export declare function inferDataFrameShapes(cfinfo: ControlFlowInformation, dfg: DataflowGraph, ast: NormalizedAst<ParentInformation & AbstractInterpretationInfo>, config: FlowrConfigOptions): DataFrameStateDomain;
19
+ export declare function inferDataFrameShapes(cfinfo: ControlFlowInformation, dfg: DataflowGraph, ast: NormalizedAst<ParentInformation & AbstractInterpretationInfo>, ctx: ReadOnlyFlowrAnalyzerContext): DataFrameStateDomain;
20
20
  /**
21
21
  * Resolves the abstract data frame shape of a node in the AST.
22
22
  * This requires that the data frame shape inference has been executed before using {@link inferDataFrameShapes}.
@@ -19,12 +19,12 @@ const dataframe_domain_1 = require("./dataframe-domain");
19
19
  * @param cfinfo - The control flow information containing the control flow graph
20
20
  * @param dfg - The data flow graph to resolve variable origins and function arguments
21
21
  * @param ast - The abstract syntax tree to resolve node IDs to AST nodes
22
- * @param config - The flowR configuration to use for the shape inference
22
+ * @param ctx - The current flowr analyzer context
23
23
  * @returns The abstract data frame state at the exit node of the control flow graph (see {@link DataFrameStateDomain}).
24
24
  * The abstract data frame states for all other nodes are attached to the AST.
25
25
  */
26
- function inferDataFrameShapes(cfinfo, dfg, ast, config) {
27
- const visitor = new absint_visitor_1.DataFrameShapeInferenceVisitor({ controlFlow: cfinfo, dfg: dfg, normalizedAst: ast, flowrConfig: config });
26
+ function inferDataFrameShapes(cfinfo, dfg, ast, ctx) {
27
+ const visitor = new absint_visitor_1.DataFrameShapeInferenceVisitor({ controlFlow: cfinfo, dfg: dfg, normalizedAst: ast, ctx });
28
28
  visitor.start();
29
29
  const exitPoints = cfinfo.exitPoints.map(id => cfinfo.graph.getVertex(id)).filter(assert_1.isNotUndefined);
30
30
  const exitNodes = exitPoints.map(vertex => ast.idMap.get((0, control_flow_graph_1.getVertexRootId)(vertex))).filter(assert_1.isNotUndefined);
@@ -5,6 +5,7 @@ import { type Lattice, Top } from './lattice';
5
5
  export declare const DEFAULT_INFERENCE_LIMIT = 50;
6
6
  /**
7
7
  * An abstract domain as complete lattice with a widening operator, narrowing operator, concretization function, and abstraction function.
8
+ * All operations of value abstract domains should not modify the domain in-place but return new values using {@link create}.
8
9
  * @template Concrete - Type of an concrete element of the concrete domain for the abstract domain
9
10
  * @template Abstract - Type of an abstract element of the abstract domain representing possible elements (excludes `Top` and `Bot`)
10
11
  * @template Top - Type of the Top element of the abstract domain representing all possible elements
@@ -11,6 +11,7 @@ const lattice_1 = require("./lattice");
11
11
  exports.DEFAULT_INFERENCE_LIMIT = 50;
12
12
  /**
13
13
  * An abstract domain as complete lattice with a widening operator, narrowing operator, concretization function, and abstraction function.
14
+ * All operations of value abstract domains should not modify the domain in-place but return new values using {@link create}.
14
15
  * @template Concrete - Type of an concrete element of the concrete domain for the abstract domain
15
16
  * @template Abstract - Type of an abstract element of the abstract domain representing possible elements (excludes `Top` and `Bot`)
16
17
  * @template Top - Type of the Top element of the abstract domain representing all possible elements
@@ -73,10 +74,10 @@ function domainElementToString(value) {
73
74
  return value.toString();
74
75
  }
75
76
  else if (value === lattice_1.Top) {
76
- return '⊤';
77
+ return lattice_1.TopSymbol;
77
78
  }
78
79
  else if (value === lattice_1.Bottom) {
79
- return '⊥';
80
+ return lattice_1.BottomSymbol;
80
81
  }
81
82
  return JSON.stringify(value);
82
83
  }
@@ -125,7 +125,7 @@ class BoundedSetDomain extends abstract_domain_1.AbstractDomain {
125
125
  }
126
126
  toString() {
127
127
  if (this.value === lattice_1.Top) {
128
- return '⊤';
128
+ return lattice_1.TopSymbol;
129
129
  }
130
130
  const string = this.value.values().map(abstract_domain_1.domainElementToString).toArray().join(', ');
131
131
  return `{${string}}`;
@@ -55,11 +55,11 @@ export declare class IntervalDomain<Value extends IntervalLift = IntervalLift> e
55
55
  /**
56
56
  * Extends the lower bound of the current abstract value down to -∞.
57
57
  */
58
- extendDown(): this;
58
+ widenDown(): this;
59
59
  /**
60
60
  * Extends the upper bound of the current abstract value up to +∞.
61
61
  */
62
- extendUp(): this;
62
+ widenUp(): this;
63
63
  toJson(): unknown;
64
64
  toString(): string;
65
65
  isTop(): this is IntervalDomain<IntervalTop>;
@@ -75,9 +75,6 @@ class IntervalDomain extends abstract_domain_1.AbstractDomain {
75
75
  if (this.value === lattice_1.Bottom || otherValue === lattice_1.Bottom) {
76
76
  return this.bottom();
77
77
  }
78
- else if (Math.max(this.value[0], otherValue[0]) > Math.min(this.value[1], otherValue[1])) {
79
- return this.bottom();
80
- }
81
78
  else {
82
79
  return this.create([Math.max(this.value[0], otherValue[0]), Math.min(this.value[1], otherValue[1])]);
83
80
  }
@@ -222,7 +219,7 @@ class IntervalDomain extends abstract_domain_1.AbstractDomain {
222
219
  /**
223
220
  * Extends the lower bound of the current abstract value down to -∞.
224
221
  */
225
- extendDown() {
222
+ widenDown() {
226
223
  if (this.value === lattice_1.Bottom) {
227
224
  return this.bottom();
228
225
  }
@@ -233,7 +230,7 @@ class IntervalDomain extends abstract_domain_1.AbstractDomain {
233
230
  /**
234
231
  * Extends the upper bound of the current abstract value up to +∞.
235
232
  */
236
- extendUp() {
233
+ widenUp() {
237
234
  if (this.value === lattice_1.Bottom) {
238
235
  return this.bottom();
239
236
  }
@@ -249,7 +246,7 @@ class IntervalDomain extends abstract_domain_1.AbstractDomain {
249
246
  }
250
247
  toString() {
251
248
  if (this.value === lattice_1.Bottom) {
252
- return '⊥';
249
+ return lattice_1.BottomSymbol;
253
250
  }
254
251
  return `[${isFinite(this.value[0]) ? this.value[0] : '-∞'}, ${isFinite(this.value[1]) ? this.value[1] : '+∞'}]`;
255
252
  }
@@ -2,10 +2,12 @@
2
2
  * The Top symbol to represent the Top element of complete lattices (e.g. of abstract domains).
3
3
  */
4
4
  export declare const Top: unique symbol;
5
+ export declare const TopSymbol = "\u22A4";
5
6
  /**
6
7
  * The Bottom symbol to represent the Bottom element of complete lattices (e.g. of abstract domains).
7
8
  */
8
9
  export declare const Bottom: unique symbol;
10
+ export declare const BottomSymbol = "\u22A5";
9
11
  /**
10
12
  * A complete lattice with a partially ordered set, join operator (LUB), meet operator (GLB), top element, and bottom element (e.g. for abstract domains).
11
13
  * @template Value - Type of a lattice element representing a value (may exclude `Top` and `Bot`)
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Bottom = exports.Top = void 0;
3
+ exports.BottomSymbol = exports.Bottom = exports.TopSymbol = exports.Top = void 0;
4
4
  /**
5
5
  * The Top symbol to represent the Top element of complete lattices (e.g. of abstract domains).
6
6
  */
7
7
  exports.Top = Symbol('top');
8
+ exports.TopSymbol = '⊤';
8
9
  /**
9
10
  * The Bottom symbol to represent the Bottom element of complete lattices (e.g. of abstract domains).
10
11
  */
11
12
  exports.Bottom = Symbol('bottom');
13
+ exports.BottomSymbol = '⊥';
12
14
  //# sourceMappingURL=lattice.js.map
@@ -30,7 +30,7 @@ export declare class PosIntervalDomain<Value extends PosIntervalLift = PosInterv
30
30
  /**
31
31
  * Extends the lower bound of the current abstract value down to 0.
32
32
  */
33
- extendDown(): this;
33
+ widenDown(): this;
34
34
  isTop(): this is PosIntervalDomain<PosIntervalTop>;
35
35
  }
36
36
  export {};
@@ -84,7 +84,7 @@ class PosIntervalDomain extends interval_domain_1.IntervalDomain {
84
84
  /**
85
85
  * Extends the lower bound of the current abstract value down to 0.
86
86
  */
87
- extendDown() {
87
+ widenDown() {
88
88
  if (this.value === lattice_1.Bottom) {
89
89
  return this.bottom();
90
90
  }