@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
@@ -35,7 +35,7 @@ export declare const FILE_PATH_VALIDITY: {
35
35
  normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
36
36
  dataflow: import("../../dataflow/info").DataflowInformation;
37
37
  cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
38
- config: import("../../config").FlowrConfigOptions;
38
+ analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
39
39
  }) => {
40
40
  results: FilePathValidityResult[];
41
41
  ".meta": FilePathValidityMetadata;
@@ -7,7 +7,6 @@ const dfg_1 = require("../../util/mermaid/dfg");
7
7
  const dependencies_query_format_1 = require("../../queries/catalog/dependencies-query/dependencies-query-format");
8
8
  const built_in_source_1 = require("../../dataflow/internal/process/functions/call/built-in/built-in-source");
9
9
  const logic_1 = require("../../util/logic");
10
- const retriever_1 = require("../../r-bridge/retriever");
11
10
  const happens_before_1 = require("../../control-flow/happens-before");
12
11
  const linter_tags_1 = require("../linter-tags");
13
12
  const search_enrichers_1 = require("../../search/search-executor/search-enrichers");
@@ -50,15 +49,16 @@ exports.FILE_PATH_VALIDITY = {
50
49
  }
51
50
  }
52
51
  // check if any write to the same file happens before the read, and exclude this case if so
53
- const writesToFile = results.write.filter(r => samePath(r.value, matchingRead.value, data.config.solver.resolveSource?.ignoreCapitalization));
52
+ const writesToFile = results.write.filter(r => samePath(r.value, matchingRead.value, data.analyzer.flowrConfig.solver.resolveSource?.ignoreCapitalization));
54
53
  const writesBefore = writesToFile.map(w => (0, happens_before_1.happensBefore)(cfg, w.nodeId, element.node.info.id));
55
54
  if (writesBefore.some(w => w === logic_1.Ternary.Always)) {
56
55
  metadata.totalWritesBeforeAlways++;
57
56
  return [];
58
57
  }
59
58
  // check if the file exists!
60
- const paths = (0, built_in_source_1.findSource)(data.config.solver.resolveSource, matchingRead.value, {
61
- referenceChain: element.node.info.file ? [(0, retriever_1.requestFromInput)(`file://${element.node.info.file}`)] : []
59
+ const paths = (0, built_in_source_1.findSource)(data.analyzer.flowrConfig.solver.resolveSource, matchingRead.value, {
60
+ referenceChain: element.node.info.file ? [element.node.info.file] : [],
61
+ ctx: data.analyzer.inspectContext()
62
62
  });
63
63
  if (paths && paths.length) {
64
64
  metadata.totalValid++;
@@ -5,8 +5,8 @@ import type { FlowrSearchElement, FlowrSearchElements } from '../../search/flowr
5
5
  import type { NormalizedAst, ParentInformation } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
6
6
  import type { MergeableRecord } from '../../util/objects';
7
7
  import type { DataflowInformation } from '../../dataflow/info';
8
- import type { FlowrConfigOptions } from '../../config';
9
8
  import type { FunctionInfo } from '../../queries/catalog/dependencies-query/function-info/function-info';
9
+ import type { ReadonlyFlowrAnalysisProvider } from '../../project/flowr-analyzer';
10
10
  export interface FunctionsResult extends LintingResult {
11
11
  function: string;
12
12
  range: SourceRange;
@@ -26,11 +26,7 @@ export interface FunctionsToDetectConfig extends MergeableRecord {
26
26
  */
27
27
  export declare const functionFinderUtil: {
28
28
  createSearch: (functions: readonly string[]) => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "filter"], ParentInformation, Promise<FlowrSearchElements<ParentInformation, [] | FlowrSearchElement<ParentInformation>[]>>>;
29
- processSearchResult: <T extends FlowrSearchElement<ParentInformation>[]>(elements: FlowrSearchElements<ParentInformation, T>, _config: FunctionsToDetectConfig, _data: {
30
- normalize: NormalizedAst;
31
- dataflow: DataflowInformation;
32
- config: FlowrConfigOptions;
33
- }, refineSearch?: (elements: T) => T) => {
29
+ processSearchResult: <T extends FlowrSearchElement<ParentInformation>[]>(elements: FlowrSearchElements<ParentInformation, T>, _config: unknown, _data: unknown, refineSearch?: (elements: T) => T) => {
34
30
  results: {
35
31
  certainty: LintingResultCertainty;
36
32
  function: Identifier;
@@ -45,6 +41,6 @@ export declare const functionFinderUtil: {
45
41
  requireArgumentValue(element: FlowrSearchElement<ParentInformation>, pool: readonly FunctionInfo[], data: {
46
42
  normalize: NormalizedAst;
47
43
  dataflow: DataflowInformation;
48
- config: FlowrConfigOptions;
44
+ analyzer: ReadonlyFlowrAnalysisProvider;
49
45
  }, requireValue: RegExp | string | undefined): boolean;
50
46
  };
@@ -65,7 +65,7 @@ exports.functionFinderUtil = {
65
65
  }
66
66
  const vert = data.dataflow.graph.getVertex(element.node.info.id);
67
67
  if ((0, vertex_1.isFunctionCallVertex)(vert)) {
68
- const args = (0, resolve_argument_1.getArgumentStringValue)(data.config.solver.variables, data.dataflow.graph, vert, info.argIdx, info.argName, info.resolveValue);
68
+ const args = (0, resolve_argument_1.getArgumentStringValue)(data.analyzer.flowrConfig.solver.variables, data.dataflow.graph, vert, info.argIdx, info.argName, info.resolveValue, data.analyzer.inspectContext());
69
69
  // we obtain all values, at least one of them has to trigger for the request
70
70
  const argValues = args ? args.values().flatMap(v => [...v]).filter(assert_1.isNotUndefined).toArray() : [];
71
71
  /* if there are no arguments we assume they may access the network, otherwise we check for the flag */
@@ -57,7 +57,7 @@ export declare const NAMING_CONVENTION: {
57
57
  normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
58
58
  dataflow: import("../../dataflow/info").DataflowInformation;
59
59
  cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
60
- config: import("../../config").FlowrConfigOptions;
60
+ analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
61
61
  }) => {
62
62
  results: {
63
63
  quickFix: LintQuickFixReplacement[] | undefined;
@@ -78,7 +78,7 @@ export declare const NAMING_CONVENTION: {
78
78
  readonly info: {
79
79
  readonly name: "Naming Convention";
80
80
  readonly certainty: LintingRuleCertainty.OverApproximative;
81
- readonly description: "Checks wether the symbols conform to a certain naming convention";
81
+ readonly description: "Checks whether the symbols conform to a certain naming convention";
82
82
  readonly tags: readonly [LintingRuleTag.Style, LintingRuleTag.QuickFix];
83
83
  readonly defaultConfig: {
84
84
  readonly caseing: "auto";
@@ -187,7 +187,7 @@ exports.NAMING_CONVENTION = {
187
187
  name: 'Naming Convention',
188
188
  // detects casing heuristically so correctness is not ensured using default config, but checks all identifiers in the code for naming convention match
189
189
  certainty: linter_format_1.LintingRuleCertainty.OverApproximative,
190
- description: 'Checks wether the symbols conform to a certain naming convention',
190
+ description: 'Checks whether the symbols conform to a certain naming convention',
191
191
  tags: [linter_tags_1.LintingRuleTag.Style, linter_tags_1.LintingRuleTag.QuickFix],
192
192
  defaultConfig: {
193
193
  caseing: 'auto',
@@ -14,7 +14,7 @@ export declare const NETWORK_FUNCTIONS: {
14
14
  normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
15
15
  dataflow: import("../../dataflow/info").DataflowInformation;
16
16
  cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
17
- config: import("../../config").FlowrConfigOptions;
17
+ analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
18
18
  }) => {
19
19
  results: {
20
20
  certainty: import("../linter-format").LintingResultCertainty;
@@ -7,7 +7,7 @@ const linter_tags_1 = require("../linter-tags");
7
7
  const read_functions_1 = require("../../queries/catalog/dependencies-query/function-info/read-functions");
8
8
  exports.NETWORK_FUNCTIONS = {
9
9
  createSearch: (config) => function_finder_util_1.functionFinderUtil.createSearch(config.fns),
10
- processSearchResult: (e, c, d) => function_finder_util_1.functionFinderUtil.processSearchResult(e, c, d, es => es.filter(e => function_finder_util_1.functionFinderUtil.requireArgumentValue(e, read_functions_1.ReadFunctions, d, c.onlyTriggerWithArgument))),
10
+ processSearchResult: (e, c, d) => function_finder_util_1.functionFinderUtil.processSearchResult(e, c, d, es => es.filter(e => function_finder_util_1.functionFinderUtil.requireArgumentValue(e, read_functions_1.ReadFunctions, { analyzer: d.analyzer, dataflow: d.dataflow, normalize: d.normalize }, c.onlyTriggerWithArgument))),
11
11
  prettyPrint: function_finder_util_1.functionFinderUtil.prettyPrint('network operations'),
12
12
  info: {
13
13
  name: 'Network Functions',
@@ -27,17 +27,18 @@ export interface SeededRandomnessMeta extends MergeableRecord {
27
27
  callsWithFunctionProducers: number;
28
28
  callsWithAssignmentProducers: number;
29
29
  callsWithNonConstantProducers: number;
30
+ callsWithOtherBranchProducers: number;
30
31
  }
31
32
  export declare const SEEDED_RANDOMNESS: {
32
33
  readonly createSearch: (config: SeededRandomnessConfig) => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["with", "filter", "with"], import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, Promise<import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>>;
33
- readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: SeededRandomnessConfig, { dataflow }: {
34
+ readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, config: SeededRandomnessConfig, { dataflow, analyzer }: {
34
35
  normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
35
36
  dataflow: import("../../dataflow/info").DataflowInformation;
36
37
  cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
37
- config: import("../../config").FlowrConfigOptions;
38
+ analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
38
39
  }) => {
39
40
  results: {
40
- certainty: LintingResultCertainty.Certain;
41
+ certainty: LintingResultCertainty;
41
42
  function: Identifier;
42
43
  range: SourceRange;
43
44
  }[];
@@ -16,6 +16,7 @@ const general_1 = require("../../dataflow/eval/values/general");
16
16
  const config_1 = require("../../config");
17
17
  const r_function_call_1 = require("../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
18
18
  const r_value_1 = require("../../dataflow/eval/values/r-value");
19
+ const info_1 = require("../../dataflow/info");
19
20
  exports.SEEDED_RANDOMNESS = {
20
21
  createSearch: (config) => flowr_search_builder_1.Q.all()
21
22
  .with(search_enrichers_1.Enrichment.CallTargets, { onlyBuiltin: true })
@@ -30,14 +31,15 @@ exports.SEEDED_RANDOMNESS = {
30
31
  { callName: config.randomnessProducers.filter(p => p.type === 'function').map(p => p.name) },
31
32
  { callName: getDefaultAssignments().flatMap(b => b.names), cascadeIf: () => cascade_action_1.CascadeAction.Continue }
32
33
  ]),
33
- processSearchResult: (elements, config, { dataflow }) => {
34
+ processSearchResult: (elements, config, { dataflow, analyzer }) => {
34
35
  const assignmentProducers = new Set(config.randomnessProducers.filter(p => p.type == 'assignment').map(p => p.name));
35
36
  const assignmentArgIndexes = new Map(getDefaultAssignments().flatMap(a => a.names.map(n => ([n, a.config?.swapSourceAndTarget ? 1 : 0]))));
36
37
  const metadata = {
37
38
  consumerCalls: 0,
38
39
  callsWithFunctionProducers: 0,
39
40
  callsWithAssignmentProducers: 0,
40
- callsWithNonConstantProducers: 0
41
+ callsWithNonConstantProducers: 0,
42
+ callsWithOtherBranchProducers: 0
41
43
  };
42
44
  return {
43
45
  results: elements.getElements()
@@ -51,16 +53,25 @@ exports.SEEDED_RANDOMNESS = {
51
53
  };
52
54
  }))
53
55
  // filter by calls that aren't preceded by a randomness producer
54
- .filter(element => {
56
+ .flatMap(element => {
57
+ const dfgElement = dataflow.graph.getVertex(element.searchElement.node.info.id);
58
+ const cds = dfgElement ? new Set(dfgElement.cds) : new Set();
55
59
  const producers = (0, search_enrichers_1.enrichmentContent)(element.searchElement, search_enrichers_1.Enrichment.LastCall).linkedIds
56
60
  .map(e => dataflow.graph.getVertex(e.node.info.id));
57
61
  const { assignment, func } = Object.groupBy(producers, f => assignmentArgIndexes.has(f.name) ? 'assignment' : 'func');
58
62
  let nonConstant = false;
63
+ let otherBranch = false;
59
64
  // function calls are already taken care of through the LastCall enrichment itself
60
65
  for (const f of func ?? []) {
61
- if (isConstantArgument(dataflow.graph, f, 0)) {
62
- metadata.callsWithFunctionProducers++;
63
- return false;
66
+ if (isConstantArgument(dataflow.graph, f, 0, analyzer.inspectContext())) {
67
+ const fCds = new Set(f.cds).difference(cds);
68
+ if (fCds.size <= 0 || (0, info_1.happensInEveryBranchSet)(fCds)) {
69
+ metadata.callsWithFunctionProducers++;
70
+ return [];
71
+ }
72
+ else {
73
+ otherBranch = true;
74
+ }
64
75
  }
65
76
  else {
66
77
  nonConstant = true;
@@ -71,9 +82,16 @@ exports.SEEDED_RANDOMNESS = {
71
82
  const argIdx = assignmentArgIndexes.get(a.name);
72
83
  const dest = (0, graph_1.getReferenceOfArgument)(a.args[argIdx]);
73
84
  if (dest !== undefined && assignmentProducers.has((0, node_id_1.recoverName)(dest, dataflow.graph.idMap))) {
74
- if (isConstantArgument(dataflow.graph, a, 1 - argIdx)) {
75
- metadata.callsWithAssignmentProducers++;
76
- return false;
85
+ // we either have arg index 0 or 1 for the assignmentProducers destination, so we select the assignment value as 1-argIdx here
86
+ if (isConstantArgument(dataflow.graph, a, 1 - argIdx, analyzer.inspectContext())) {
87
+ const aCds = new Set(a.cds).difference(cds);
88
+ if (aCds.size <= 0 || (0, info_1.happensInEveryBranchSet)(aCds)) {
89
+ metadata.callsWithAssignmentProducers++;
90
+ return [];
91
+ }
92
+ else {
93
+ otherBranch = true;
94
+ }
77
95
  }
78
96
  else {
79
97
  nonConstant = true;
@@ -83,13 +101,15 @@ exports.SEEDED_RANDOMNESS = {
83
101
  if (nonConstant) {
84
102
  metadata.callsWithNonConstantProducers++;
85
103
  }
86
- return true;
87
- })
88
- .map(element => ({
89
- certainty: linter_format_1.LintingResultCertainty.Certain,
90
- function: element.target,
91
- range: element.range
92
- })),
104
+ if (otherBranch) {
105
+ metadata.callsWithOtherBranchProducers++;
106
+ }
107
+ return [{
108
+ certainty: otherBranch ? linter_format_1.LintingResultCertainty.Uncertain : linter_format_1.LintingResultCertainty.Certain,
109
+ function: element.target,
110
+ range: element.range
111
+ }];
112
+ }),
93
113
  '.meta': metadata
94
114
  };
95
115
  },
@@ -112,9 +132,9 @@ exports.SEEDED_RANDOMNESS = {
112
132
  function getDefaultAssignments() {
113
133
  return default_builtin_config_1.DefaultBuiltinConfig.filter(b => b.type === 'function' && b.processor == 'builtin:assignment');
114
134
  }
115
- function isConstantArgument(graph, call, argIndex) {
135
+ function isConstantArgument(graph, call, argIndex, ctx) {
116
136
  const args = call.args.filter(arg => arg !== r_function_call_1.EmptyArgument && !arg.name).map(graph_1.getReferenceOfArgument);
117
- const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(args[argIndex], { graph: graph, resolve: config_1.VariableResolve.Alias }));
137
+ const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(args[argIndex], { graph: graph, resolve: config_1.VariableResolve.Alias, ctx }));
118
138
  return values?.elements.every(v => v.type === 'number' ||
119
139
  v.type === 'logical' ||
120
140
  v.type === 'string' ||
@@ -22,7 +22,7 @@ export declare const UNUSED_DEFINITION: {
22
22
  normalize: NormalizedAst;
23
23
  dataflow: import("../../dataflow/info").DataflowInformation;
24
24
  cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
25
- config: import("../../config").FlowrConfigOptions;
25
+ analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
26
26
  }) => {
27
27
  results: UnusedDefinitionResult[];
28
28
  ".meta": UnusedDefinitionMetadata;
@@ -16,11 +16,11 @@ export interface UselessLoopMetadata extends MergeableRecord {
16
16
  }
17
17
  export declare const USELESS_LOOP: {
18
18
  readonly createSearch: () => import("../../search/flowr-search-builder").FlowrSearchBuilder<"all", ["filter"], import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, Promise<import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, [] | import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>>>;
19
- readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, useLessLoopConfig: UselessLoopConfig, { config, dataflow, normalize, cfg }: {
19
+ readonly processSearchResult: (elements: import("../../search/flowr-search").FlowrSearchElements<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation, import("../../search/flowr-search").FlowrSearchElement<import("../../r-bridge/lang-4.x/ast/model/processing/decorate").ParentInformation>[]>, useLessLoopConfig: UselessLoopConfig, { analyzer, dataflow, normalize, cfg }: {
20
20
  normalize: import("../../r-bridge/lang-4.x/ast/model/processing/decorate").NormalizedAst;
21
21
  dataflow: import("../../dataflow/info").DataflowInformation;
22
22
  cfg: import("../../control-flow/control-flow-graph").ControlFlowInformation;
23
- config: import("../../config").FlowrConfigOptions;
23
+ analyzer: import("../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider;
24
24
  }) => {
25
25
  results: {
26
26
  certainty: LintingResultCertainty.Certain;
@@ -9,14 +9,14 @@ const linter_format_1 = require("../linter-format");
9
9
  const linter_tags_1 = require("../linter-tags");
10
10
  exports.USELESS_LOOP = {
11
11
  createSearch: () => flowr_search_builder_1.Q.all().filter(vertex_1.VertexType.FunctionCall),
12
- processSearchResult: (elements, useLessLoopConfig, { config, dataflow, normalize, cfg }) => {
12
+ processSearchResult: (elements, useLessLoopConfig, { analyzer, dataflow, normalize, cfg }) => {
13
13
  const results = elements.getElements().filter(e => {
14
14
  const vertex = dataflow.graph.getVertex(e.node.info.id);
15
15
  return vertex
16
16
  && (0, vertex_1.isFunctionCallVertex)(vertex)
17
17
  && vertex.origin !== 'unnamed'
18
18
  && useLessLoopConfig.loopyFunctions.has(vertex.origin[0]);
19
- }).filter(loop => (0, useless_loop_1.onlyLoopsOnce)(loop.node.info.id, dataflow.graph, cfg, normalize, config)).map(res => ({
19
+ }).filter(loop => (0, useless_loop_1.onlyLoopsOnce)(loop.node.info.id, dataflow.graph, cfg, normalize, analyzer.inspectContext())).map(res => ({
20
20
  certainty: linter_format_1.LintingResultCertainty.Certain,
21
21
  name: res.node.lexeme,
22
22
  range: res.node.info.fullRange
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eagleoutice/flowr",
3
- "version": "2.6.2",
3
+ "version": "2.7.0",
4
4
  "description": "Static Dataflow Analyzer and Program Slicer for the R Programming Language",
5
5
  "types": "dist/src/index.d.ts",
6
6
  "repository": {
@@ -25,22 +25,9 @@
25
25
  "benchmark": "npm run build-dev && node dist/src/cli/benchmark-app.js",
26
26
  "summarizer": "ts-node src/cli/summarizer-app.ts",
27
27
  "export-quads": "ts-node src/cli/export-quads-app.ts",
28
- "capabilities-markdown": "ts-node src/documentation/print-capabilities-markdown.ts",
29
- "wiki:df-graph": "ts-node src/documentation/print-dataflow-graph-wiki.ts",
30
- "wiki:normalized-ast": "ts-node src/documentation/print-normalized-ast-wiki.ts",
31
- "wiki:query-api": "ts-node src/documentation/print-query-wiki.ts",
32
- "wiki:core": "ts-node src/documentation/print-core-wiki.ts",
33
- "wiki:analyzer": "ts-node src/documentation/print-analyzer-wiki.ts",
34
- "wiki:engines": "ts-node src/documentation/print-engines-wiki.ts",
35
- "wiki:search-api": "ts-node src/documentation/print-search-wiki.ts",
36
- "wiki:linting-and-testing": "ts-node src/documentation/print-linting-and-testing-wiki.ts",
37
- "wiki:interface": "ts-node src/documentation/print-interface-wiki.ts",
38
- "wiki:onboarding": "ts-node src/documentation/print-onboarding-wiki.ts",
39
- "wiki:faq": "ts-node src/documentation/print-faq-wiki.ts",
40
- "wiki:cfg": "ts-node src/documentation/print-cfg-wiki.ts",
41
- "wiki:linter": "ts-node src/documentation/print-linter-wiki.ts",
42
- "gen:readme": "ts-node src/documentation/print-readme.ts",
43
- "gen:linter-issue": "ts-node src/documentation/print-linter-issue.ts",
28
+ "capabilities-markdown": "ts-node src/documentation/doc-capabilities.ts",
29
+ "wiki": "ts-node src/cli/wiki.ts",
30
+ "wiki:watch": "ts-node-dev src/cli/wiki.ts -- --keep-alive",
44
31
  "build": "tsc --project .",
45
32
  "build-dev": "npm run build && npm run build:copy-wasm",
46
33
  "build:bundle-flowr": "npm run build && esbuild --bundle dist/src/cli/flowr.js --platform=node --tree-shaking=true --bundle --minify --external:clipboardy --target=node22 --outfile=dist/src/cli/flowr.min.js && npm run build:copy-wasm",
@@ -210,6 +197,7 @@
210
197
  },
211
198
  "dependencies": {
212
199
  "@eagleoutice/tree-sitter-r": "^1.1.2",
200
+ "@jupyterlab/nbformat": "^4.5.0",
213
201
  "@xmldom/xmldom": "^0.9.7",
214
202
  "clipboardy": "^4.0.0",
215
203
  "command-line-args": "^6.0.1",
@@ -1,21 +1,18 @@
1
1
  import type { KnownParser } from '../../r-bridge/parser';
2
2
  import { type CacheInvalidationEvent, FlowrCache } from './flowr-cache';
3
3
  import { type DEFAULT_DATAFLOW_PIPELINE, type TREE_SITTER_DATAFLOW_PIPELINE } from '../../core/steps/pipeline/default-pipelines';
4
- import type { FlowrConfigOptions } from '../../config';
5
- import type { RParseRequests } from '../../r-bridge/retriever';
6
4
  import type { IdGenerator } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
7
5
  import type { NoInfo } from '../../r-bridge/lang-4.x/ast/model/model';
8
6
  import type { TreeSitterExecutor } from '../../r-bridge/lang-4.x/tree-sitter/tree-sitter-executor';
9
7
  import type { PipelineOutput } from '../../core/steps/pipeline/pipeline';
10
8
  import type { CfgSimplificationPassName } from '../../control-flow/cfg-simplification';
11
9
  import type { ControlFlowInformation } from '../../control-flow/control-flow-graph';
12
- import { CfgKind } from '../cfg-kind';
10
+ import type { CfgKind } from '../cfg-kind';
11
+ import type { FlowrAnalyzerContext } from '../context/flowr-analyzer-context';
13
12
  interface FlowrAnalyzerCacheOptions<Parser extends KnownParser> {
14
13
  parser: Parser;
15
- config: FlowrConfigOptions;
16
- request: RParseRequests;
14
+ context: FlowrAnalyzerContext;
17
15
  getId?: IdGenerator<NoInfo>;
18
- overwriteFilePath?: string;
19
16
  }
20
17
  export type AnalyzerCacheType<Parser extends KnownParser> = Parser extends TreeSitterExecutor ? Partial<PipelineOutput<typeof TREE_SITTER_DATAFLOW_PIPELINE>> : Partial<PipelineOutput<typeof DEFAULT_DATAFLOW_PIPELINE>>;
21
18
  /**
@@ -71,14 +68,14 @@ export declare class FlowrAnalyzerCache<Parser extends KnownParser> extends Flow
71
68
  peekDataflow(): NonNullable<AnalyzerCacheType<Parser>['dataflow']> | undefined;
72
69
  /**
73
70
  * Get the control flow graph (CFG) for the request, computing if necessary.
74
- * @param force - Do not use the cache, instead force new analyses.
75
- * @param kind - The kind of CFG that is requested.
71
+ * @param force - Do not use the cache, instead force new analyses.
72
+ * @param kind - The kind of CFG that is requested.
76
73
  * @param simplifications - Simplification passes to be applied to the CFG.
77
74
  */
78
- controlflow(force: boolean | undefined, kind: CfgKind, simplifications: readonly CfgSimplificationPassName[] | undefined): Promise<ControlFlowInformation>;
75
+ controlflow(force: boolean | undefined, kind: CfgKind, simplifications?: readonly CfgSimplificationPassName[]): Promise<ControlFlowInformation>;
79
76
  /**
80
77
  * Get the control flow graph (CFG) for the request if already available, otherwise return `undefined`.
81
- * @param kind - The kind of CFG that is requested.
78
+ * @param kind - The kind of CFG that is requested.
82
79
  * @param simplifications - Simplification passes to be applied to the CFG.
83
80
  * @see {@link FlowrAnalyzerCache#controlflow} - to get the control flow graph, computing if necessary.
84
81
  */
@@ -4,9 +4,7 @@ exports.FlowrAnalyzerCache = void 0;
4
4
  const flowr_cache_1 = require("./flowr-cache");
5
5
  const default_pipelines_1 = require("../../core/steps/pipeline/default-pipelines");
6
6
  const assert_1 = require("../../util/assert");
7
- const objectmap_1 = require("../../util/collections/objectmap");
8
- const extract_cfg_1 = require("../../control-flow/extract-cfg");
9
- const cfg_kind_1 = require("../cfg-kind");
7
+ const flowr_analyzer_controlflow_cache_1 = require("./flowr-analyzer-controlflow-cache");
10
8
  /**
11
9
  * This provides the full analyzer caching layer, please avoid using this directly
12
10
  * and prefer the {@link FlowrAnalyzer}.
@@ -22,13 +20,10 @@ class FlowrAnalyzerCache extends flowr_cache_1.FlowrCache {
22
20
  }
23
21
  initCacheProviders() {
24
22
  this.pipeline = (0, default_pipelines_1.createDataflowPipeline)(this.args.parser, {
25
- request: this.args.request,
26
- getId: this.args.getId,
27
- overwriteFilePath: this.args.overwriteFilePath
28
- }, this.args.config);
29
- this.controlFlowCache = {
30
- simplified: new objectmap_1.ObjectMap(),
31
- };
23
+ context: this.args.context,
24
+ getId: this.args.getId
25
+ });
26
+ this.controlFlowCache = new flowr_analyzer_controlflow_cache_1.FlowrAnalyzerControlFlowCache();
32
27
  }
33
28
  static create(data) {
34
29
  return new FlowrAnalyzerCache(data);
@@ -51,7 +46,7 @@ class FlowrAnalyzerCache extends flowr_cache_1.FlowrCache {
51
46
  this.receive({ type: "full" /* CacheInvalidationEventType.Full */ });
52
47
  }
53
48
  async runTapeUntil(force, until) {
54
- (0, assert_1.guard)(this.args.request && (Array.isArray(this.args.request) ? this.args.request.length > 0 : true), 'At least one request must be set to run the analysis pipeline');
49
+ (0, assert_1.guard)(this.args.context.files.loadingOrder.getUnorderedRequests().length > 0, 'At least one request must be set to run the analysis pipeline');
55
50
  if (force) {
56
51
  this.reset();
57
52
  }
@@ -115,43 +110,27 @@ class FlowrAnalyzerCache extends flowr_cache_1.FlowrCache {
115
110
  }
116
111
  /**
117
112
  * Get the control flow graph (CFG) for the request, computing if necessary.
118
- * @param force - Do not use the cache, instead force new analyses.
119
- * @param kind - The kind of CFG that is requested.
113
+ * @param force - Do not use the cache, instead force new analyses.
114
+ * @param kind - The kind of CFG that is requested.
120
115
  * @param simplifications - Simplification passes to be applied to the CFG.
121
116
  */
122
117
  async controlflow(force, kind, simplifications) {
123
- (0, assert_1.guard)(kind === cfg_kind_1.CfgKind.Quick ? simplifications === undefined : true, 'Cannot apply simplifications to quick CFG');
124
- simplifications ??= [];
125
- if (!force) {
126
- const value = this.controlFlowCache.simplified.get([simplifications, kind]);
127
- if (value !== undefined) {
128
- return value;
129
- }
130
- }
131
- const normalized = await this.normalize(force);
132
- let result;
133
- switch (kind) {
134
- case cfg_kind_1.CfgKind.WithDataflow:
135
- result = (0, extract_cfg_1.extractCfg)(normalized, this.args.config, (await this.dataflow()).graph, simplifications);
136
- break;
137
- case cfg_kind_1.CfgKind.NoDataflow:
138
- result = (0, extract_cfg_1.extractCfg)(normalized, this.args.config, undefined, simplifications);
139
- break;
140
- case cfg_kind_1.CfgKind.Quick:
141
- result = this.peekDataflow()?.cfgQuick ?? (0, extract_cfg_1.extractCfgQuick)(normalized);
142
- break;
143
- }
144
- this.controlFlowCache.simplified.set([simplifications, kind], result);
145
- return result;
118
+ const cfgInfo = {
119
+ ctx: this.args.context,
120
+ cfgQuick: this.peekDataflow()?.cfgQuick,
121
+ ast: async () => await this.normalize(),
122
+ dfg: async () => await this.dataflow()
123
+ };
124
+ return this.controlFlowCache.get(force, kind, cfgInfo, simplifications);
146
125
  }
147
126
  /**
148
127
  * Get the control flow graph (CFG) for the request if already available, otherwise return `undefined`.
149
- * @param kind - The kind of CFG that is requested.
128
+ * @param kind - The kind of CFG that is requested.
150
129
  * @param simplifications - Simplification passes to be applied to the CFG.
151
130
  * @see {@link FlowrAnalyzerCache#controlflow} - to get the control flow graph, computing if necessary.
152
131
  */
153
132
  peekControlflow(kind, simplifications) {
154
- return this.controlFlowCache.simplified.get([simplifications ?? [], kind]);
133
+ return this.controlFlowCache.peek(kind, simplifications);
155
134
  }
156
135
  }
157
136
  exports.FlowrAnalyzerCache = FlowrAnalyzerCache;
@@ -0,0 +1,34 @@
1
+ import type { CfgSimplificationPassName } from '../../control-flow/cfg-simplification';
2
+ import { CfgKind } from '../cfg-kind';
3
+ import type { ControlFlowInformation } from '../../control-flow/control-flow-graph';
4
+ import type { NormalizedAst } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
5
+ import type { DataflowInformation } from '../../dataflow/info';
6
+ import type { FlowrAnalyzerContext } from '../context/flowr-analyzer-context';
7
+ interface CfgInfo {
8
+ ctx: FlowrAnalyzerContext;
9
+ cfgQuick: ControlFlowInformation | undefined;
10
+ dfg: () => Promise<DataflowInformation>;
11
+ ast: () => Promise<NormalizedAst>;
12
+ }
13
+ export declare class FlowrAnalyzerControlFlowCache {
14
+ private readonly cache;
15
+ peek(kind: CfgKind, simplifications: readonly CfgSimplificationPassName[] | undefined): ControlFlowInformation | undefined;
16
+ get(force: boolean | undefined, kind: CfgKind, cfgCacheInfo: CfgInfo, simplifications?: readonly CfgSimplificationPassName[]): Promise<ControlFlowInformation>;
17
+ /**
18
+ * Create and cache the base CFG without simplifications.
19
+ */
20
+ private createAndCacheBaseCfg;
21
+ /**
22
+ * Try to get a cached CFG with some of the requested simplifications already applied.
23
+ * Matches the longest prefix of simplifications available.
24
+ * @returns The cached CFG and the missing simplifications to be applied, or `undefined` if no cached CFG is available.
25
+ */
26
+ private tryGetCachedCfg;
27
+ /**
28
+ * Normalize the order of simplification passes.
29
+ * Is currently an identity function, but may be extended in the future to enforce a specific order using heuristics.
30
+ * @param simplifications - the requested simplification passes.
31
+ */
32
+ private normalizeSimplificationOrder;
33
+ }
34
+ export {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FlowrAnalyzerControlFlowCache = void 0;
4
+ const objectmap_1 = require("../../util/collections/objectmap");
5
+ const cfg_simplification_1 = require("../../control-flow/cfg-simplification");
6
+ const cfg_kind_1 = require("../cfg-kind");
7
+ const assert_1 = require("../../util/assert");
8
+ const extract_cfg_1 = require("../../control-flow/extract-cfg");
9
+ class FlowrAnalyzerControlFlowCache {
10
+ cache = new objectmap_1.ObjectMap();
11
+ peek(kind, simplifications) {
12
+ return this.cache.get([simplifications ?? [], kind]);
13
+ }
14
+ async get(force, kind, cfgCacheInfo, simplifications) {
15
+ (0, assert_1.guard)(kind === cfg_kind_1.CfgKind.Quick ? simplifications === undefined : true, 'Cannot apply simplifications to quick CFG');
16
+ simplifications ??= [];
17
+ const orderedSimplifications = this.normalizeSimplificationOrder(simplifications);
18
+ const cached = force ?
19
+ { cfg: undefined, missingSimplifications: orderedSimplifications }
20
+ : this.tryGetCachedCfg(orderedSimplifications, kind);
21
+ let cfg = cached.cfg;
22
+ if (!cfg) {
23
+ cfg = await this.createAndCacheBaseCfg(kind, cfgCacheInfo);
24
+ }
25
+ if (cached.missingSimplifications.length > 0) {
26
+ const cfgPassInfo = { dfg: (await cfgCacheInfo.dfg()).graph, ctx: cfgCacheInfo.ctx, ast: await cfgCacheInfo.ast() };
27
+ cfg = (0, cfg_simplification_1.simplifyControlFlowInformation)(cfg, cfgPassInfo, cached.missingSimplifications);
28
+ }
29
+ this.cache.set([orderedSimplifications, kind], cfg);
30
+ return cfg;
31
+ }
32
+ /**
33
+ * Create and cache the base CFG without simplifications.
34
+ */
35
+ async createAndCacheBaseCfg(kind, { cfgQuick, dfg, ctx, ast }) {
36
+ let result;
37
+ switch (kind) {
38
+ case cfg_kind_1.CfgKind.WithDataflow:
39
+ result = (0, extract_cfg_1.extractCfg)(await ast(), ctx, (await dfg()).graph);
40
+ break;
41
+ case cfg_kind_1.CfgKind.NoDataflow:
42
+ result = (0, extract_cfg_1.extractCfg)(await ast(), ctx);
43
+ break;
44
+ case cfg_kind_1.CfgKind.Quick:
45
+ result = cfgQuick ?? (0, extract_cfg_1.extractCfgQuick)(await ast());
46
+ break;
47
+ }
48
+ this.cache.set([[], kind], result);
49
+ return result;
50
+ }
51
+ /**
52
+ * Try to get a cached CFG with some of the requested simplifications already applied.
53
+ * Matches the longest prefix of simplifications available.
54
+ * @returns The cached CFG and the missing simplifications to be applied, or `undefined` if no cached CFG is available.
55
+ */
56
+ tryGetCachedCfg(simplifications, kind) {
57
+ for (let prefixLen = simplifications.length; prefixLen >= 0; prefixLen--) {
58
+ const prefix = simplifications.slice(0, prefixLen);
59
+ const cached = this.cache.get([prefix, kind]);
60
+ if (cached !== undefined) {
61
+ return {
62
+ cfg: cached,
63
+ missingSimplifications: simplifications.slice(prefixLen)
64
+ };
65
+ }
66
+ }
67
+ return { cfg: undefined, missingSimplifications: simplifications };
68
+ }
69
+ /**
70
+ * Normalize the order of simplification passes.
71
+ * Is currently an identity function, but may be extended in the future to enforce a specific order using heuristics.
72
+ * @param simplifications - the requested simplification passes.
73
+ */
74
+ normalizeSimplificationOrder(simplifications) {
75
+ return simplifications;
76
+ }
77
+ }
78
+ exports.FlowrAnalyzerControlFlowCache = FlowrAnalyzerControlFlowCache;
79
+ //# sourceMappingURL=flowr-analyzer-controlflow-cache.js.map