@eagleoutice/flowr 2.6.2 → 2.6.3

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 (349) hide show
  1. package/README.md +36 -34
  2. package/abstract-interpretation/data-frame/absint-visitor.js +3 -3
  3. package/abstract-interpretation/data-frame/mappers/function-mapper.d.ts +7 -7
  4. package/abstract-interpretation/data-frame/mappers/function-mapper.js +20 -16
  5. package/abstract-interpretation/data-frame/semantics.js +8 -0
  6. package/abstract-interpretation/data-frame/shape-inference.d.ts +3 -3
  7. package/abstract-interpretation/data-frame/shape-inference.js +3 -3
  8. package/abstract-interpretation/normalized-ast-fold.d.ts +1 -1
  9. package/benchmark/slicer.d.ts +1 -0
  10. package/benchmark/slicer.js +13 -12
  11. package/benchmark/summarizer/first-phase/process.js +1 -1
  12. package/benchmark/summarizer/second-phase/graph.d.ts +3 -1
  13. package/benchmark/summarizer/second-phase/graph.js +3 -1
  14. package/cli/export-quads-app.js +1 -1
  15. package/cli/repl/commands/repl-dataflow.js +2 -1
  16. package/cli/repl/commands/repl-parse.js +16 -4
  17. package/cli/repl/commands/repl-query.js +1 -1
  18. package/cli/repl/core.js +16 -13
  19. package/cli/repl/server/connection.js +2 -1
  20. package/cli/script-core/statistics-helper-core.js +2 -1
  21. package/cli/slicer-app.js +3 -4
  22. package/cli/wiki.d.ts +4 -0
  23. package/cli/wiki.js +165 -0
  24. package/config.d.ts +4 -0
  25. package/config.js +6 -0
  26. package/control-flow/cfg-dead-code.js +13 -3
  27. package/control-flow/cfg-simplification.d.ts +5 -2
  28. package/control-flow/cfg-simplification.js +3 -0
  29. package/control-flow/extract-cfg.d.ts +9 -3
  30. package/control-flow/extract-cfg.js +44 -4
  31. package/control-flow/semantic-cfg-guided-visitor.d.ts +2 -2
  32. package/control-flow/simple-visitor.js +2 -2
  33. package/control-flow/useless-loop.d.ts +3 -3
  34. package/control-flow/useless-loop.js +14 -5
  35. package/core/pipeline-executor.d.ts +3 -6
  36. package/core/pipeline-executor.js +4 -7
  37. package/core/print/normalize-printer.d.ts +1 -1
  38. package/core/print/normalize-printer.js +2 -2
  39. package/core/steps/all/core/00-parse.d.ts +1 -1
  40. package/core/steps/all/core/00-parse.js +1 -1
  41. package/core/steps/all/core/10-normalize.d.ts +3 -9
  42. package/core/steps/all/core/10-normalize.js +1 -16
  43. package/core/steps/all/core/11-normalize-tree-sitter.d.ts +2 -3
  44. package/core/steps/all/core/11-normalize-tree-sitter.js +2 -3
  45. package/core/steps/all/core/20-dataflow.d.ts +3 -4
  46. package/core/steps/all/core/20-dataflow.js +2 -2
  47. package/core/steps/all/static-slicing/00-slice.d.ts +1 -2
  48. package/core/steps/all/static-slicing/00-slice.js +1 -1
  49. package/core/steps/all/static-slicing/10-reconstruct.d.ts +8 -0
  50. package/core/steps/all/static-slicing/10-reconstruct.js +4 -1
  51. package/core/steps/pipeline/default-pipelines.d.ts +55 -56
  52. package/core/steps/pipeline/default-pipelines.js +8 -8
  53. package/dataflow/environments/clone.d.ts +0 -1
  54. package/dataflow/environments/clone.js +12 -2
  55. package/dataflow/environments/diff.js +2 -2
  56. package/dataflow/environments/overwrite.d.ts +1 -5
  57. package/dataflow/environments/overwrite.js +3 -19
  58. package/dataflow/environments/scoping.d.ts +6 -2
  59. package/dataflow/environments/scoping.js +6 -2
  60. package/dataflow/eval/resolve/resolve-argument.js +2 -2
  61. package/dataflow/eval/values/string/string-constants.d.ts +9 -3
  62. package/dataflow/eval/values/string/string-constants.js +9 -3
  63. package/dataflow/extractor.d.ts +2 -3
  64. package/dataflow/extractor.js +25 -22
  65. package/dataflow/graph/graph.d.ts +3 -9
  66. package/dataflow/graph/graph.js +0 -13
  67. package/dataflow/graph/unknown-replacement.d.ts +4 -2
  68. package/dataflow/graph/unknown-replacement.js +4 -2
  69. package/dataflow/info.d.ts +7 -0
  70. package/dataflow/info.js +21 -0
  71. package/dataflow/internal/linker.js +7 -4
  72. package/dataflow/internal/process/functions/call/argument/make-argument.d.ts +2 -2
  73. package/dataflow/internal/process/functions/call/argument/make-argument.js +2 -3
  74. package/dataflow/internal/process/functions/call/built-in/built-in-access.d.ts +1 -1
  75. package/dataflow/internal/process/functions/call/built-in/built-in-access.js +4 -4
  76. package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +1 -1
  77. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +4 -4
  78. package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +6 -6
  79. package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +1 -1
  80. package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +1 -1
  81. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +1 -1
  82. package/dataflow/internal/process/functions/call/built-in/built-in-get.d.ts +1 -1
  83. package/dataflow/internal/process/functions/call/built-in/built-in-get.js +1 -1
  84. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +1 -1
  85. package/dataflow/internal/process/functions/call/built-in/built-in-list.js +2 -2
  86. package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +3 -3
  87. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.d.ts +6 -1
  88. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +6 -1
  89. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +2 -2
  90. package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +15 -10
  91. package/dataflow/internal/process/functions/call/built-in/built-in-source.js +78 -75
  92. package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.d.ts +3 -1
  93. package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.js +3 -1
  94. package/dataflow/internal/process/functions/call/built-in/built-in-vector.js +2 -2
  95. package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +1 -1
  96. package/dataflow/internal/process/functions/call/common.d.ts +1 -1
  97. package/dataflow/internal/process/functions/call/common.js +4 -4
  98. package/dataflow/internal/process/functions/call/default-call-handling.d.ts +3 -1
  99. package/dataflow/internal/process/functions/call/default-call-handling.js +3 -1
  100. package/dataflow/internal/process/functions/call/known-call-handling.js +3 -3
  101. package/dataflow/internal/process/functions/call/named-call-handling.js +4 -4
  102. package/dataflow/internal/process/functions/process-parameter.js +4 -4
  103. package/dataflow/origin/dfg-get-symbol-refs.d.ts +1 -1
  104. package/dataflow/origin/dfg-get-symbol-refs.js +1 -1
  105. package/dataflow/processor.d.ts +6 -11
  106. package/documentation/data/dfg/doc-data-dfg-util.d.ts +0 -2
  107. package/documentation/data/faq/faqs.js +27 -18
  108. package/documentation/data/faq/recommended-configs.d.ts +36 -0
  109. package/documentation/data/faq/recommended-configs.js +40 -0
  110. package/documentation/data/faq/wiki-faq-store.d.ts +1 -0
  111. package/documentation/data/faq/wiki-faq-store.js +10 -2
  112. package/documentation/data/server/doc-data-server-messages.js +1 -1
  113. package/documentation/doc-capabilities.d.ts +9 -0
  114. package/documentation/{print-capabilities-markdown.js → doc-capabilities.js} +18 -21
  115. package/documentation/doc-readme.d.ts +9 -0
  116. package/documentation/{print-readme.js → doc-readme.js} +31 -35
  117. package/documentation/doc-util/doc-benchmarks.d.ts +6 -4
  118. package/documentation/doc-util/doc-benchmarks.js +6 -4
  119. package/documentation/doc-util/doc-cfg.js +5 -8
  120. package/documentation/doc-util/doc-dfg.d.ts +7 -7
  121. package/documentation/doc-util/doc-dfg.js +13 -13
  122. package/documentation/doc-util/doc-escape.d.ts +6 -0
  123. package/documentation/doc-util/doc-escape.js +11 -0
  124. package/documentation/doc-util/doc-general.d.ts +22 -2
  125. package/documentation/doc-util/doc-general.js +22 -2
  126. package/documentation/doc-util/doc-normalized-ast.d.ts +10 -5
  127. package/documentation/doc-util/doc-normalized-ast.js +12 -9
  128. package/documentation/doc-util/doc-query.d.ts +12 -4
  129. package/documentation/doc-util/doc-query.js +18 -11
  130. package/documentation/doc-util/doc-search.d.ts +0 -30
  131. package/documentation/doc-util/doc-search.js +2 -73
  132. package/documentation/doc-util/doc-server-message.d.ts +5 -5
  133. package/documentation/doc-util/doc-server-message.js +4 -4
  134. package/documentation/doc-util/doc-types.d.ts +69 -32
  135. package/documentation/doc-util/doc-types.js +108 -61
  136. package/documentation/index.d.ts +9 -9
  137. package/documentation/index.js +9 -9
  138. package/documentation/issue-linting-rule.d.ts +9 -0
  139. package/documentation/{print-linter-issue.js → issue-linting-rule.js} +20 -23
  140. package/documentation/wiki-analyzer.d.ts +9 -0
  141. package/documentation/wiki-analyzer.js +412 -0
  142. package/documentation/wiki-cfg.d.ts +9 -0
  143. package/documentation/{print-cfg-wiki.js → wiki-cfg.js} +144 -160
  144. package/documentation/wiki-core.d.ts +14 -0
  145. package/documentation/{print-core-wiki.js → wiki-core.js} +164 -175
  146. package/documentation/wiki-dataflow-graph.d.ts +9 -0
  147. package/documentation/{print-dataflow-graph-wiki.js → wiki-dataflow-graph.js} +142 -172
  148. package/documentation/wiki-engine.d.ts +9 -0
  149. package/documentation/{print-engines-wiki.js → wiki-engine.js} +27 -42
  150. package/documentation/wiki-faq.d.ts +8 -0
  151. package/documentation/wiki-faq.js +22 -0
  152. package/documentation/wiki-interface.d.ts +9 -0
  153. package/documentation/{print-interface-wiki.js → wiki-interface.js} +59 -56
  154. package/documentation/wiki-linter.d.ts +9 -0
  155. package/documentation/{print-linter-wiki.js → wiki-linter.js} +52 -48
  156. package/documentation/wiki-linting-and-testing.d.ts +9 -0
  157. package/documentation/{print-linting-and-testing-wiki.js → wiki-linting-and-testing.js} +25 -32
  158. package/documentation/wiki-mk/doc-context.d.ts +186 -0
  159. package/documentation/wiki-mk/doc-context.js +84 -0
  160. package/documentation/wiki-mk/doc-maker.d.ts +95 -0
  161. package/documentation/wiki-mk/doc-maker.js +133 -0
  162. package/documentation/wiki-normalized-ast.d.ts +9 -0
  163. package/documentation/{print-normalized-ast-wiki.js → wiki-normalized-ast.js} +64 -47
  164. package/documentation/wiki-onboarding.d.ts +8 -0
  165. package/documentation/{print-onboarding-wiki.js → wiki-onboarding.js} +18 -15
  166. package/documentation/wiki-query.d.ts +9 -0
  167. package/documentation/{print-query-wiki.js → wiki-query.js} +62 -47
  168. package/documentation/wiki-search.d.ts +9 -0
  169. package/documentation/wiki-search.js +61 -0
  170. package/linter/linter-executor.js +3 -2
  171. package/linter/linter-format.d.ts +2 -2
  172. package/linter/linter-rules.d.ts +13 -17
  173. package/linter/rules/absolute-path.d.ts +1 -2
  174. package/linter/rules/absolute-path.js +2 -2
  175. package/linter/rules/dataframe-access-validation.d.ts +1 -1
  176. package/linter/rules/dataframe-access-validation.js +12 -8
  177. package/linter/rules/dead-code.d.ts +1 -1
  178. package/linter/rules/deprecated-functions.d.ts +1 -5
  179. package/linter/rules/file-path-validity.d.ts +1 -1
  180. package/linter/rules/file-path-validity.js +4 -4
  181. package/linter/rules/function-finder-util.d.ts +1 -5
  182. package/linter/rules/naming-convention.d.ts +2 -2
  183. package/linter/rules/naming-convention.js +1 -1
  184. package/linter/rules/network-functions.d.ts +1 -1
  185. package/linter/rules/network-functions.js +1 -1
  186. package/linter/rules/seeded-randomness.d.ts +3 -2
  187. package/linter/rules/seeded-randomness.js +33 -13
  188. package/linter/rules/unused-definition.d.ts +1 -1
  189. package/linter/rules/useless-loop.d.ts +2 -2
  190. package/linter/rules/useless-loop.js +2 -2
  191. package/package.json +6 -17
  192. package/project/cache/flowr-analyzer-cache.d.ts +7 -10
  193. package/project/cache/flowr-analyzer-cache.js +17 -38
  194. package/project/cache/flowr-analyzer-controlflow-cache.d.ts +34 -0
  195. package/project/cache/flowr-analyzer-controlflow-cache.js +79 -0
  196. package/project/context/flowr-analyzer-context.d.ts +30 -5
  197. package/project/context/flowr-analyzer-context.js +48 -4
  198. package/project/context/flowr-analyzer-files-context.d.ts +63 -13
  199. package/project/context/flowr-analyzer-files-context.js +110 -39
  200. package/project/context/flowr-file.d.ts +32 -10
  201. package/project/context/flowr-file.js +30 -9
  202. package/project/flowr-analyzer-builder.d.ts +22 -28
  203. package/project/flowr-analyzer-builder.js +32 -70
  204. package/project/flowr-analyzer.d.ts +55 -14
  205. package/project/flowr-analyzer.js +53 -8
  206. package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.d.ts +7 -1
  207. package/project/plugins/file-plugins/flowr-analyzer-description-file-plugin.js +13 -5
  208. package/project/plugins/file-plugins/flowr-analyzer-file-plugin.d.ts +3 -3
  209. package/project/plugins/file-plugins/flowr-analyzer-file-plugin.js +11 -5
  210. package/project/plugins/file-plugins/flowr-description-file.d.ts +3 -3
  211. package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.d.ts +22 -0
  212. package/project/plugins/file-plugins/notebooks/flowr-analyzer-jupyter-file-plugin.js +33 -0
  213. package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.d.ts +22 -0
  214. package/project/plugins/file-plugins/notebooks/flowr-analyzer-qmd-file-plugin.js +33 -0
  215. package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.d.ts +22 -0
  216. package/project/plugins/file-plugins/notebooks/flowr-analyzer-rmd-file-plugin.js +33 -0
  217. package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.d.ts +20 -0
  218. package/project/plugins/file-plugins/notebooks/flowr-jupyter-file.js +42 -0
  219. package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.d.ts +59 -0
  220. package/project/plugins/file-plugins/notebooks/flowr-rmarkdown-file.js +132 -0
  221. package/project/plugins/file-plugins/notebooks/notebook.d.ts +0 -0
  222. package/project/plugins/file-plugins/notebooks/notebook.js +2 -0
  223. package/project/plugins/flowr-analyzer-plugin-defaults.d.ts +5 -0
  224. package/project/plugins/flowr-analyzer-plugin-defaults.js +23 -0
  225. package/project/plugins/flowr-analyzer-plugin.d.ts +2 -0
  226. package/project/plugins/flowr-analyzer-plugin.js +2 -0
  227. package/project/plugins/loading-order-plugins/flowr-analyzer-loading-order-description-file-plugin.js +1 -1
  228. package/project/plugins/package-version-plugins/flowr-analyzer-package-versions-description-file-plugin.js +1 -1
  229. package/project/plugins/plugin-registry.d.ts +34 -0
  230. package/project/plugins/plugin-registry.js +62 -0
  231. package/project/plugins/project-discovery/flowr-analyzer-project-discovery-plugin.js +7 -1
  232. package/queries/catalog/call-context-query/call-context-query-executor.js +4 -2
  233. package/queries/catalog/call-context-query/identify-link-to-last-call-relation.d.ts +5 -2
  234. package/queries/catalog/call-context-query/identify-link-to-last-call-relation.js +25 -18
  235. package/queries/catalog/cluster-query/cluster-query-format.d.ts +1 -1
  236. package/queries/catalog/control-flow-query/control-flow-query-format.d.ts +1 -1
  237. package/queries/catalog/dataflow-lens-query/dataflow-lens-query-format.d.ts +1 -1
  238. package/queries/catalog/dataflow-query/dataflow-query-format.d.ts +1 -1
  239. package/queries/catalog/dependencies-query/dependencies-query-executor.d.ts +1 -1
  240. package/queries/catalog/dependencies-query/dependencies-query-executor.js +1 -1
  241. package/queries/catalog/dependencies-query/dependencies-query-format.d.ts +1 -1
  242. package/queries/catalog/dependencies-query/dependencies-query-format.js +1 -1
  243. package/queries/catalog/df-shape-query/df-shape-query-executor.js +1 -1
  244. package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +2 -2
  245. package/queries/catalog/df-shape-query/df-shape-query-format.js +6 -5
  246. package/queries/catalog/happens-before-query/happens-before-query-executor.d.ts +2 -1
  247. package/queries/catalog/happens-before-query/happens-before-query-executor.js +2 -1
  248. package/queries/catalog/happens-before-query/happens-before-query-format.d.ts +1 -1
  249. package/queries/catalog/id-map-query/id-map-query-format.d.ts +1 -1
  250. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.d.ts +1 -1
  251. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.js +1 -1
  252. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-format.d.ts +1 -1
  253. package/queries/catalog/linter-query/linter-query-format.d.ts +1 -1
  254. package/queries/catalog/linter-query/linter-query-format.js +13 -2
  255. package/queries/catalog/location-map-query/location-map-query-executor.js +2 -1
  256. package/queries/catalog/location-map-query/location-map-query-format.d.ts +1 -1
  257. package/queries/catalog/location-map-query/location-map-query-format.js +1 -1
  258. package/queries/catalog/normalized-ast-query/normalized-ast-query-format.d.ts +1 -1
  259. package/queries/catalog/origin-query/origin-query-format.d.ts +1 -1
  260. package/queries/catalog/project-query/project-query-executor.js +3 -1
  261. package/queries/catalog/project-query/project-query-format.d.ts +1 -1
  262. package/queries/catalog/resolve-value-query/resolve-value-query-executor.d.ts +2 -2
  263. package/queries/catalog/resolve-value-query/resolve-value-query-executor.js +2 -2
  264. package/queries/catalog/resolve-value-query/resolve-value-query-format.d.ts +1 -1
  265. package/queries/catalog/search-query/search-query-format.d.ts +1 -1
  266. package/queries/catalog/static-slice-query/static-slice-query-executor.js +1 -1
  267. package/queries/catalog/static-slice-query/static-slice-query-format.d.ts +1 -1
  268. package/queries/catalog/static-slice-query/static-slice-query-format.js +13 -1
  269. package/queries/query.d.ts +26 -18
  270. package/queries/query.js +21 -1
  271. package/r-bridge/lang-4.x/ast/model/collect.d.ts +2 -1
  272. package/r-bridge/lang-4.x/ast/model/collect.js +4 -0
  273. package/r-bridge/lang-4.x/ast/model/nodes/r-project.d.ts +29 -0
  274. package/r-bridge/lang-4.x/ast/model/nodes/r-project.js +15 -0
  275. package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +5 -7
  276. package/r-bridge/lang-4.x/ast/model/processing/decorate.js +24 -11
  277. package/r-bridge/lang-4.x/ast/model/type.d.ts +2 -0
  278. package/r-bridge/lang-4.x/ast/model/type.js +2 -0
  279. package/r-bridge/lang-4.x/ast/parser/json/format.js +1 -1
  280. package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +9 -8
  281. package/r-bridge/lang-4.x/ast/parser/json/parser.js +11 -10
  282. package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.d.ts +4 -3
  283. package/r-bridge/lang-4.x/ast/parser/main/internal/structure/normalize-root.js +20 -11
  284. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.d.ts +3 -3
  285. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-executor.js +5 -4
  286. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.d.ts +3 -2
  287. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.js +14 -5
  288. package/r-bridge/parser.d.ts +15 -5
  289. package/r-bridge/parser.js +27 -13
  290. package/r-bridge/retriever.d.ts +9 -15
  291. package/r-bridge/retriever.js +14 -5
  292. package/r-bridge/shell.d.ts +1 -1
  293. package/r-bridge/shell.js +1 -1
  294. package/reconstruct/auto-select/auto-select-defaults.d.ts +0 -1
  295. package/reconstruct/auto-select/magic-comments.js +1 -1
  296. package/reconstruct/reconstruct.d.ts +17 -9
  297. package/reconstruct/reconstruct.js +19 -8
  298. package/search/flowr-search.d.ts +12 -0
  299. package/search/search-executor/search-enrichers.d.ts +9 -2
  300. package/search/search-executor/search-enrichers.js +1 -3
  301. package/search/search-executor/search-generators.d.ts +1 -1
  302. package/search/search-executor/search-generators.js +9 -4
  303. package/slicing/criterion/collect-all.d.ts +3 -2
  304. package/slicing/criterion/collect-all.js +1 -1
  305. package/slicing/criterion/parse.js +4 -4
  306. package/statistics/features/supported/assignments/assignments.js +1 -1
  307. package/statistics/features/supported/control-flow/control-flow.js +1 -1
  308. package/statistics/features/supported/data-access/data-access.js +1 -1
  309. package/statistics/features/supported/defined-functions/defined-functions.js +1 -1
  310. package/statistics/features/supported/expression-list/statistics-expression-list.js +1 -1
  311. package/statistics/features/supported/loops/loops.js +1 -1
  312. package/statistics/features/supported/used-functions/used-functions.js +1 -1
  313. package/statistics/features/supported/variables/variables.js +1 -1
  314. package/statistics/statistics.js +3 -2
  315. package/util/assert.d.ts +4 -0
  316. package/util/assert.js +4 -0
  317. package/util/files.d.ts +1 -1
  318. package/util/files.js +1 -1
  319. package/util/mermaid/ast.d.ts +4 -3
  320. package/util/mermaid/ast.js +36 -8
  321. package/util/mermaid/cfg.js +1 -1
  322. package/util/version.js +1 -1
  323. package/documentation/print-analyzer-wiki.d.ts +0 -1
  324. package/documentation/print-analyzer-wiki.js +0 -141
  325. package/documentation/print-capabilities-markdown.d.ts +0 -1
  326. package/documentation/print-cfg-wiki.d.ts +0 -1
  327. package/documentation/print-core-wiki.d.ts +0 -5
  328. package/documentation/print-dataflow-graph-wiki.d.ts +0 -1
  329. package/documentation/print-engines-wiki.d.ts +0 -1
  330. package/documentation/print-faq-wiki.d.ts +0 -1
  331. package/documentation/print-faq-wiki.js +0 -18
  332. package/documentation/print-interface-wiki.d.ts +0 -1
  333. package/documentation/print-linter-issue.d.ts +0 -1
  334. package/documentation/print-linter-wiki.d.ts +0 -1
  335. package/documentation/print-linting-and-testing-wiki.d.ts +0 -1
  336. package/documentation/print-normalized-ast-wiki.d.ts +0 -1
  337. package/documentation/print-onboarding-wiki.d.ts +0 -1
  338. package/documentation/print-query-wiki.d.ts +0 -1
  339. package/documentation/print-readme.d.ts +0 -1
  340. package/documentation/print-search-wiki.d.ts +0 -1
  341. package/documentation/print-search-wiki.js +0 -74
  342. package/util/formats/adapter-format.d.ts +0 -6
  343. package/util/formats/adapter-format.js +0 -3
  344. package/util/formats/adapter.d.ts +0 -27
  345. package/util/formats/adapter.js +0 -58
  346. package/util/formats/adapters/r-adapter.d.ts +0 -4
  347. package/util/formats/adapters/r-adapter.js +0 -7
  348. package/util/formats/adapters/rmd-adapter.d.ts +0 -35
  349. package/util/formats/adapters/rmd-adapter.js +0 -100
@@ -57,7 +57,8 @@ exports.dataflowCommand = {
57
57
  clipboard.default.writeSync(mermaid);
58
58
  output.stdout(formatInfo(output, 'mermaid code', result));
59
59
  }
60
- catch { /* do nothing this is a service thing */ }
60
+ catch { /* do nothing this is a service thing */
61
+ }
61
62
  }
62
63
  };
63
64
  exports.dataflowStarCommand = {
@@ -4,6 +4,7 @@ exports.parseCommand = void 0;
4
4
  const format_1 = require("../../../r-bridge/lang-4.x/ast/parser/json/format");
5
5
  const normalize_meta_1 = require("../../../r-bridge/lang-4.x/ast/parser/main/normalize-meta");
6
6
  const retriever_1 = require("../../../r-bridge/retriever");
7
+ const flowr_file_1 = require("../../../project/context/flowr-file");
7
8
  function toDepthMap(entry) {
8
9
  const visit = [{ depth: 0, node: entry }];
9
10
  const result = [];
@@ -138,15 +139,26 @@ exports.parseCommand = {
138
139
  };
139
140
  },
140
141
  fn: async ({ output, analyzer }) => {
141
- const result = await analyzer.parse();
142
+ const result = (await analyzer.parse()).files;
142
143
  const parserInfo = analyzer.parserInformation();
143
144
  if (parserInfo.name === 'r-shell') {
144
- const object = (0, format_1.convertPreparedParsedData)((0, format_1.prepareParsedData)(result.parsed));
145
- output.stdout(depthListToTextTree(toDepthMap(object), output.formatter));
145
+ for (const { parsed, filePath } of result) {
146
+ if (filePath && filePath !== flowr_file_1.FlowrFile.INLINE_PATH) {
147
+ output.stdout(output.formatter.format(`File: ${filePath}\n`, { style: 4 /* FontStyles.Underline */ }));
148
+ }
149
+ const object = toDepthMap((0, format_1.convertPreparedParsedData)((0, format_1.prepareParsedData)(parsed)));
150
+ output.stdout(depthListToTextTree(object, output.formatter));
151
+ }
146
152
  }
147
153
  else {
148
154
  // print the tree-sitter ast
149
- output.stdout(depthListToTextTree(treeSitterToDepthList(result.parsed.rootNode), output.formatter));
155
+ for (const { parsed, filePath } of result) {
156
+ if (filePath && filePath !== flowr_file_1.FlowrFile.INLINE_PATH) {
157
+ output.stdout(output.formatter.format(`File: ${filePath}\n`, { style: 4 /* FontStyles.Underline */ }));
158
+ }
159
+ const object = treeSitterToDepthList(parsed.rootNode);
160
+ output.stdout(depthListToTextTree(object, output.formatter));
161
+ }
150
162
  }
151
163
  }
152
164
  };
@@ -65,7 +65,7 @@ async function processQueryArgs(output, analyzer, remainingArgs) {
65
65
  }
66
66
  if (input) {
67
67
  analyzer.reset();
68
- analyzer.addRequest((0, retriever_1.requestFromInput)(input));
68
+ analyzer.addRequest(input);
69
69
  }
70
70
  return {
71
71
  query: await (0, query_1.executeQueries)({
package/cli/repl/core.js CHANGED
@@ -150,28 +150,30 @@ async function replProcessStatement(output, statement, analyzer, allowRSessionAc
150
150
  const bold = (s) => output.formatter.format(s, { style: 1 /* FontStyles.Bold */ });
151
151
  if (processor) {
152
152
  try {
153
- const remainingLine = statement.slice(command.length + 2).trim();
154
- if (processor.isCodeCommand) {
155
- const args = processor.argsParser(remainingLine);
156
- if (args.rCode) {
157
- analyzer.reset();
158
- analyzer.addRequest((0, retriever_1.requestFromInput)(args.rCode));
153
+ await (0, query_1.genericWrapReplFailIfNoRequest)(async () => {
154
+ const remainingLine = statement.slice(command.length + 2).trim();
155
+ if (processor.isCodeCommand) {
156
+ const args = processor.argsParser(remainingLine);
157
+ if (args.rCode) {
158
+ analyzer.reset();
159
+ analyzer.addRequest(args.rCode);
160
+ }
161
+ await processor.fn({ output, analyzer, remainingArgs: args.remaining });
159
162
  }
160
- await processor.fn({ output, analyzer, remainingArgs: args.remaining });
161
- }
162
- else {
163
- await processor.fn({ output, analyzer, remainingLine, allowRSessionAccess });
164
- }
163
+ else {
164
+ await processor.fn({ output, analyzer, remainingLine, allowRSessionAccess });
165
+ }
166
+ }, output, analyzer);
165
167
  }
166
168
  catch (e) {
167
- output.stdout(`${bold(`Failed to execute command ${command}`)}: ${e?.message}. Using the ${bold('--verbose')} flag on startup may provide additional information.\n`);
169
+ output.stderr(`${bold(`Failed to execute command ${command}`)}: ${e?.message}. Using the ${bold('--verbose')} flag on startup may provide additional information.\n`);
168
170
  if (log_1.log.settings.minLevel < 6 /* LogLevel.Fatal */) {
169
171
  console.error(e);
170
172
  }
171
173
  }
172
174
  }
173
175
  else {
174
- output.stdout(`the command '${command}' is unknown, try ${bold(':help')} for more information\n`);
176
+ output.stderr(`the command '${command}' is unknown, try ${bold(':help')} for more information\n`);
175
177
  }
176
178
  }
177
179
  else {
@@ -206,6 +208,7 @@ async function repl({ analyzer, rl = readline.createInterface(makeDefaultReplRea
206
208
  rl.on('history', h => fs_1.default.writeFileSync(historyFile, h.join('\n'), { encoding: 'utf-8' }));
207
209
  }
208
210
  // the incredible repl :D, we kill it with ':quit'
211
+ // noinspection InfiniteLoopJS
209
212
  while (true) {
210
213
  await new Promise((resolve, reject) => {
211
214
  rl.question((0, prompt_1.prompt)(), answer => {
@@ -214,10 +214,11 @@ class FlowRServerConnection {
214
214
  else {
215
215
  throw new Error('Either content or filepath must be defined.');
216
216
  }
217
- const analyzer = await new flowr_analyzer_builder_1.FlowrAnalyzerBuilder(request)
217
+ const analyzer = await new flowr_analyzer_builder_1.FlowrAnalyzerBuilder()
218
218
  .setConfig(this.config)
219
219
  .setParser(this.parser)
220
220
  .build();
221
+ analyzer.addRequest(request);
221
222
  if (message.filetoken) {
222
223
  this.logger.info(`Storing file token ${message.filetoken}`);
223
224
  this.fileMap.set(message.filetoken, {
@@ -21,6 +21,7 @@ const time_1 = require("../../util/text/time");
21
21
  const tar_1 = require("tar");
22
22
  const ansi_1 = require("../../util/text/ansi");
23
23
  const config_1 = require("../../config");
24
+ const flowr_analyzer_context_1 = require("../../project/context/flowr-analyzer-context");
24
25
  function compressFolder(folder, target) {
25
26
  return (0, tar_1.create)({
26
27
  gzip: true,
@@ -62,7 +63,7 @@ async function getStatsForSingleFile(options, config) {
62
63
  if (stats.outputs.size === 1) {
63
64
  if (options['dump-json']) {
64
65
  const [, output] = [...stats.outputs.entries()][0];
65
- const cfg = (0, extract_cfg_1.extractCfg)(output.normalize, config, output.dataflow.graph);
66
+ const cfg = (0, extract_cfg_1.extractCfg)(output.normalize, (0, flowr_analyzer_context_1.contextFromInput)('', config), output.dataflow.graph);
66
67
  statistics_file_1.statisticsFileProvider.append('output-json', 'parse', await (0, print_1.printStepResult)(_00_parse_1.PARSE_WITH_R_SHELL_STEP, output.parse, 2 /* StepOutputFormat.Json */));
67
68
  statistics_file_1.statisticsFileProvider.append('output-json', 'normalize', await (0, print_1.printStepResult)(_10_normalize_1.NORMALIZE, output.normalize, 2 /* StepOutputFormat.Json */));
68
69
  statistics_file_1.statisticsFileProvider.append('output-json', 'dataflow', await (0, print_1.printStepResult)(_20_dataflow_1.STATIC_DATAFLOW, output.dataflow, 2 /* StepOutputFormat.Json */));
package/cli/slicer-app.js CHANGED
@@ -15,7 +15,6 @@ const print_1 = require("../benchmark/stats/print");
15
15
  const magic_comments_1 = require("../reconstruct/auto-select/magic-comments");
16
16
  const auto_select_defaults_1 = require("../reconstruct/auto-select/auto-select-defaults");
17
17
  const config_1 = require("../config");
18
- const adapter_1 = require("../util/formats/adapter");
19
18
  const options = (0, script_1.processCommandLineArgs)('slicer', ['input', 'criterion'], {
20
19
  subtitle: 'Slice R code based on a given slicing criterion',
21
20
  examples: [
@@ -32,8 +31,8 @@ async function getSlice() {
32
31
  (0, assert_1.guard)(options.criterion !== undefined, 'a slicing criterion must be given');
33
32
  const config = (0, config_1.getConfig)();
34
33
  await slicer.init(options['input-is-text']
35
- ? (0, adapter_1.requestFromText)(options.input.replaceAll('\\n', '\n'))
36
- : (0, adapter_1.requestFromFile)(options.input), config, options['no-magic-comments'] ? auto_select_defaults_1.doNotAutoSelect : (0, magic_comments_1.makeMagicCommentHandler)(auto_select_defaults_1.doNotAutoSelect));
34
+ ? { request: 'text', content: options.input.replaceAll('\\n', '\n') }
35
+ : { request: 'file', content: options.input }, config, options['no-magic-comments'] ? auto_select_defaults_1.doNotAutoSelect : (0, magic_comments_1.makeMagicCommentHandler)(auto_select_defaults_1.doNotAutoSelect));
37
36
  let mappedSlices = [];
38
37
  let reconstruct = undefined;
39
38
  const doSlicing = options.criterion.trim() !== '';
@@ -77,7 +76,7 @@ async function getSlice() {
77
76
  if (doSlicing && options.diff) {
78
77
  let originalCode = options.input;
79
78
  if (!options['input-is-text']) {
80
- const request = (0, adapter_1.requestFromFile)(options.input);
79
+ const request = { request: 'file', content: options.input };
81
80
  originalCode = request.request === 'text' ? request.content : fs_1.default.readFileSync(request.content).toString();
82
81
  }
83
82
  console.log((0, slice_diff_ansi_1.sliceDiffAnsi)(slice.result, normalize, new Set(mappedSlices.map(({ id }) => id)), originalCode));
package/cli/wiki.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Updates and optionally re-creates all flowR wikis.
3
+ */
4
+ export declare function makeAllWikis(force: boolean, filter: string[] | undefined): Promise<void>;
package/cli/wiki.js ADDED
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.makeAllWikis = makeAllWikis;
7
+ const doc_context_1 = require("../documentation/wiki-mk/doc-context");
8
+ const shell_1 = require("../r-bridge/shell");
9
+ const tree_sitter_executor_1 = require("../r-bridge/lang-4.x/tree-sitter/tree-sitter-executor");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const log_1 = require("../../test/functionality/_helper/log");
12
+ const command_line_usage_1 = __importDefault(require("command-line-usage"));
13
+ const command_line_args_1 = __importDefault(require("command-line-args"));
14
+ const version_1 = require("../util/version");
15
+ const wiki_faq_1 = require("../documentation/wiki-faq");
16
+ const ansi_1 = require("../util/text/ansi");
17
+ const documentation_1 = require("../documentation");
18
+ const wiki_cfg_1 = require("../documentation/wiki-cfg");
19
+ const wiki_onboarding_1 = require("../documentation/wiki-onboarding");
20
+ const wiki_analyzer_1 = require("../documentation/wiki-analyzer");
21
+ const issue_linting_rule_1 = require("../documentation/issue-linting-rule");
22
+ const doc_readme_1 = require("../documentation/doc-readme");
23
+ const wiki_linter_1 = require("../documentation/wiki-linter");
24
+ const os_1 = __importDefault(require("os"));
25
+ const Documents = [
26
+ new wiki_faq_1.WikiFaq(),
27
+ new documentation_1.WikiSearch(),
28
+ new wiki_cfg_1.WikiCfg(),
29
+ new documentation_1.WikiQuery(),
30
+ new wiki_onboarding_1.WikiOnboarding(),
31
+ new wiki_analyzer_1.WikiAnalyzer(),
32
+ new documentation_1.WikiEngine(),
33
+ new documentation_1.WikiNormalizedAst(),
34
+ new documentation_1.WikiCore(),
35
+ new documentation_1.WikiInterface(),
36
+ new documentation_1.WikiDataflowGraph(),
37
+ new documentation_1.WikiLintingAndTesting(),
38
+ new wiki_linter_1.WikiLinter(),
39
+ new issue_linting_rule_1.IssueLintingRule(),
40
+ new doc_readme_1.DocReadme(),
41
+ new documentation_1.DocCapabilities()
42
+ ];
43
+ function sortByLeastRecentChanged(wikis) {
44
+ return wikis.slice().sort((a, b) => {
45
+ const aStat = fs_1.default.existsSync(a.getProducer()) ? fs_1.default.statSync(a.getProducer()) : undefined;
46
+ const bStat = fs_1.default.existsSync(b.getProducer()) ? fs_1.default.statSync(b.getProducer()) : undefined;
47
+ const aMTime = aStat ? aStat.mtime.getTime() : 0;
48
+ const bMTime = bStat ? bStat.mtime.getTime() : 0;
49
+ return bMTime - aMTime;
50
+ });
51
+ }
52
+ /**
53
+ * Updates and optionally re-creates all flowR wikis.
54
+ */
55
+ async function makeAllWikis(force, filter) {
56
+ const setupStart = new Date();
57
+ console.log('Setting up wiki generation...');
58
+ const shell = new shell_1.RShell();
59
+ console.log(' * R shell initialized');
60
+ await tree_sitter_executor_1.TreeSitterExecutor.initTreeSitter();
61
+ const treeSitter = new tree_sitter_executor_1.TreeSitterExecutor();
62
+ console.log(' * Tree-sitter parser initialized');
63
+ const ctx = (0, doc_context_1.makeDocContextForTypes)(shell);
64
+ console.log(' * Wiki context prepared');
65
+ if (force) {
66
+ console.log(ansi_1.ansiFormatter.format('Forcing wiki regeneration (existing files will be overwritten)', { style: 1 /* FontStyles.Bold */, color: 3 /* Colors.Yellow */, effect: ansi_1.ColorEffect.Foreground }));
67
+ }
68
+ const info = {
69
+ ctx,
70
+ shell, treeSitter,
71
+ force,
72
+ readFileSync(f) {
73
+ try {
74
+ return fs_1.default.readFileSync(f);
75
+ }
76
+ catch {
77
+ return undefined;
78
+ }
79
+ },
80
+ writeFileSync: fs_1.default.writeFileSync
81
+ };
82
+ console.log(`Setup for wiki generation took ${(new Date().getTime() - setupStart.getTime())}ms`);
83
+ const changedWikis = new Set();
84
+ try {
85
+ const sortedDocs = sortByLeastRecentChanged(Documents);
86
+ console.log(`Generating ${sortedDocs.length} wikis/docs, sorted by most recently updated...`);
87
+ for (const doc of sortedDocs) {
88
+ const type = doc.getTarget().toLowerCase().includes('wiki') ? 'Wiki' : 'Doc';
89
+ if (filter && !filter.some(f => doc.getTarget().includes(f))) {
90
+ console.log(` * Skipping ${type} (filtered out): ${doc.getTarget()}`);
91
+ continue;
92
+ }
93
+ const now = new Date();
94
+ console.log(ansi_1.ansiFormatter.format(` [${doc.getTarget()}] Updating ${type}...`, { style: 1 /* FontStyles.Bold */, color: 6 /* Colors.Cyan */, effect: ansi_1.ColorEffect.Foreground }));
95
+ const changed = await doc.make(info);
96
+ const text = changed ? `${type} updated` : `${type} identical, no changes made`;
97
+ if (changed) {
98
+ changedWikis.add(doc.getTarget());
99
+ }
100
+ const color = changed ? 2 /* Colors.Green */ : 7 /* Colors.White */;
101
+ console.log(ansi_1.ansiFormatter.format(` [${doc.getTarget()}] ${text}: ${doc.getTarget()} (took ${new Date().getTime() - now.getTime()}ms)`, { color, effect: ansi_1.ColorEffect.Foreground }));
102
+ for (const out of doc.getWrittenSubfiles()) {
103
+ changedWikis.add(out);
104
+ console.log(` - Also updated: ${out}`);
105
+ }
106
+ }
107
+ }
108
+ catch (error) {
109
+ console.error('Error while generating documents:', error);
110
+ }
111
+ finally {
112
+ shell.close();
113
+ }
114
+ console.log('All wikis processed in ' + (new Date().getTime() - setupStart.getTime()) + 'ms');
115
+ console.log(` * Changed ${changedWikis.size} wiki/doc files.`);
116
+ // write a temp file in the os temp dir with the changed wikis
117
+ const filename = `${os_1.default.tmpdir()}/flowr-wiki-changed-files.txt`;
118
+ fs_1.default.writeFileSync(`${filename}`, Array.from(changedWikis).join('\n'));
119
+ console.log(` * List of changed wikis/docs written to ${filename}`);
120
+ }
121
+ if (require.main === module) {
122
+ const wikiOptions = [
123
+ { name: 'force', alias: 'F', type: Boolean, description: 'Overwrite existing wiki files, even if nothing changes' },
124
+ { name: 'filter', alias: 'f', type: String, multiple: true, description: 'Only generate wikis whose target path contains the given string' },
125
+ { name: 'help', alias: 'h', type: Boolean, description: 'Print this usage guide for the wiki generator' },
126
+ { name: 'keep-alive', type: Boolean, description: 'Keep-alive wiki generator (only sensible with a reloading script like ts-node-dev)' },
127
+ ];
128
+ const optionHelp = [
129
+ {
130
+ header: `flowR (version ${(0, version_1.flowrVersion)().toString()})`,
131
+ content: 'Documentation (wiki, issue, ...) generator for flowR'
132
+ },
133
+ {
134
+ header: 'Synopsis',
135
+ content: [
136
+ '$ wiki {bold --help}',
137
+ '$ wiki {bold --force}',
138
+ '$ wiki {bold --filter} {italic "dataflow"}'
139
+ ]
140
+ },
141
+ {
142
+ header: 'Options',
143
+ optionList: wikiOptions
144
+ }
145
+ ];
146
+ (0, log_1.setMinLevelOfAllLogs)(6 /* LogLevel.Fatal */);
147
+ // parse args
148
+ const options = (0, command_line_args_1.default)(wikiOptions);
149
+ if (options.help) {
150
+ console.log((0, command_line_usage_1.default)(optionHelp));
151
+ process.exit(0);
152
+ }
153
+ void makeAllWikis(options.force, options.filter).catch(err => {
154
+ console.error('Error while generating wikis:', err);
155
+ process.exit(1);
156
+ }).then(() => {
157
+ if (options['keep-alive']) {
158
+ console.log('Wiki generator running in keep-alive mode...');
159
+ setInterval(() => {
160
+ // do nothing, just keep alive
161
+ }, 100);
162
+ }
163
+ });
164
+ }
165
+ //# sourceMappingURL=wiki.js.map
package/config.d.ts CHANGED
@@ -98,6 +98,10 @@ export interface FlowrConfigOptions extends MergeableRecord {
98
98
  };
99
99
  };
100
100
  };
101
+ readonly project: {
102
+ /** Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files */
103
+ resolveUnknownPathsOnDisk: boolean;
104
+ };
101
105
  /**
102
106
  * The engines to use for interacting with R code. Currently, supports {@link TreeSitterEngineConfig} and {@link RShellEngineConfig}.
103
107
  * An empty array means all available engines will be used.
package/config.js CHANGED
@@ -65,6 +65,9 @@ exports.defaultConfigOptions = {
65
65
  }
66
66
  }
67
67
  },
68
+ project: {
69
+ resolveUnknownPathsOnDisk: true
70
+ },
68
71
  engines: [],
69
72
  defaultEngine: 'tree-sitter',
70
73
  solver: {
@@ -103,6 +106,9 @@ exports.flowrConfigFileSchema = joi_1.default.object({
103
106
  }).optional().description('Do you want to overwrite (parts) of the builtin definition?')
104
107
  }).optional().description('Semantics regarding how to handle the R environment.')
105
108
  }).description('Configure language semantics and how flowR handles them.'),
109
+ project: joi_1.default.object({
110
+ resolveUnknownPathsOnDisk: joi_1.default.boolean().optional().description('Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files.')
111
+ }).description('Project specific configuration options.'),
106
112
  engines: joi_1.default.array().items(joi_1.default.alternatives(joi_1.default.object({
107
113
  type: joi_1.default.string().required().valid('tree-sitter').description('Use the tree sitter engine.'),
108
114
  wasmPath: joi_1.default.string().optional().description('The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.'),
@@ -54,7 +54,12 @@ class CfgConditionalDeadCodeRemoval extends semantic_cfg_guided_visitor_1.Semant
54
54
  }
55
55
  }
56
56
  handleValuesFor(id, valueId) {
57
- const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(valueId, { graph: this.config.dfg, full: true, idMap: this.config.normalizedAst.idMap, resolve: this.config.flowrConfig.solver.variables }));
57
+ const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(valueId, {
58
+ graph: this.config.dfg,
59
+ full: true,
60
+ idMap: this.config.normalizedAst.idMap,
61
+ resolve: this.config.ctx.config.solver.variables
62
+ }));
58
63
  if (values === undefined || values.elements.length !== 1 || values.elements[0].type != 'logical' || !(0, r_value_1.isValue)(values.elements[0].value)) {
59
64
  this.unableToCalculateValue(id);
60
65
  return;
@@ -74,7 +79,12 @@ class CfgConditionalDeadCodeRemoval extends semantic_cfg_guided_visitor_1.Semant
74
79
  if (data.call.args.length !== 1 || data.call.args[0] === r_function_call_1.EmptyArgument) {
75
80
  return undefined;
76
81
  }
77
- const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(data.call.args[0].nodeId, { graph: this.config.dfg, full: true, idMap: this.config.normalizedAst.idMap, resolve: this.config.flowrConfig.solver.variables }));
82
+ const values = (0, general_1.valueSetGuard)((0, alias_tracking_1.resolveIdToValue)(data.call.args[0].nodeId, {
83
+ graph: this.config.dfg,
84
+ full: true,
85
+ idMap: this.config.normalizedAst.idMap,
86
+ resolve: this.config.ctx.config.solver.variables
87
+ }));
78
88
  if (values === undefined || values.elements.length !== 1 || values.elements[0].type != 'logical' || !(0, r_value_1.isValue)(values.elements[0].value)) {
79
89
  return undefined;
80
90
  }
@@ -115,7 +125,7 @@ function cfgAnalyzeDeadCode(cfg, info) {
115
125
  controlFlow: cfg,
116
126
  normalizedAst: info.ast,
117
127
  dfg: info.dfg,
118
- flowrConfig: info.config,
128
+ ctx: info.ctx,
119
129
  defaultVisitingOrder: 'forward',
120
130
  });
121
131
  visitor.start();
@@ -3,13 +3,16 @@ import type { NormalizedAst } from '../r-bridge/lang-4.x/ast/model/processing/de
3
3
  import type { DataflowGraph } from '../dataflow/graph/graph';
4
4
  import type { NodeId } from '../r-bridge/lang-4.x/ast/model/processing/node-id';
5
5
  import { cfgAnalyzeDeadCode } from './cfg-dead-code';
6
- import type { FlowrConfigOptions } from '../config';
6
+ import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
7
7
  export interface CfgPassInfo {
8
8
  ast?: NormalizedAst;
9
9
  dfg?: DataflowGraph;
10
- config: FlowrConfigOptions;
10
+ ctx: ReadOnlyFlowrAnalyzerContext;
11
11
  }
12
12
  export type CfgSimplificationPass = (cfg: ControlFlowInformation, info: CfgPassInfo) => ControlFlowInformation;
13
+ /**
14
+ * All available control flow graph simplification passes.
15
+ */
13
16
  export declare const CfgSimplificationPasses: {
14
17
  readonly 'unique-cf-sets': typeof uniqueControlFlowSets;
15
18
  readonly 'analyze-dead-code': typeof cfgAnalyzeDeadCode;
@@ -6,6 +6,9 @@ exports.cfgFindAllReachable = cfgFindAllReachable;
6
6
  const cfg_to_basic_blocks_1 = require("./cfg-to-basic-blocks");
7
7
  const simple_visitor_1 = require("./simple-visitor");
8
8
  const cfg_dead_code_1 = require("./cfg-dead-code");
9
+ /**
10
+ * All available control flow graph simplification passes.
11
+ */
9
12
  exports.CfgSimplificationPasses = {
10
13
  'unique-cf-sets': uniqueControlFlowSets,
11
14
  'analyze-dead-code': cfg_dead_code_1.cfgAnalyzeDeadCode,
@@ -1,24 +1,30 @@
1
1
  import { type QuadSerializationConfiguration } from '../util/quads';
2
+ import type { NodeId } from '../r-bridge/lang-4.x/ast/model/processing/node-id';
2
3
  import type { NormalizedAst, ParentInformation } from '../r-bridge/lang-4.x/ast/model/processing/decorate';
3
4
  import type { DataflowGraph } from '../dataflow/graph/graph';
5
+ import type { DataflowGraphVertexFunctionCall } from '../dataflow/graph/vertex';
4
6
  import { type ControlFlowInformation } from './control-flow-graph';
5
7
  import { type CfgSimplificationPassName } from './cfg-simplification';
6
- import type { FlowrConfigOptions } from '../config';
8
+ import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
7
9
  /**
8
10
  * Given a normalized AST, this approximates the control flow graph of the program.
9
11
  * This view is different from the computation of the dataflow graph and may differ,
10
12
  * especially because it focuses on intra-procedural analysis.
11
13
  * @param ast - the normalized AST
12
- * @param config - the flowR config
14
+ * @param ctx - the flowR context
13
15
  * @param graph - additional dataflow facts to consider by the control flow extraction
14
16
  * @param simplifications - a list of simplification passes to apply to the control flow graph
15
17
  * @see {@link extractCfgQuick} - for a simplified version of this function
16
18
  */
17
- export declare function extractCfg<Info = ParentInformation>(ast: NormalizedAst<Info & ParentInformation>, config: FlowrConfigOptions, graph?: DataflowGraph, simplifications?: readonly CfgSimplificationPassName[]): ControlFlowInformation;
19
+ export declare function extractCfg<Info = ParentInformation>(ast: NormalizedAst<Info & ParentInformation>, ctx: ReadOnlyFlowrAnalyzerContext, graph?: DataflowGraph, simplifications?: readonly CfgSimplificationPassName[]): ControlFlowInformation;
18
20
  /**
19
21
  * A version of {@link extractCfg} that is much quicker and does not apply any simplifications or dataflow information.
20
22
  */
21
23
  export declare function extractCfgQuick<Info = ParentInformation>(ast: NormalizedAst<Info>): ControlFlowInformation<import("./control-flow-graph").CfgSimpleVertex>;
24
+ /**
25
+ * Extracts all function call vertices from the given control flow information and dataflow graph.
26
+ */
27
+ export declare function getCallsInCfg(cfg: ControlFlowInformation, graph: DataflowGraph): Map<NodeId, Required<DataflowGraphVertexFunctionCall>>;
22
28
  export declare const ResolvedCallSuffix = "-resolved-call-exit";
23
29
  /**
24
30
  * Convert a cfg to RDF quads.
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ResolvedCallSuffix = void 0;
4
4
  exports.extractCfg = extractCfg;
5
5
  exports.extractCfgQuick = extractCfgQuick;
6
+ exports.getCallsInCfg = getCallsInCfg;
6
7
  exports.cfg2quads = cfg2quads;
7
8
  const quads_1 = require("../util/quads");
8
9
  const fold_1 = require("../r-bridge/lang-4.x/ast/model/processing/fold");
@@ -56,19 +57,58 @@ function dataflowCfgFolds(dataflowGraph) {
56
57
  * This view is different from the computation of the dataflow graph and may differ,
57
58
  * especially because it focuses on intra-procedural analysis.
58
59
  * @param ast - the normalized AST
59
- * @param config - the flowR config
60
+ * @param ctx - the flowR context
60
61
  * @param graph - additional dataflow facts to consider by the control flow extraction
61
62
  * @param simplifications - a list of simplification passes to apply to the control flow graph
62
63
  * @see {@link extractCfgQuick} - for a simplified version of this function
63
64
  */
64
- function extractCfg(ast, config, graph, simplifications) {
65
- return (0, cfg_simplification_1.simplifyControlFlowInformation)((0, fold_1.foldAst)(ast.ast, graph ? dataflowCfgFolds(graph) : cfgFolds), { ast, dfg: graph, config }, simplifications);
65
+ function extractCfg(ast, ctx, graph, simplifications) {
66
+ return (0, cfg_simplification_1.simplifyControlFlowInformation)(cfgFoldProject(ast.ast, graph ? dataflowCfgFolds(graph) : cfgFolds), { ast, dfg: graph, ctx }, simplifications);
66
67
  }
67
68
  /**
68
69
  * A version of {@link extractCfg} that is much quicker and does not apply any simplifications or dataflow information.
69
70
  */
70
71
  function extractCfgQuick(ast) {
71
- return (0, fold_1.foldAst)(ast.ast, cfgFolds);
72
+ return cfgFoldProject(ast.ast, cfgFolds);
73
+ }
74
+ /**
75
+ * Extracts all function call vertices from the given control flow information and dataflow graph.
76
+ */
77
+ function getCallsInCfg(cfg, graph) {
78
+ const calls = new Map();
79
+ for (const vertexId of cfg.graph.vertices().keys()) {
80
+ const vertex = graph.getVertex(vertexId, true);
81
+ if ((0, vertex_1.isFunctionCallVertex)(vertex)) {
82
+ calls.set(vertexId, vertex);
83
+ }
84
+ }
85
+ return calls;
86
+ }
87
+ function cfgFoldProject(proj, folds) {
88
+ if (proj.files.length === 0) {
89
+ return (0, control_flow_graph_1.emptyControlFlowInformation)();
90
+ }
91
+ else if (proj.files.length === 1) {
92
+ return (0, fold_1.foldAst)(proj.files[0].root, folds);
93
+ }
94
+ const perProject = proj.files.map(file => (0, fold_1.foldAst)(file.root, folds));
95
+ const finalGraph = perProject[0].graph;
96
+ for (let i = 1; i < perProject.length; i++) {
97
+ finalGraph.mergeWith(perProject[i].graph);
98
+ for (const exitPoint of perProject[i - 1].exitPoints) {
99
+ for (const entryPoint of perProject[i].entryPoints) {
100
+ finalGraph.addEdge(entryPoint, exitPoint, { label: 0 /* CfgEdgeType.Fd */ });
101
+ }
102
+ }
103
+ }
104
+ return {
105
+ breaks: perProject.flatMap(e => e.breaks),
106
+ nexts: perProject.flatMap(e => e.nexts),
107
+ returns: perProject.flatMap(e => e.returns),
108
+ exitPoints: perProject[perProject.length - 1].exitPoints,
109
+ entryPoints: perProject[0].entryPoints,
110
+ graph: finalGraph
111
+ };
72
112
  }
73
113
  function cfgLeaf(type) {
74
114
  return ({ info: { id } }) => {
@@ -13,9 +13,9 @@ import type { NoInfo, RNode } from '../r-bridge/lang-4.x/ast/model/model';
13
13
  import type { RSymbol } from '../r-bridge/lang-4.x/ast/model/nodes/r-symbol';
14
14
  import type { BuiltInProcessorMapper } from '../dataflow/environments/built-in';
15
15
  import type { RExpressionList } from '../r-bridge/lang-4.x/ast/model/nodes/r-expression-list';
16
- import type { FlowrConfigOptions } from '../config';
16
+ import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
17
17
  export interface SemanticCfgGuidedVisitorConfiguration<OtherInfo = NoInfo, ControlFlow extends ControlFlowInformation = ControlFlowInformation, Ast extends NormalizedAst<OtherInfo> = NormalizedAst<OtherInfo>, Dfg extends DataflowGraph = DataflowGraph> extends DataflowCfgGuidedVisitorConfiguration<ControlFlow, Dfg>, SyntaxCfgGuidedVisitorConfiguration<OtherInfo, ControlFlow, Ast> {
18
- readonly flowrConfig: FlowrConfigOptions;
18
+ readonly ctx: ReadOnlyFlowrAnalyzerContext;
19
19
  }
20
20
  /**
21
21
  * This visitor extends on the {@link DataflowAwareCfgGuidedVisitor} by dispatching visitors for separate function calls as well,
@@ -17,7 +17,7 @@ function visitCfgInReverseOrder(graph, startNodes,
17
17
  // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- void is used to indicate that the return value is ignored/we never stop
18
18
  visitor) {
19
19
  const visited = new Set();
20
- let queue = [...startNodes];
20
+ let queue = startNodes.slice();
21
21
  const hasBb = graph.mayHaveBasicBlocks();
22
22
  while (queue.length > 0) {
23
23
  const current = queue.pop();
@@ -36,7 +36,7 @@ visitor) {
36
36
  }
37
37
  const incoming = graph.outgoingEdges(current);
38
38
  if (incoming) {
39
- queue.push(...incoming.keys());
39
+ queue = queue.concat(incoming.keys().toArray());
40
40
  }
41
41
  }
42
42
  }
@@ -1,8 +1,8 @@
1
- import type { FlowrConfigOptions } from '../config';
2
1
  import type { DataflowGraph } from '../dataflow/graph/graph';
3
2
  import type { NormalizedAst } from '../r-bridge/lang-4.x/ast/model/processing/decorate';
4
3
  import type { NodeId } from '../r-bridge/lang-4.x/ast/model/processing/node-id';
5
4
  import type { ControlFlowInformation } from './control-flow-graph';
5
+ import type { ReadOnlyFlowrAnalyzerContext } from '../project/context/flowr-analyzer-context';
6
6
  export declare const loopyFunctions: Set<"builtin:default" | "builtin:eval" | "builtin:apply" | "builtin:expression-list" | "builtin:source" | "builtin:access" | "builtin:if-then-else" | "builtin:get" | "builtin:rm" | "builtin:library" | "builtin:assignment" | "builtin:special-bin-op" | "builtin:pipe" | "builtin:function-definition" | "builtin:quote" | "builtin:for-loop" | "builtin:repeat-loop" | "builtin:while-loop" | "builtin:replacement" | "builtin:list" | "builtin:vector">;
7
7
  /**
8
8
  * Checks whether a loop only loops once
@@ -10,7 +10,7 @@ export declare const loopyFunctions: Set<"builtin:default" | "builtin:eval" | "b
10
10
  * @param dataflow - dataflow graph
11
11
  * @param controlflow - control flow graph
12
12
  * @param ast - normalized ast
13
- * @param config - current flowr config
13
+ * @param ctx - current flowr analyzer context
14
14
  * @returns true if the given loop only iterates once
15
15
  */
16
- export declare function onlyLoopsOnce(loop: NodeId, dataflow: DataflowGraph, controlflow: ControlFlowInformation, ast: NormalizedAst, config: FlowrConfigOptions): boolean | undefined;
16
+ export declare function onlyLoopsOnce(loop: NodeId, dataflow: DataflowGraph, controlflow: ControlFlowInformation, ast: NormalizedAst, ctx: ReadOnlyFlowrAnalyzerContext): boolean | undefined;