@eagleoutice/flowr 2.9.12 → 2.9.14

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 (233) hide show
  1. package/README.md +35 -23
  2. package/abstract-interpretation/absint-visitor.d.ts +1 -1
  3. package/abstract-interpretation/absint-visitor.js +20 -20
  4. package/abstract-interpretation/data-frame/mappers/replacement-mapper.js +2 -2
  5. package/benchmark/slicer.d.ts +5 -3
  6. package/benchmark/slicer.js +26 -10
  7. package/benchmark/stats/print.js +12 -0
  8. package/benchmark/stats/stats.d.ts +3 -2
  9. package/benchmark/stats/stats.js +1 -1
  10. package/benchmark/summarizer/data.d.ts +1 -0
  11. package/benchmark/summarizer/second-phase/process.js +5 -0
  12. package/cli/benchmark-app.d.ts +1 -0
  13. package/cli/benchmark-app.js +1 -0
  14. package/cli/benchmark-helper-app.d.ts +2 -1
  15. package/cli/benchmark-helper-app.js +6 -3
  16. package/cli/common/options.d.ts +8 -0
  17. package/cli/common/options.js +3 -1
  18. package/cli/common/scripts-info.d.ts +8 -0
  19. package/cli/export-quads-app.js +1 -1
  20. package/cli/flowr.js +3 -3
  21. package/cli/repl/commands/repl-dataflow.js +5 -5
  22. package/cli/repl/core.d.ts +3 -3
  23. package/cli/repl/parser/slice-query-parser.d.ts +1 -1
  24. package/cli/repl/parser/slice-query-parser.js +2 -2
  25. package/cli/repl/server/connection.d.ts +2 -2
  26. package/cli/repl/server/connection.js +2 -2
  27. package/cli/repl/server/messages/message-slice.d.ts +1 -1
  28. package/cli/repl/server/messages/message-slice.js +2 -2
  29. package/cli/repl/server/server.d.ts +2 -2
  30. package/cli/script-core/statistics-core.d.ts +2 -2
  31. package/cli/script-core/statistics-helper-core.d.ts +2 -2
  32. package/cli/script-core/statistics-helper-core.js +1 -1
  33. package/cli/slicer-app.js +2 -2
  34. package/cli/statistics-app.js +1 -1
  35. package/cli/statistics-helper-app.js +1 -1
  36. package/cli/wiki.js +2 -2
  37. package/config.d.ts +65 -24
  38. package/config.js +197 -161
  39. package/control-flow/extract-cfg.js +7 -10
  40. package/control-flow/semantic-cfg-guided-visitor.d.ts +1 -1
  41. package/control-flow/semantic-cfg-guided-visitor.js +43 -43
  42. package/control-flow/useless-loop.d.ts +1 -1
  43. package/control-flow/useless-loop.js +3 -3
  44. package/core/print/dataflow-printer.d.ts +0 -14
  45. package/core/print/dataflow-printer.js +0 -21
  46. package/core/steps/all/core/20-dataflow.d.ts +3 -3
  47. package/core/steps/all/core/20-dataflow.js +3 -2
  48. package/core/steps/all/static-slicing/00-slice.d.ts +2 -5
  49. package/core/steps/all/static-slicing/00-slice.js +6 -8
  50. package/core/steps/pipeline/default-pipelines.d.ts +89 -89
  51. package/core/steps/pipeline-step.d.ts +2 -2
  52. package/dataflow/environments/built-in-proc-name.d.ts +83 -0
  53. package/dataflow/environments/built-in-proc-name.js +88 -0
  54. package/dataflow/environments/built-in.d.ts +1 -83
  55. package/dataflow/environments/built-in.js +37 -120
  56. package/dataflow/environments/default-builtin-config.d.ts +1 -1
  57. package/dataflow/environments/default-builtin-config.js +75 -75
  58. package/dataflow/environments/identifier.d.ts +1 -0
  59. package/dataflow/environments/identifier.js +1 -0
  60. package/dataflow/eval/resolve/alias-tracking.js +12 -15
  61. package/dataflow/eval/resolve/resolve.js +2 -2
  62. package/dataflow/fn/exceptions-of-function.d.ts +1 -1
  63. package/dataflow/fn/exceptions-of-function.js +2 -2
  64. package/dataflow/graph/call-graph.d.ts +49 -19
  65. package/dataflow/graph/call-graph.js +117 -114
  66. package/dataflow/graph/dataflowgraph-builder.d.ts +1 -1
  67. package/dataflow/graph/dataflowgraph-builder.js +2 -2
  68. package/dataflow/graph/df-helper.d.ts +132 -0
  69. package/dataflow/graph/df-helper.js +131 -0
  70. package/dataflow/graph/diff-dataflow-graph.d.ts +5 -10
  71. package/dataflow/graph/diff-dataflow-graph.js +3 -28
  72. package/dataflow/graph/edge.d.ts +1 -0
  73. package/dataflow/graph/edge.js +1 -0
  74. package/dataflow/graph/graph-helper.d.ts +55 -0
  75. package/dataflow/graph/graph-helper.js +105 -0
  76. package/dataflow/graph/graph.d.ts +6 -1
  77. package/dataflow/graph/graph.js +14 -9
  78. package/dataflow/graph/vertex.d.ts +1 -1
  79. package/dataflow/info.d.ts +14 -4
  80. package/dataflow/info.js +28 -16
  81. package/dataflow/internal/linker.d.ts +14 -10
  82. package/dataflow/internal/linker.js +29 -32
  83. package/dataflow/internal/process/functions/call/built-in/built-in-access.js +5 -5
  84. package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +4 -4
  85. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +7 -6
  86. package/dataflow/internal/process/functions/call/built-in/built-in-eval.d.ts +1 -1
  87. package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +5 -5
  88. package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +2 -2
  89. package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +2 -2
  90. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +4 -4
  91. package/dataflow/internal/process/functions/call/built-in/built-in-get.js +2 -2
  92. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +3 -3
  93. package/dataflow/internal/process/functions/call/built-in/built-in-library.js +2 -2
  94. package/dataflow/internal/process/functions/call/built-in/built-in-list.js +2 -2
  95. package/dataflow/internal/process/functions/call/built-in/built-in-local.d.ts +1 -1
  96. package/dataflow/internal/process/functions/call/built-in/built-in-local.js +5 -5
  97. package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +2 -2
  98. package/dataflow/internal/process/functions/call/built-in/built-in-quote.js +2 -2
  99. package/dataflow/internal/process/functions/call/built-in/built-in-recall.js +2 -2
  100. package/dataflow/internal/process/functions/call/built-in/built-in-register-hook.js +5 -5
  101. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +2 -2
  102. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.d.ts +1 -1
  103. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +5 -4
  104. package/dataflow/internal/process/functions/call/built-in/built-in-rm.js +2 -2
  105. package/dataflow/internal/process/functions/call/built-in/built-in-s-seven-dispatch.js +3 -3
  106. package/dataflow/internal/process/functions/call/built-in/built-in-s-seven-new-generic.js +3 -3
  107. package/dataflow/internal/process/functions/call/built-in/built-in-s-three-dispatch.d.ts +1 -1
  108. package/dataflow/internal/process/functions/call/built-in/built-in-s-three-dispatch.js +7 -7
  109. package/dataflow/internal/process/functions/call/built-in/built-in-source.d.ts +2 -2
  110. package/dataflow/internal/process/functions/call/built-in/built-in-source.js +23 -12
  111. package/dataflow/internal/process/functions/call/built-in/built-in-special-bin-op.js +3 -3
  112. package/dataflow/internal/process/functions/call/built-in/built-in-stop-if-not.js +2 -2
  113. package/dataflow/internal/process/functions/call/built-in/built-in-try-catch.js +6 -9
  114. package/dataflow/internal/process/functions/call/built-in/built-in-vector.js +2 -2
  115. package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +2 -2
  116. package/dataflow/internal/process/functions/call/known-call-handling.js +2 -2
  117. package/dataflow/internal/process/functions/call/named-call-handling.d.ts +1 -1
  118. package/dataflow/internal/process/functions/call/named-call-handling.js +1 -1
  119. package/dataflow/internal/process/functions/call/unnamed-call-handling.js +2 -2
  120. package/dataflow/internal/process/process-uninteresting-leaf.d.ts +1 -1
  121. package/dataflow/internal/process/process-uninteresting-leaf.js +1 -1
  122. package/dataflow/origin/dfg-get-origin.d.ts +1 -1
  123. package/dataflow/origin/dfg-get-symbol-refs.js +6 -6
  124. package/documentation/doc-readme.js +2 -2
  125. package/documentation/doc-util/doc-dfg.d.ts +3 -0
  126. package/documentation/doc-util/doc-dfg.js +5 -7
  127. package/documentation/doc-util/doc-normalized-ast.d.ts +0 -6
  128. package/documentation/doc-util/doc-normalized-ast.js +0 -23
  129. package/documentation/doc-util/doc-structure.js +3 -3
  130. package/documentation/doc-util/doc-types.js +3 -3
  131. package/documentation/wiki-analyzer.js +7 -5
  132. package/documentation/wiki-core.js +6 -7
  133. package/documentation/wiki-dataflow-graph.js +15 -13
  134. package/documentation/wiki-interface.js +8 -6
  135. package/documentation/wiki-linter.js +6 -5
  136. package/documentation/wiki-mk/doc-context.js +3 -4
  137. package/documentation/wiki-normalized-ast.js +5 -4
  138. package/documentation/wiki-query.js +28 -3
  139. package/engines.d.ts +2 -2
  140. package/engines.js +4 -4
  141. package/linter/linter-rules.d.ts +24 -1
  142. package/linter/linter-rules.js +3 -1
  143. package/linter/rules/dataframe-access-validation.js +5 -5
  144. package/linter/rules/naming-convention.d.ts +1 -1
  145. package/linter/rules/naming-convention.js +7 -3
  146. package/linter/rules/seeded-randomness.js +2 -2
  147. package/linter/rules/stop-with-call-arg.d.ts +35 -0
  148. package/linter/rules/stop-with-call-arg.js +72 -0
  149. package/linter/rules/useless-loop.d.ts +1 -1
  150. package/package.json +3 -1
  151. package/project/cache/flowr-analyzer-cache.d.ts +1 -1
  152. package/project/cache/flowr-analyzer-cache.js +1 -1
  153. package/project/context/flowr-analyzer-context.d.ts +6 -6
  154. package/project/context/flowr-analyzer-context.js +2 -2
  155. package/project/context/flowr-analyzer-files-context.d.ts +2 -2
  156. package/project/context/flowr-analyzer-files-context.js +28 -8
  157. package/project/flowr-analyzer-builder.d.ts +13 -6
  158. package/project/flowr-analyzer-builder.js +12 -3
  159. package/project/flowr-analyzer.d.ts +4 -4
  160. package/queries/catalog/call-context-query/identify-link-to-nested-call-relation.js +2 -2
  161. package/queries/catalog/call-graph-query/call-graph-query-format.d.ts +1 -1
  162. package/queries/catalog/call-graph-query/call-graph-query-format.js +2 -2
  163. package/queries/catalog/cluster-query/cluster-query-format.js +2 -2
  164. package/queries/catalog/config-query/config-query-format.d.ts +5 -5
  165. package/queries/catalog/dataflow-lens-query/dataflow-lens-query-format.js +2 -2
  166. package/queries/catalog/dataflow-query/dataflow-query-format.js +2 -2
  167. package/queries/catalog/df-shape-query/df-shape-query-executor.js +1 -2
  168. package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +2 -2
  169. package/queries/catalog/does-call-query/does-call-query-executor.js +2 -2
  170. package/queries/catalog/does-call-query/does-call-query-format.d.ts +2 -2
  171. package/queries/catalog/files-query/files-query-format.d.ts +3 -3
  172. package/queries/catalog/happens-before-query/happens-before-query-executor.js +2 -2
  173. package/queries/catalog/inspect-exceptions-query/inspect-exception-query-executor.d.ts +1 -1
  174. package/queries/catalog/inspect-exceptions-query/inspect-exception-query-executor.js +1 -1
  175. package/queries/catalog/inspect-exceptions-query/inspect-exception-query-format.d.ts +2 -2
  176. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.js +3 -3
  177. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-format.d.ts +2 -2
  178. package/queries/catalog/inspect-recursion-query/inspect-recursion-query-format.d.ts +2 -2
  179. package/queries/catalog/linter-query/linter-query-format.d.ts +3 -3
  180. package/queries/catalog/location-map-query/location-map-query-executor.js +2 -2
  181. package/queries/catalog/location-map-query/location-map-query-format.d.ts +2 -2
  182. package/queries/catalog/origin-query/origin-query-executor.d.ts +1 -1
  183. package/queries/catalog/origin-query/origin-query-executor.js +3 -3
  184. package/queries/catalog/origin-query/origin-query-format.d.ts +2 -2
  185. package/queries/catalog/provenance-query/provenance-query-executor.d.ts +9 -0
  186. package/queries/catalog/provenance-query/provenance-query-executor.js +37 -0
  187. package/queries/catalog/provenance-query/provenance-query-format.d.ts +35 -0
  188. package/queries/catalog/provenance-query/provenance-query-format.js +62 -0
  189. package/queries/catalog/resolve-value-query/resolve-value-query-executor.js +4 -4
  190. package/queries/catalog/resolve-value-query/resolve-value-query-format.d.ts +2 -2
  191. package/queries/catalog/resolve-value-query/resolve-value-query-format.js +4 -0
  192. package/queries/catalog/search-query/search-query-format.js +1 -1
  193. package/queries/catalog/static-slice-query/static-slice-query-executor.js +4 -2
  194. package/queries/catalog/static-slice-query/static-slice-query-format.d.ts +4 -4
  195. package/queries/catalog/static-slice-query/static-slice-query-format.js +3 -3
  196. package/queries/query.d.ts +27 -19
  197. package/queries/query.js +2 -0
  198. package/r-bridge/lang-4.x/ast/model/model.d.ts +13 -2
  199. package/r-bridge/lang-4.x/ast/model/model.js +20 -1
  200. package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.d.ts +8 -1
  201. package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.js +13 -0
  202. package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +2 -2
  203. package/r-bridge/lang-4.x/ast/parser/json/parser.js +2 -2
  204. package/r-bridge/lang-4.x/tree-sitter/tree-sitter-normalize.js +6 -2
  205. package/search/flowr-search-filters.d.ts +1 -1
  206. package/search/flowr-search-printer.js +3 -3
  207. package/search/search-executor/search-enrichers.js +2 -2
  208. package/search/search-executor/search-generators.js +1 -1
  209. package/slicing/criterion/parse.d.ts +40 -16
  210. package/slicing/criterion/parse.js +67 -63
  211. package/slicing/static/slicer-types.d.ts +2 -3
  212. package/slicing/static/static-slicer.d.ts +3 -4
  213. package/slicing/static/static-slicer.js +9 -12
  214. package/statistics/statistics.d.ts +2 -2
  215. package/util/diff.d.ts +2 -2
  216. package/util/mermaid/ast.js +4 -4
  217. package/util/mermaid/cfg.js +5 -5
  218. package/util/mermaid/dfg.d.ts +33 -18
  219. package/util/mermaid/dfg.js +46 -31
  220. package/util/mermaid/mermaid.d.ts +57 -12
  221. package/util/mermaid/mermaid.js +74 -67
  222. package/util/objects.d.ts +12 -0
  223. package/util/objects.js +28 -0
  224. package/util/range.d.ts +8 -0
  225. package/util/range.js +13 -1
  226. package/util/slice-direction.d.ts +7 -0
  227. package/util/slice-direction.js +12 -0
  228. package/util/summarizer.js +1 -1
  229. package/util/version.js +1 -1
  230. package/dataflow/graph/invert-dfg.d.ts +0 -6
  231. package/dataflow/graph/invert-dfg.js +0 -20
  232. package/dataflow/graph/resolve-graph.d.ts +0 -8
  233. package/dataflow/graph/resolve-graph.js +0 -59
@@ -5,7 +5,7 @@ import { executeDoesCallQuery } from './does-call-query-executor';
5
5
  import { type NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
6
6
  import type { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
7
7
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
8
- import type { FlowrConfigOptions } from '../../../config';
8
+ import type { FlowrConfig } from '../../../config';
9
9
  interface CallsIdConstraint {
10
10
  readonly type: 'calls-id';
11
11
  /** The id of the function being called. */
@@ -40,7 +40,7 @@ export interface DoesCallQueryResult extends BaseQueryResult {
40
40
  /** Results are either false (does not call) or an object with details on the calls made */
41
41
  readonly results: Record<string, FindAllCallsResult | false>;
42
42
  }
43
- declare function doesCallQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'does-call'>;
43
+ declare function doesCallQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'does-call'>;
44
44
  export declare const DoesCallQueryDefinition: {
45
45
  readonly executor: typeof executeDoesCallQuery;
46
46
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, processed: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => Promise<boolean>;
@@ -5,7 +5,7 @@ import { executeFileQuery } from './files-query-executor';
5
5
  import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
6
6
  import { FileRole } from '../../../project/context/flowr-file';
7
7
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
8
- import type { FlowrConfigOptions } from '../../../config';
8
+ import type { FlowrConfig } from '../../../config';
9
9
  import type { CommandCompletions } from '../../../cli/repl/core';
10
10
  /**
11
11
  * Returns the content(s) of all files matching the given pattern.
@@ -24,8 +24,8 @@ export interface FileQueryInfo<T = object> {
24
24
  export interface FilesQueryResult extends BaseQueryResult {
25
25
  files: FileQueryInfo[];
26
26
  }
27
- declare function filesQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'files'>;
28
- declare function filesQueryCompleter(line: readonly string[], startingNewArg: boolean, _config: FlowrConfigOptions): CommandCompletions;
27
+ declare function filesQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'files'>;
28
+ declare function filesQueryCompleter(line: readonly string[], startingNewArg: boolean, _config: FlowrConfig): CommandCompletions;
29
29
  export declare const FilesQueryDefinition: {
30
30
  readonly executor: typeof executeFileQuery;
31
31
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, _analyzer: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => true;
@@ -22,8 +22,8 @@ async function executeHappensBefore({ analyzer }, queries) {
22
22
  log_1.log.warn('Duplicate happens-before query', query, 'ignoring');
23
23
  }
24
24
  try {
25
- const resolvedA = (0, parse_1.slicingCriterionToId)(a, ast.idMap);
26
- const resolvedB = (0, parse_1.slicingCriterionToId)(b, ast.idMap);
25
+ const resolvedA = parse_1.SingleSlicingCriterion.parse(a, ast.idMap);
26
+ const resolvedB = parse_1.SingleSlicingCriterion.parse(b, ast.idMap);
27
27
  results[fingerprint] = (0, happens_before_1.happensBefore)(cfg.graph, resolvedA, resolvedB);
28
28
  }
29
29
  catch (e) {
@@ -1,6 +1,6 @@
1
1
  import type { InspectExceptionQuery, InspectExceptionQueryResult } from './inspect-exception-query-format';
2
2
  import type { BasicQueryData } from '../../base-query-format';
3
- import { type SingleSlicingCriterion } from '../../../slicing/criterion/parse';
3
+ import { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
4
4
  import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
5
5
  import type { ReadonlyFlowrAnalysisProvider } from '../../../project/flowr-analyzer';
6
6
  /**
@@ -25,7 +25,7 @@ async function getFunctionsToConsiderInCallGraph(queries, analyzer, onlyDefiniti
25
25
  const filterFor = new Set();
26
26
  if (filters) {
27
27
  for (const f of filters) {
28
- const i = (0, parse_1.tryResolveSliceCriterionToId)(f, ast.idMap);
28
+ const i = parse_1.SingleSlicingCriterion.tryParse(f, ast.idMap);
29
29
  if (i !== undefined) {
30
30
  filterFor.add(i);
31
31
  }
@@ -4,7 +4,7 @@ import type { ParsedQueryLine } from '../../query';
4
4
  import { executeExceptionQuery } from './inspect-exception-query-executor';
5
5
  import { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
6
6
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
7
- import type { FlowrConfigOptions } from '../../../config';
7
+ import type { FlowrConfig } from '../../../config';
8
8
  import type { ExceptionPoint } from '../../../dataflow/fn/exceptions-of-function';
9
9
  import type { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
10
10
  /**
@@ -23,7 +23,7 @@ export interface InspectExceptionQueryResult extends BaseQueryResult {
23
23
  */
24
24
  readonly exceptions: Record<NodeId, ExceptionPoint[]>;
25
25
  }
26
- declare function inspectExceptionLineParser(_output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'inspect-exception'>;
26
+ declare function inspectExceptionLineParser(_output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'inspect-exception'>;
27
27
  export declare const InspectExceptionQueryDefinition: {
28
28
  readonly executor: typeof executeExceptionQuery;
29
29
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, processed: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => Promise<boolean>;
@@ -4,7 +4,7 @@ exports.executeHigherOrderQuery = executeHigherOrderQuery;
4
4
  const higher_order_function_1 = require("../../../dataflow/fn/higher-order-function");
5
5
  const parse_1 = require("../../../slicing/criterion/parse");
6
6
  const vertex_1 = require("../../../dataflow/graph/vertex");
7
- const invert_dfg_1 = require("../../../dataflow/graph/invert-dfg");
7
+ const df_helper_1 = require("../../../dataflow/graph/df-helper");
8
8
  /**
9
9
  * Execute higher-order function inspection queries on the given analyzer.
10
10
  */
@@ -26,7 +26,7 @@ async function executeHigherOrderQuery({ analyzer }, queries) {
26
26
  const filterFor = new Set();
27
27
  if (filters) {
28
28
  for (const f of filters) {
29
- const i = (0, parse_1.tryResolveSliceCriterionToId)(f, ast.idMap);
29
+ const i = parse_1.SingleSlicingCriterion.tryParse(f, ast.idMap);
30
30
  if (i !== undefined) {
31
31
  filterFor.add(i);
32
32
  }
@@ -37,7 +37,7 @@ async function executeHigherOrderQuery({ analyzer }, queries) {
37
37
  .filter(([, v]) => filterFor.size === 0 || filterFor.has(v.id));
38
38
  let invertedGraph;
39
39
  if (filterFor.size === 0 || filterFor.size > 10) {
40
- invertedGraph = (0, invert_dfg_1.invertDfg)(graph, analyzer.inspectContext().env.makeCleanEnv());
40
+ invertedGraph = df_helper_1.Dataflow.invertGraph(graph, analyzer.inspectContext().env.makeCleanEnv());
41
41
  }
42
42
  const result = {};
43
43
  for (const [id] of fns) {
@@ -5,7 +5,7 @@ import { executeHigherOrderQuery } from './inspect-higher-order-query-executor';
5
5
  import { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
6
6
  import type { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
7
7
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
8
- import type { FlowrConfigOptions } from '../../../config';
8
+ import type { FlowrConfig } from '../../../config';
9
9
  /**
10
10
  * Either returns all function definitions alongside whether they are higher-order functions,
11
11
  * or just those matching the filters.
@@ -17,7 +17,7 @@ export interface InspectHigherOrderQuery extends BaseQueryFormat {
17
17
  export interface InspectHigherOrderQueryResult extends BaseQueryResult {
18
18
  readonly higherOrder: Record<NodeId, boolean>;
19
19
  }
20
- declare function inspectHoLineParser(_output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'inspect-higher-order'>;
20
+ declare function inspectHoLineParser(_output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'inspect-higher-order'>;
21
21
  export declare const InspectHigherOrderQueryDefinition: {
22
22
  readonly executor: typeof executeHigherOrderQuery;
23
23
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, processed: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => Promise<boolean>;
@@ -5,7 +5,7 @@ import { executeRecursionQuery } from './inspect-recursion-query-executor';
5
5
  import { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
6
6
  import type { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
7
7
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
8
- import type { FlowrConfigOptions } from '../../../config';
8
+ import type { FlowrConfig } from '../../../config';
9
9
  /**
10
10
  * Either returns all function definitions alongside whether they are recursive,
11
11
  * or just those matching the filters.
@@ -17,7 +17,7 @@ export interface InspectRecursionQuery extends BaseQueryFormat {
17
17
  export interface InspectRecursionQueryResult extends BaseQueryResult {
18
18
  readonly recursive: Record<NodeId, boolean>;
19
19
  }
20
- declare function inspectRecLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'inspect-recursion'>;
20
+ declare function inspectRecLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'inspect-recursion'>;
21
21
  export declare const InspectRecursionQueryDefinition: {
22
22
  readonly executor: typeof executeRecursionQuery;
23
23
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, processed: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => Promise<boolean>;
@@ -4,7 +4,7 @@ import Joi from 'joi';
4
4
  import { executeLinterQuery } from './linter-query-executor';
5
5
  import { type LintingRuleNames } from '../../../linter/linter-rules';
6
6
  import { type ConfiguredLintingRule, LintingResults } from '../../../linter/linter-format';
7
- import type { FlowrConfigOptions } from '../../../config';
7
+ import type { FlowrConfig } from '../../../config';
8
8
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
9
9
  import type { CommandCompletions } from '../../../cli/repl/core';
10
10
  export interface LinterQuery extends BaseQueryFormat {
@@ -23,8 +23,8 @@ export interface LinterQueryResult extends BaseQueryResult {
23
23
  [L in LintingRuleNames]?: LintingResults<L>;
24
24
  };
25
25
  }
26
- declare function linterQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'linter'>;
27
- declare function linterQueryCompleter(line: readonly string[], startingNewArg: boolean, _config: FlowrConfigOptions): CommandCompletions;
26
+ declare function linterQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'linter'>;
27
+ declare function linterQueryCompleter(line: readonly string[], startingNewArg: boolean, _config: FlowrConfig): CommandCompletions;
28
28
  export declare const LinterQueryDefinition: {
29
29
  readonly executor: typeof executeLinterQuery;
30
30
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, analyzer: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => true;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.executeLocationMapQuery = executeLocationMapQuery;
4
- const parse_1 = require("../../../slicing/criterion/parse");
5
4
  const assert_1 = require("../../../util/assert");
5
+ const parse_1 = require("../../../slicing/criterion/parse");
6
6
  const fileIdRegex = /^(?<file>.*(\.[rR]))-/;
7
7
  function fuzzyFindFile(node, idMap) {
8
8
  if (node?.info.file) {
@@ -31,7 +31,7 @@ async function executeLocationMapQuery({ analyzer }, queries) {
31
31
  const start = Date.now();
32
32
  const criteriaOfInterest = new Set(queries
33
33
  .flatMap(q => q.ids ?? [])
34
- .map(c => (0, parse_1.tryResolveSliceCriterionToId)(c, ast.idMap))
34
+ .map(c => parse_1.SingleSlicingCriterion.tryParse(c, ast.idMap))
35
35
  .filter(assert_1.isNotUndefined));
36
36
  const locationMap = {
37
37
  files: {},
@@ -6,7 +6,7 @@ import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/nod
6
6
  import type { SourceRange } from '../../../util/range';
7
7
  import type { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
8
8
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
9
- import type { FlowrConfigOptions } from '../../../config';
9
+ import type { FlowrConfig } from '../../../config';
10
10
  import type { ParsedQueryLine } from '../../query';
11
11
  export interface LocationMapQuery extends BaseQueryFormat {
12
12
  readonly type: 'location-map';
@@ -25,7 +25,7 @@ export interface LocationMapQueryResult extends BaseQueryResult {
25
25
  ids: Record<NodeId, [FileId, SourceRange]>;
26
26
  };
27
27
  }
28
- declare function locationMapLineParser(_output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'location-map'>;
28
+ declare function locationMapLineParser(_output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'location-map'>;
29
29
  export declare const LocationMapQueryDefinition: {
30
30
  readonly executor: typeof executeLocationMapQuery;
31
31
  readonly asciiSummarizer: (formatter: OutputFormatter, _analyzer: unknown, queryResults: BaseQueryResult, result: string[]) => true;
@@ -1,5 +1,5 @@
1
1
  import type { BasicQueryData } from '../../base-query-format';
2
- import { type SingleSlicingCriterion } from '../../../slicing/criterion/parse';
2
+ import { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
3
3
  import type { OriginQuery, OriginQueryResult } from './origin-query-format';
4
4
  /**
5
5
  * Produce a fingerprint string for an origin query
@@ -4,7 +4,7 @@ exports.fingerPrintOfQuery = fingerPrintOfQuery;
4
4
  exports.executeResolveValueQuery = executeResolveValueQuery;
5
5
  const log_1 = require("../../../util/log");
6
6
  const parse_1 = require("../../../slicing/criterion/parse");
7
- const dfg_get_origin_1 = require("../../../dataflow/origin/dfg-get-origin");
7
+ const df_helper_1 = require("../../../dataflow/graph/df-helper");
8
8
  /**
9
9
  * Produce a fingerprint string for an origin query
10
10
  */
@@ -22,12 +22,12 @@ async function executeResolveValueQuery({ analyzer }, queries) {
22
22
  if (results[key]) {
23
23
  log_1.log.warn(`Duplicate Key for origin-query: ${key}, skipping...`);
24
24
  }
25
- const astId = (0, parse_1.slicingCriterionToId)(key, (await analyzer.normalize()).idMap);
25
+ const astId = parse_1.SingleSlicingCriterion.tryParse(key, (await analyzer.normalize()).idMap);
26
26
  if (astId === undefined) {
27
27
  log_1.log.warn(`Could not resolve id for ${key}, skipping...`);
28
28
  continue;
29
29
  }
30
- results[key] = (0, dfg_get_origin_1.getOriginInDfg)((await analyzer.dataflow()).graph, astId);
30
+ results[key] = df_helper_1.Dataflow.origin((await analyzer.dataflow()).graph, astId);
31
31
  }
32
32
  return {
33
33
  '.meta': {
@@ -6,7 +6,7 @@ import { executeResolveValueQuery } from './origin-query-executor';
6
6
  import type { Origin } from '../../../dataflow/origin/dfg-get-origin';
7
7
  import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
8
8
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
9
- import type { FlowrConfigOptions } from '../../../config';
9
+ import type { FlowrConfig } from '../../../config';
10
10
  export interface OriginQuery extends BaseQueryFormat {
11
11
  readonly type: 'origin';
12
12
  /** The slicing criteria to use */
@@ -15,7 +15,7 @@ export interface OriginQuery extends BaseQueryFormat {
15
15
  export interface OriginQueryResult extends BaseQueryResult {
16
16
  results: Record<SingleSlicingCriterion, Origin[] | undefined>;
17
17
  }
18
- declare function originQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'origin'>;
18
+ declare function originQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'origin'>;
19
19
  export declare const OriginQueryDefinition: {
20
20
  readonly executor: typeof executeResolveValueQuery;
21
21
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, _analyzer: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => true;
@@ -0,0 +1,9 @@
1
+ import type { BasicQueryData } from '../../base-query-format';
2
+ import type { ProvenanceQuery, ProvenanceQueryResult } from './provenance-query-format';
3
+ /**
4
+ * Execute static slice queries, catching duplicates with the same fingerprint
5
+ * @param analyzer - The basic query data containing the analyzer
6
+ * @param queries - The static slice queries to execute
7
+ * @returns The results of the static slice queries
8
+ */
9
+ export declare function executeProvenanceQuery({ analyzer }: BasicQueryData, queries: readonly ProvenanceQuery[]): Promise<ProvenanceQueryResult>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeProvenanceQuery = executeProvenanceQuery;
4
+ const log_1 = require("../../../util/log");
5
+ const r_function_definition_1 = require("../../../r-bridge/lang-4.x/ast/model/nodes/r-function-definition");
6
+ const parse_1 = require("../../../slicing/criterion/parse");
7
+ const df_helper_1 = require("../../../dataflow/graph/df-helper");
8
+ const model_1 = require("../../../r-bridge/lang-4.x/ast/model/model");
9
+ /**
10
+ * Execute static slice queries, catching duplicates with the same fingerprint
11
+ * @param analyzer - The basic query data containing the analyzer
12
+ * @param queries - The static slice queries to execute
13
+ * @returns The results of the static slice queries
14
+ */
15
+ async function executeProvenanceQuery({ analyzer }, queries) {
16
+ const start = Date.now();
17
+ const results = {};
18
+ const nast = await analyzer.normalize();
19
+ const df = await analyzer.dataflow();
20
+ for (const query of queries) {
21
+ const key = query.criterion;
22
+ if (results[key]) {
23
+ log_1.log.warn(`Duplicate Key for provenance query: ${key}, skipping...`);
24
+ }
25
+ const criterionId = parse_1.SingleSlicingCriterion.tryParse(key, nast.idMap) ?? key;
26
+ const provenanceNode = nast.idMap.get(criterionId);
27
+ const fdef = r_function_definition_1.RFunctionDefinition.wrappingFunctionDefinition(provenanceNode, nast.idMap);
28
+ results[key] = Array.from(df_helper_1.Dataflow.provenance(criterionId, df.graph, fdef ? model_1.RNode.collectAllIds(fdef) : undefined));
29
+ }
30
+ return {
31
+ '.meta': {
32
+ timing: Date.now() - start
33
+ },
34
+ results
35
+ };
36
+ }
37
+ //# sourceMappingURL=provenance-query-executor.js.map
@@ -0,0 +1,35 @@
1
+ import type { BaseQueryFormat, BaseQueryResult } from '../../base-query-format';
2
+ import type { SingleSlicingCriterion } from '../../../slicing/criterion/parse';
3
+ import type { ParsedQueryLine } from '../../query';
4
+ import Joi from 'joi';
5
+ import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
6
+ import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
7
+ import type { FlowrConfig } from '../../../config';
8
+ import { executeProvenanceQuery } from './provenance-query-executor';
9
+ /** Calculates the provenance starting from a given criterion */
10
+ export interface ProvenanceQuery extends BaseQueryFormat {
11
+ readonly type: 'provenance';
12
+ /** The slicing criterion to use as a start*/
13
+ readonly criterion: SingleSlicingCriterion;
14
+ /** Whether to stop on fdef boundaries */
15
+ readonly restrictFdef?: boolean;
16
+ }
17
+ export interface ProvenanceQueryResult extends BaseQueryResult {
18
+ /**
19
+ * Maps the requested criteria to the returned ids
20
+ */
21
+ results: Record<string, NodeId[]>;
22
+ }
23
+ /**
24
+ * Checks whether the given argument represents a fdef boundary with an `f` suffix.
25
+ */
26
+ export declare function fdefBoundaryParser(argument: string): boolean;
27
+ declare function provenanceQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'provenance'>;
28
+ export declare const ProvenanceQueryDefinition: {
29
+ readonly executor: typeof executeProvenanceQuery;
30
+ readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, analyzer: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => Promise<boolean>;
31
+ readonly fromLine: typeof provenanceQueryLineParser;
32
+ readonly schema: Joi.ObjectSchema<any>;
33
+ readonly flattenInvolvedNodes: (queryResults: BaseQueryResult) => NodeId[];
34
+ };
35
+ export {};
@@ -0,0 +1,62 @@
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.ProvenanceQueryDefinition = void 0;
7
+ exports.fdefBoundaryParser = fdefBoundaryParser;
8
+ const ansi_1 = require("../../../util/text/ansi");
9
+ const time_1 = require("../../../util/text/time");
10
+ const joi_1 = __importDefault(require("joi"));
11
+ const slice_query_parser_1 = require("../../../cli/repl/parser/slice-query-parser");
12
+ const provenance_query_executor_1 = require("./provenance-query-executor");
13
+ const df_helper_1 = require("../../../dataflow/graph/df-helper");
14
+ /**
15
+ * Checks whether the given argument represents a fdef boundary with an `f` suffix.
16
+ */
17
+ function fdefBoundaryParser(argument) {
18
+ const endBracket = argument.indexOf(')');
19
+ return argument[endBracket + 1] === 'f';
20
+ }
21
+ function provenanceQueryLineParser(output, line, _config) {
22
+ const criterion = (0, slice_query_parser_1.sliceCriteriaParser)(line[0]);
23
+ const stopFdef = fdefBoundaryParser(line[0]);
24
+ if (!criterion || criterion.length !== 1) {
25
+ output.stderr(output.formatter.format('Invalid provenance query format, a single slicing criterion must be given in the form "(criterion1)"', { color: 1 /* Colors.Red */, effect: ansi_1.ColorEffect.Foreground, style: 1 /* FontStyles.Bold */ }));
26
+ return { query: [] };
27
+ }
28
+ return { query: [{
29
+ type: 'provenance',
30
+ criterion: criterion[0],
31
+ restrictFdef: stopFdef
32
+ }], rCode: line[1] };
33
+ }
34
+ exports.ProvenanceQueryDefinition = {
35
+ executor: provenance_query_executor_1.executeProvenanceQuery,
36
+ asciiSummarizer: async (formatter, analyzer, queryResults, result) => {
37
+ const out = queryResults;
38
+ const df = await analyzer.dataflow();
39
+ result.push(`Query: ${(0, ansi_1.bold)('provenance', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`);
40
+ for (const [key, obj] of Object.entries(out.results)) {
41
+ result.push(` ╰ Provenance for ${key}`);
42
+ const dfg = df_helper_1.Dataflow.reduceGraph(df.graph, new Set(obj));
43
+ result.push(` ╰ [Mermaid Url](${df_helper_1.Dataflow.visualize.mermaid.url(dfg)})`);
44
+ }
45
+ return true;
46
+ },
47
+ fromLine: provenanceQueryLineParser,
48
+ schema: joi_1.default.object({
49
+ type: joi_1.default.string().valid('provenance').required().description('The type of the query.'),
50
+ criterion: joi_1.default.string().required().description('The slicing criterion to use.'),
51
+ restrictFdef: joi_1.default.boolean().required().description('Whether to stop on fdef boundaries.')
52
+ }).description('Provenance query definition'),
53
+ flattenInvolvedNodes: (queryResults) => {
54
+ const flattened = [];
55
+ const out = queryResults;
56
+ for (const obj of Object.values(out.results)) {
57
+ flattened.push(...obj);
58
+ }
59
+ return flattened;
60
+ }
61
+ };
62
+ //# sourceMappingURL=provenance-query-format.js.map
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fingerPrintOfQuery = fingerPrintOfQuery;
4
4
  exports.executeResolveValueQuery = executeResolveValueQuery;
5
5
  const log_1 = require("../../../util/log");
6
- const parse_1 = require("../../../slicing/criterion/parse");
7
6
  const alias_tracking_1 = require("../../../dataflow/eval/resolve/alias-tracking");
7
+ const parse_1 = require("../../../slicing/criterion/parse");
8
8
  /**
9
9
  * Naive fingerprint to filter out duplicate queries.
10
10
  */
@@ -18,15 +18,15 @@ async function executeResolveValueQuery({ analyzer }, queries) {
18
18
  const start = Date.now();
19
19
  const results = {};
20
20
  const graph = (await analyzer.dataflow()).graph;
21
- const ast = await analyzer.normalize();
21
+ const idMap = (await analyzer.normalize()).idMap;
22
22
  for (const query of queries) {
23
23
  const key = fingerPrintOfQuery(query);
24
24
  if (results[key]) {
25
25
  log_1.log.warn(`Duplicate Key for resolve-value-query: ${key}, skipping...`);
26
26
  }
27
27
  const values = query.criteria
28
- .map(criteria => (0, parse_1.slicingCriterionToId)(criteria, ast.idMap))
29
- .flatMap(ident => (0, alias_tracking_1.resolveIdToValue)(ident, { graph, full: true, idMap: ast.idMap, resolve: analyzer.flowrConfig.solver.variables, ctx: analyzer.inspectContext() }));
28
+ .map(criteria => parse_1.SingleSlicingCriterion.parse(criteria, idMap))
29
+ .flatMap(ident => (0, alias_tracking_1.resolveIdToValue)(ident, { graph, full: true, idMap, resolve: analyzer.flowrConfig.solver.variables, ctx: analyzer.inspectContext() }));
30
30
  results[key] = {
31
31
  values: values
32
32
  };
@@ -5,7 +5,7 @@ import Joi from 'joi';
5
5
  import { executeResolveValueQuery } from './resolve-value-query-executor';
6
6
  import type { ResolveResult } from '../../../dataflow/eval/resolve/alias-tracking';
7
7
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
8
- import type { FlowrConfigOptions } from '../../../config';
8
+ import type { FlowrConfig } from '../../../config';
9
9
  export interface ResolveValueQuery extends BaseQueryFormat {
10
10
  readonly type: 'resolve-value';
11
11
  /** The slicing criteria to use */
@@ -16,7 +16,7 @@ export interface ResolveValueQueryResult extends BaseQueryResult {
16
16
  values: ResolveResult[];
17
17
  }>;
18
18
  }
19
- declare function resolveValueLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'resolve-value'>;
19
+ declare function resolveValueLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'resolve-value'>;
20
20
  export declare const ResolveValueQueryDefinition: {
21
21
  readonly executor: typeof executeResolveValueQuery;
22
22
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, _analyzer: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => true;
@@ -30,6 +30,10 @@ exports.ResolveValueQueryDefinition = {
30
30
  executor: resolve_value_query_executor_1.executeResolveValueQuery,
31
31
  asciiSummarizer: (formatter, _analyzer, queryResults, result) => {
32
32
  const out = queryResults;
33
+ if (out === undefined || typeof out !== 'object' || !('.meta' in out)) {
34
+ result.push(formatter.format('Resolve value failed (maybe your criterion does not exist?)!', { color: 1 /* Colors.Red */, effect: ansi_1.ColorEffect.Foreground, style: 1 /* FontStyles.Bold */ }));
35
+ return true;
36
+ }
33
37
  result.push(`Query: ${(0, ansi_1.bold)('resolve-value', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`);
34
38
  for (const [fingerprint, obj] of Object.entries(out.results)) {
35
39
  const { criteria } = JSON.parse(fingerprint);
@@ -17,7 +17,7 @@ exports.SearchQueryDefinition = {
17
17
  const out = queryResults;
18
18
  result.push(`Query: ${(0, ansi_1.bold)('search', formatter)} (${(0, time_1.printAsMs)(out['.meta'].timing, 0)})`);
19
19
  for (const [, { ids, search }] of out.results.entries()) {
20
- result.push(` ╰ [query](${(0, mermaid_1.mermaidCodeToUrl)((0, flowr_search_printer_1.flowrSearchToMermaid)(search))}): {${(0, query_print_1.summarizeIdsIfTooLong)(formatter, ids)}}`);
20
+ result.push(` ╰ [query](${mermaid_1.Mermaid.codeToUrl((0, flowr_search_printer_1.flowrSearchToMermaid)(search))}): {${(0, query_print_1.summarizeIdsIfTooLong)(formatter, ids)}}`);
21
21
  }
22
22
  return true;
23
23
  },
@@ -7,7 +7,8 @@ const reconstruct_1 = require("../../../reconstruct/reconstruct");
7
7
  const auto_select_defaults_1 = require("../../../reconstruct/auto-select/auto-select-defaults");
8
8
  const magic_comments_1 = require("../../../reconstruct/auto-select/magic-comments");
9
9
  const log_1 = require("../../../util/log");
10
- const _00_slice_1 = require("../../../core/steps/all/static-slicing/00-slice");
10
+ const slice_direction_1 = require("../../../util/slice-direction");
11
+ const parse_1 = require("../../../slicing/criterion/parse");
11
12
  /**
12
13
  * Produce a fingerprint string for a static slice query
13
14
  */
@@ -30,7 +31,8 @@ async function executeStaticSliceQuery({ analyzer }, queries) {
30
31
  }
31
32
  const { criteria, noReconstruction, noMagicComments } = query;
32
33
  const sliceStart = Date.now();
33
- const slice = (0, static_slicer_1.staticSlice)(analyzer.inspectContext(), await analyzer.dataflow(), await analyzer.normalize(), criteria, query.direction ?? _00_slice_1.SliceDirection.Backward, analyzer.flowrConfig.solver.slicer?.threshold);
34
+ const n = await analyzer.normalize();
35
+ const slice = (0, static_slicer_1.staticSlice)(analyzer.inspectContext(), await analyzer.dataflow(), n, parse_1.SlicingCriteria.convertAll(criteria, n.idMap), query.direction ?? slice_direction_1.SliceDirection.Backward, analyzer.flowrConfig.solver.slicer?.threshold);
34
36
  const sliceEnd = Date.now();
35
37
  if (noReconstruction) {
36
38
  results[key] = { slice: { ...slice, '.meta': { timing: sliceEnd - sliceStart } } };
@@ -5,11 +5,11 @@ import type { SlicingCriteria } from '../../../slicing/criterion/parse';
5
5
  import type { ParsedQueryLine } from '../../query';
6
6
  import Joi from 'joi';
7
7
  import { executeStaticSliceQuery } from './static-slice-query-executor';
8
- import { SliceDirection } from '../../../core/steps/all/static-slicing/00-slice';
9
8
  import type { NodeId } from '../../../r-bridge/lang-4.x/ast/model/processing/node-id';
10
9
  import type { ReplOutput } from '../../../cli/repl/commands/repl-main';
11
- import type { FlowrConfigOptions } from '../../../config';
12
- /** Calculates and returns all clusters encountered in the dataflow graph. */
10
+ import type { FlowrConfig } from '../../../config';
11
+ import { SliceDirection } from '../../../util/slice-direction';
12
+ /** Calculates and returns the static backward or forward slice from the given criteria */
13
13
  export interface StaticSliceQuery extends BaseQueryFormat {
14
14
  readonly type: 'static-slice';
15
15
  /** The slicing criteria to use */
@@ -31,7 +31,7 @@ export interface StaticSliceQueryResult extends BaseQueryResult {
31
31
  */
32
32
  results: Record<string, Omit<PipelineOutput<typeof DEFAULT_SLICING_PIPELINE>, keyof PipelineOutput<typeof DEFAULT_DATAFLOW_PIPELINE>> | Omit<PipelineOutput<typeof DEFAULT_SLICE_WITHOUT_RECONSTRUCT_PIPELINE>, keyof PipelineOutput<typeof DEFAULT_DATAFLOW_PIPELINE>>>;
33
33
  }
34
- declare function sliceQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfigOptions): ParsedQueryLine<'static-slice'>;
34
+ declare function sliceQueryLineParser(output: ReplOutput, line: readonly string[], _config: FlowrConfig): ParsedQueryLine<'static-slice'>;
35
35
  export declare const StaticSliceQueryDefinition: {
36
36
  readonly executor: typeof executeStaticSliceQuery;
37
37
  readonly asciiSummarizer: (formatter: import("../../../util/text/ansi").OutputFormatter, _analyzer: import("../../../project/flowr-analyzer").ReadonlyFlowrAnalysisProvider<import("../../../r-bridge/parser").KnownParser>, queryResults: BaseQueryResult, result: string[]) => true;
@@ -9,12 +9,12 @@ const time_1 = require("../../../util/text/time");
9
9
  const joi_1 = __importDefault(require("joi"));
10
10
  const static_slice_query_executor_1 = require("./static-slice-query-executor");
11
11
  const query_print_1 = require("../../query-print");
12
- const _00_slice_1 = require("../../../core/steps/all/static-slicing/00-slice");
13
12
  const slice_query_parser_1 = require("../../../cli/repl/parser/slice-query-parser");
13
+ const slice_direction_1 = require("../../../util/slice-direction");
14
14
  function sliceQueryLineParser(output, line, _config) {
15
15
  const criteria = (0, slice_query_parser_1.sliceCriteriaParser)(line[0]);
16
16
  const direction = (0, slice_query_parser_1.sliceDirectionParser)(line[0]);
17
- if (!criteria || criteria.length == 0) {
17
+ if (!criteria || criteria.length === 0) {
18
18
  output.stderr(output.formatter.format('Invalid static-slice query format, slicing criteria must be given in the form "(criterion1;criterion2;...)"', { color: 1 /* Colors.Red */, effect: ansi_1.ColorEffect.Foreground, style: 1 /* FontStyles.Bold */ }));
19
19
  return { query: [] };
20
20
  }
@@ -68,7 +68,7 @@ exports.StaticSliceQueryDefinition = {
68
68
  criteria: joi_1.default.array().items(joi_1.default.string()).min(0).required().description('The slicing criteria to use.'),
69
69
  noReconstruction: joi_1.default.boolean().optional().description('Do not reconstruct the slice into readable code.'),
70
70
  noMagicComments: joi_1.default.boolean().optional().description('Should the magic comments (force-including lines within the slice) be ignored?'),
71
- direction: joi_1.default.string().valid(...Object.values(_00_slice_1.SliceDirection)).optional().description('The direction to slice in. Defaults to backward slicing if unset.')
71
+ direction: joi_1.default.string().valid(...Object.values(slice_direction_1.SliceDirection)).optional().description('The direction to slice in. Defaults to backward slicing if unset.')
72
72
  }).description('Slice query used to slice the dataflow graph'),
73
73
  flattenInvolvedNodes: (queryResults) => {
74
74
  const flattened = [];