@eagleoutice/flowr 2.6.3 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +13 -13
  2. package/abstract-interpretation/data-frame/absint-visitor.d.ts +1 -1
  3. package/abstract-interpretation/data-frame/absint-visitor.js +3 -3
  4. package/abstract-interpretation/data-frame/dataframe-domain.d.ts +4 -7
  5. package/abstract-interpretation/data-frame/dataframe-domain.js +5 -11
  6. package/abstract-interpretation/data-frame/mappers/access-mapper.d.ts +3 -1
  7. package/abstract-interpretation/data-frame/mappers/access-mapper.js +3 -2
  8. package/abstract-interpretation/data-frame/mappers/arguments.js +2 -2
  9. package/abstract-interpretation/data-frame/mappers/assignment-mapper.d.ts +3 -1
  10. package/abstract-interpretation/data-frame/mappers/assignment-mapper.js +3 -2
  11. package/abstract-interpretation/data-frame/mappers/function-mapper.d.ts +1 -1
  12. package/abstract-interpretation/data-frame/mappers/function-mapper.js +8 -8
  13. package/abstract-interpretation/data-frame/mappers/replacement-mapper.d.ts +3 -1
  14. package/abstract-interpretation/data-frame/mappers/replacement-mapper.js +3 -2
  15. package/abstract-interpretation/data-frame/semantics.js +47 -42
  16. package/abstract-interpretation/data-frame/shape-inference.d.ts +1 -1
  17. package/abstract-interpretation/domains/abstract-domain.d.ts +1 -0
  18. package/abstract-interpretation/domains/abstract-domain.js +3 -2
  19. package/abstract-interpretation/domains/bounded-set-domain.js +1 -1
  20. package/abstract-interpretation/domains/interval-domain.d.ts +2 -2
  21. package/abstract-interpretation/domains/interval-domain.js +3 -6
  22. package/abstract-interpretation/domains/lattice.d.ts +2 -0
  23. package/abstract-interpretation/domains/lattice.js +3 -1
  24. package/abstract-interpretation/domains/positive-interval-domain.d.ts +1 -1
  25. package/abstract-interpretation/domains/positive-interval-domain.js +1 -1
  26. package/abstract-interpretation/domains/satisfiable-domain.d.ts +2 -2
  27. package/abstract-interpretation/domains/satisfiable-domain.js +2 -2
  28. package/abstract-interpretation/domains/set-range-domain.d.ts +98 -0
  29. package/abstract-interpretation/domains/set-range-domain.js +400 -0
  30. package/abstract-interpretation/domains/set-upper-bound-domain.js +2 -2
  31. package/abstract-interpretation/domains/singleton-domain.js +2 -2
  32. package/benchmark/slicer.d.ts +2 -1
  33. package/benchmark/slicer.js +37 -15
  34. package/benchmark/stats/print.js +8 -5
  35. package/benchmark/stats/stats.d.ts +3 -2
  36. package/benchmark/summarizer/data.d.ts +11 -8
  37. package/benchmark/summarizer/first-phase/process.js +11 -8
  38. package/benchmark/summarizer/second-phase/process.js +24 -18
  39. package/control-flow/cfg-dead-code.js +3 -2
  40. package/control-flow/useless-loop.js +4 -2
  41. package/core/steps/all/static-slicing/00-slice.d.ts +3 -0
  42. package/core/steps/all/static-slicing/00-slice.js +2 -1
  43. package/core/steps/pipeline/default-pipelines.d.ts +42 -42
  44. package/dataflow/cluster.js +2 -2
  45. package/dataflow/environments/append.d.ts +5 -0
  46. package/dataflow/environments/append.js +6 -20
  47. package/dataflow/environments/built-in.d.ts +2 -1
  48. package/dataflow/environments/clone.d.ts +1 -1
  49. package/dataflow/environments/clone.js +3 -27
  50. package/dataflow/environments/define.d.ts +7 -3
  51. package/dataflow/environments/define.js +9 -56
  52. package/dataflow/environments/diff.js +1 -1
  53. package/dataflow/environments/environment.d.ts +48 -28
  54. package/dataflow/environments/environment.js +187 -62
  55. package/dataflow/environments/overwrite.js +2 -45
  56. package/dataflow/environments/reference-to-maybe.d.ts +13 -0
  57. package/dataflow/environments/reference-to-maybe.js +54 -0
  58. package/dataflow/environments/resolve-by-name.d.ts +6 -1
  59. package/dataflow/environments/resolve-by-name.js +56 -4
  60. package/dataflow/environments/scoping.d.ts +2 -2
  61. package/dataflow/environments/scoping.js +7 -7
  62. package/dataflow/eval/resolve/alias-tracking.d.ts +10 -4
  63. package/dataflow/eval/resolve/alias-tracking.js +15 -13
  64. package/dataflow/eval/resolve/resolve-argument.d.ts +2 -1
  65. package/dataflow/eval/resolve/resolve-argument.js +8 -8
  66. package/dataflow/eval/resolve/resolve.d.ts +13 -11
  67. package/dataflow/eval/resolve/resolve.js +16 -15
  68. package/dataflow/extractor.js +1 -7
  69. package/dataflow/fn/higher-order-function.d.ts +2 -1
  70. package/dataflow/fn/higher-order-function.js +4 -4
  71. package/dataflow/graph/dataflowgraph-builder.d.ts +9 -5
  72. package/dataflow/graph/dataflowgraph-builder.js +21 -11
  73. package/dataflow/graph/diff-dataflow-graph.js +2 -2
  74. package/dataflow/graph/graph.d.ts +10 -2
  75. package/dataflow/graph/graph.js +41 -12
  76. package/dataflow/graph/invert-dfg.d.ts +3 -2
  77. package/dataflow/graph/invert-dfg.js +3 -3
  78. package/dataflow/graph/resolve-graph.d.ts +2 -1
  79. package/dataflow/graph/resolve-graph.js +2 -2
  80. package/dataflow/graph/vertex.d.ts +3 -3
  81. package/dataflow/graph/vertex.js +3 -3
  82. package/dataflow/info.d.ts +1 -1
  83. package/dataflow/internal/linker.js +3 -7
  84. package/dataflow/internal/process/functions/call/argument/unpack-argument.d.ts +7 -1
  85. package/dataflow/internal/process/functions/call/argument/unpack-argument.js +12 -3
  86. package/dataflow/internal/process/functions/call/built-in/built-in-access.js +3 -3
  87. package/dataflow/internal/process/functions/call/built-in/built-in-apply.js +2 -2
  88. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.d.ts +3 -1
  89. package/dataflow/internal/process/functions/call/built-in/built-in-assignment.js +3 -3
  90. package/dataflow/internal/process/functions/call/built-in/built-in-eval.js +9 -9
  91. package/dataflow/internal/process/functions/call/built-in/built-in-expression-list.js +9 -7
  92. package/dataflow/internal/process/functions/call/built-in/built-in-for-loop.js +3 -3
  93. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.d.ts +2 -1
  94. package/dataflow/internal/process/functions/call/built-in/built-in-function-definition.js +9 -13
  95. package/dataflow/internal/process/functions/call/built-in/built-in-get.js +1 -1
  96. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.d.ts +3 -1
  97. package/dataflow/internal/process/functions/call/built-in/built-in-if-then-else.js +8 -6
  98. package/dataflow/internal/process/functions/call/built-in/built-in-library.js +1 -1
  99. package/dataflow/internal/process/functions/call/built-in/built-in-pipe.js +1 -1
  100. package/dataflow/internal/process/functions/call/built-in/built-in-repeat-loop.js +1 -1
  101. package/dataflow/internal/process/functions/call/built-in/built-in-replacement.js +3 -3
  102. package/dataflow/internal/process/functions/call/built-in/built-in-rm.js +6 -4
  103. package/dataflow/internal/process/functions/call/built-in/built-in-source.js +1 -1
  104. package/dataflow/internal/process/functions/call/built-in/built-in-while-loop.js +5 -5
  105. package/dataflow/internal/process/functions/call/common.js +2 -3
  106. package/dataflow/internal/process/functions/call/known-call-handling.js +1 -1
  107. package/dataflow/internal/process/functions/call/unnamed-call-handling.js +1 -1
  108. package/dataflow/internal/process/functions/process-argument.js +1 -1
  109. package/dataflow/internal/process/process-symbol.js +1 -1
  110. package/dataflow/internal/process/process-value.d.ts +1 -1
  111. package/dataflow/internal/process/process-value.js +7 -7
  112. package/dataflow/processor.d.ts +1 -5
  113. package/documentation/doc-util/doc-dfg.js +3 -2
  114. package/documentation/doc-util/doc-normalized-ast.js +3 -2
  115. package/documentation/doc-util/doc-types.d.ts +1 -1
  116. package/documentation/doc-util/doc-types.js +2 -2
  117. package/documentation/wiki-analyzer.js +14 -1
  118. package/documentation/wiki-dataflow-graph.js +4 -5
  119. package/documentation/wiki-faq.js +0 -1
  120. package/documentation/wiki-linter.js +1 -1
  121. package/documentation/wiki-mk/doc-maker.js +2 -1
  122. package/linter/linter-rules.d.ts +2 -2
  123. package/linter/rules/absolute-path.js +4 -4
  124. package/linter/rules/dataframe-access-validation.d.ts +1 -1
  125. package/linter/rules/dataframe-access-validation.js +1 -1
  126. package/linter/rules/function-finder-util.d.ts +2 -2
  127. package/linter/rules/function-finder-util.js +1 -1
  128. package/linter/rules/network-functions.js +1 -1
  129. package/linter/rules/seeded-randomness.d.ts +1 -1
  130. package/linter/rules/seeded-randomness.js +5 -5
  131. package/package.json +1 -2
  132. package/project/context/flowr-analyzer-context.d.ts +7 -0
  133. package/project/context/flowr-analyzer-context.js +3 -0
  134. package/project/context/flowr-analyzer-environment-context.d.ts +47 -0
  135. package/project/context/flowr-analyzer-environment-context.js +50 -0
  136. package/queries/catalog/call-context-query/call-context-query-executor.js +1 -4
  137. package/queries/catalog/control-flow-query/control-flow-query-format.js +3 -2
  138. package/queries/catalog/dataflow-lens-query/dataflow-lens-query-executor.js +1 -1
  139. package/queries/catalog/dependencies-query/dependencies-query-executor.js +4 -4
  140. package/queries/catalog/df-shape-query/df-shape-query-executor.d.ts +1 -1
  141. package/queries/catalog/df-shape-query/df-shape-query-executor.js +1 -1
  142. package/queries/catalog/df-shape-query/df-shape-query-format.d.ts +4 -4
  143. package/queries/catalog/df-shape-query/df-shape-query-format.js +2 -2
  144. package/queries/catalog/inspect-higher-order-query/inspect-higher-order-query-executor.js +3 -3
  145. package/queries/catalog/resolve-value-query/resolve-value-query-executor.js +1 -1
  146. package/queries/catalog/static-slice-query/static-slice-query-executor.js +1 -1
  147. package/slicing/static/slice-call.d.ts +3 -2
  148. package/slicing/static/slice-call.js +4 -4
  149. package/slicing/static/static-slicer.d.ts +3 -1
  150. package/slicing/static/static-slicer.js +6 -7
  151. package/statistics/features/supported/control-flow/control-flow.js +1 -1
  152. package/statistics/features/supported/used-functions/used-functions.js +1 -1
  153. package/statistics/features/supported/variables/variables.js +2 -1
  154. package/util/containers.js +1 -1
  155. package/util/mermaid/dfg.d.ts +1 -0
  156. package/util/mermaid/dfg.js +3 -3
  157. package/util/simple-df/dfg-view.d.ts +2 -1
  158. package/util/simple-df/dfg-view.js +2 -2
  159. package/util/version.js +1 -1
  160. package/dataflow/environments/remove.d.ts +0 -12
  161. package/dataflow/environments/remove.js +0 -52
package/README.md CHANGED
@@ -24,7 +24,7 @@ It offers a wide variety of features, for example:
24
24
 
25
25
  ```shell
26
26
  $ docker run -it --rm eagleoutice/flowr # or npm run flowr
27
- flowR repl using flowR v2.6.2, R grammar v14 (tree-sitter engine)
27
+ flowR repl using flowR v2.6.3, R grammar v14 (tree-sitter engine)
28
28
  R> :query @linter "read.csv(\"/root/x.txt\")"
29
29
  ```
30
30
 
@@ -33,19 +33,19 @@ It offers a wide variety of features, for example:
33
33
 
34
34
 
35
35
  ```text
36
- Query: linter (3 ms)
36
+ Query: linter (2 ms)
37
37
  ╰ **Deprecated Functions** (deprecated-functions):
38
38
  ╰ _Metadata_: <code>{"totalCalls":0,"totalFunctionDefinitions":0,"searchTimeMs":1,"processTimeMs":0}</code>
39
39
  ╰ **File Path Validity** (file-path-validity):
40
40
  ╰ certain:
41
41
  ╰ Path `/root/x.txt` at 1.1-23
42
- ╰ _Metadata_: <code>{"totalReads":1,"totalUnknown":0,"totalWritesBeforeAlways":0,"totalValid":0,"searchTimeMs":0,"processTimeMs":1}</code>
42
+ ╰ _Metadata_: <code>{"totalReads":1,"totalUnknown":0,"totalWritesBeforeAlways":0,"totalValid":0,"searchTimeMs":0,"processTimeMs":0}</code>
43
43
  ╰ **Seeded Randomness** (seeded-randomness):
44
44
  ╰ _Metadata_: <code>{"consumerCalls":0,"callsWithFunctionProducers":0,"callsWithAssignmentProducers":0,"callsWithNonConstantProducers":0,"callsWithOtherBranchProducers":0,"searchTimeMs":0,"processTimeMs":0}</code>
45
45
  ╰ **Absolute Paths** (absolute-file-paths):
46
46
  ╰ certain:
47
47
  ╰ Path `/root/x.txt` at 1.1-23
48
- ╰ _Metadata_: <code>{"totalConsidered":1,"totalUnknown":0,"searchTimeMs":0,"processTimeMs":0}</code>
48
+ ╰ _Metadata_: <code>{"totalConsidered":1,"totalUnknown":0,"searchTimeMs":1,"processTimeMs":0}</code>
49
49
  ╰ **Unused Definitions** (unused-definitions):
50
50
  ╰ _Metadata_: <code>{"totalConsidered":0,"searchTimeMs":0,"processTimeMs":0}</code>
51
51
  ╰ **Naming Convention** (naming-convention):
@@ -53,12 +53,12 @@ It offers a wide variety of features, for example:
53
53
  ╰ **Network Functions** (network-functions):
54
54
  ╰ _Metadata_: <code>{"totalCalls":0,"totalFunctionDefinitions":0,"searchTimeMs":0,"processTimeMs":0}</code>
55
55
  ╰ **Dataframe Access Validation** (dataframe-access-validation):
56
- ╰ _Metadata_: <code>{"numOperations":0,"numAccesses":0,"totalAccessed":0,"searchTimeMs":0,"processTimeMs":1}</code>
56
+ ╰ _Metadata_: <code>{"numOperations":0,"numAccesses":0,"totalAccessed":0,"searchTimeMs":0,"processTimeMs":0}</code>
57
57
  ╰ **Dead Code** (dead-code):
58
58
  ╰ _Metadata_: <code>{"consideredNodes":5,"searchTimeMs":0,"processTimeMs":0}</code>
59
59
  ╰ **Useless Loops** (useless-loop):
60
60
  ╰ _Metadata_: <code>{"numOfUselessLoops":0,"searchTimeMs":0,"processTimeMs":0}</code>
61
- All queries together required ≈3 ms (1ms accuracy, total 3 ms)
61
+ All queries together required ≈2 ms (1ms accuracy, total 2 ms)
62
62
  ```
63
63
 
64
64
 
@@ -105,11 +105,11 @@ It offers a wide variety of features, for example:
105
105
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;╰ _Metadata_: <code>{"consideredNodes":5,"searchTimeMs":0,"processTimeMs":0}</code>\
106
106
  &nbsp;&nbsp;&nbsp;╰ **Useless Loops** (useless-loop):\
107
107
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;╰ _Metadata_: <code>{"numOfUselessLoops":0,"searchTimeMs":0,"processTimeMs":0}</code>\
108
- _All queries together required ≈3 ms (1ms accuracy, total 4 ms)_
108
+ _All queries together required ≈3 ms (1ms accuracy, total 3 ms)_
109
109
 
110
110
  <details> <summary style="color:gray">Show Detailed Results as Json</summary>
111
111
 
112
- The analysis required _3.7 ms_ (including parsing and normalization and the query) within the generation environment.
112
+ The analysis required _3.2 ms_ (including parsing and normalization and the query) within the generation environment.
113
113
 
114
114
  In general, the JSON contains the Ids of the nodes in question as they are present in the normalized AST or the dataflow graph of flowR.
115
115
  Please consult the [Interface](https://github.com/flowr-analysis/flowr/wiki/Interface) wiki page for more information on how to get those.
@@ -307,7 +307,7 @@ It offers a wide variety of features, for example:
307
307
 
308
308
  ```shell
309
309
  $ docker run -it --rm eagleoutice/flowr # or npm run flowr
310
- flowR repl using flowR v2.6.2, R grammar v14 (tree-sitter engine)
310
+ flowR repl using flowR v2.6.3, R grammar v14 (tree-sitter engine)
311
311
  R> :query @static-slice (11@sum) file://test/testfiles/example.R
312
312
  ```
313
313
 
@@ -321,7 +321,7 @@ It offers a wide variety of features, for example:
321
321
  N <- 10
322
322
  for(i in 1:(N-1)) sum <- sum + i + w
323
323
  sum
324
- All queries together required ≈3 ms (1ms accuracy, total 4 ms)
324
+ All queries together required ≈2 ms (1ms accuracy, total 2 ms)
325
325
  ```
326
326
 
327
327
 
@@ -355,7 +355,7 @@ It offers a wide variety of features, for example:
355
355
 
356
356
 
357
357
  * 🚀 **fast data- and control-flow graphs**\
358
- Within just <i><span title="This measurement is automatically fetched from the latest benchmark!">138.7 ms</span></i> (as of Nov 9, 2025),
358
+ Within just <i><span title="This measurement is automatically fetched from the latest benchmark!">125 ms</span></i> (as of Nov 25, 2025),
359
359
  _flowR_ can analyze the data- and control-flow of the average real-world R script. See the [benchmarks](https://flowr-analysis.github.io/flowr/wiki/stats/benchmark) for more information,
360
360
  and consult the [wiki pages](https://github.com/flowr-analysis/flowr/wiki/Dataflow-Graph) for more details on the dataflow graph.
361
361
 
@@ -391,7 +391,7 @@ It offers a wide variety of features, for example:
391
391
 
392
392
  ```shell
393
393
  $ docker run -it --rm eagleoutice/flowr # or npm run flowr
394
- flowR repl using flowR v2.6.2, R grammar v14 (tree-sitter engine)
394
+ flowR repl using flowR v2.6.3, R grammar v14 (tree-sitter engine)
395
395
  R> :dataflow* test/testfiles/example.R
396
396
  ```
397
397
 
@@ -696,7 +696,7 @@ It offers a wide variety of features, for example:
696
696
  ```
697
697
 
698
698
 
699
- (The analysis required _2.3 ms_ (including parse and normalize, using the [tree-sitter](https://github.com/flowr-analysis/flowr/wiki/Engines) engine) within the generation environment.)
699
+ (The analysis required _2.1 ms_ (including parse and normalize, using the [tree-sitter](https://github.com/flowr-analysis/flowr/wiki/Engines) engine) within the generation environment.)
700
700
 
701
701
 
702
702
 
@@ -1,5 +1,5 @@
1
1
  import { type CfgBasicBlockVertex, type CfgSimpleVertex, type ControlFlowInformation } from '../../control-flow/control-flow-graph';
2
- import { type SemanticCfgGuidedVisitorConfiguration, SemanticCfgGuidedVisitor } from '../../control-flow/semantic-cfg-guided-visitor';
2
+ import { SemanticCfgGuidedVisitor, type SemanticCfgGuidedVisitorConfiguration } from '../../control-flow/semantic-cfg-guided-visitor';
3
3
  import type { DataflowGraph } from '../../dataflow/graph/graph';
4
4
  import type { DataflowGraphVertexFunctionCall, DataflowGraphVertexVariableDefinition } from '../../dataflow/graph/vertex';
5
5
  import type { NoInfo } from '../../r-bridge/lang-4.x/ast/model/model';
@@ -72,7 +72,7 @@ class DataFrameShapeInferenceVisitor extends semantic_cfg_guided_visitor_1.Seman
72
72
  const targetNode = this.getNormalizedAst(target);
73
73
  const sourceNode = this.getNormalizedAst(source);
74
74
  if (node !== undefined && (0, assignment_mapper_1.isAssignmentTarget)(targetNode) && sourceNode !== undefined) {
75
- node.info.dataFrame = (0, assignment_mapper_1.mapDataFrameVariableAssignment)(targetNode, sourceNode, this.config.dfg);
75
+ node.info.dataFrame = (0, assignment_mapper_1.mapDataFrameVariableAssignment)(targetNode, sourceNode, this.config.dfg, this.config.ctx);
76
76
  this.applyDataFrameAssignment(node);
77
77
  this.clearUnassignedInfo(targetNode);
78
78
  }
@@ -80,7 +80,7 @@ class DataFrameShapeInferenceVisitor extends semantic_cfg_guided_visitor_1.Seman
80
80
  onAccessCall({ call }) {
81
81
  const node = this.getNormalizedAst(call.id);
82
82
  if (node !== undefined) {
83
- node.info.dataFrame = (0, access_mapper_1.mapDataFrameAccess)(node, this.config.dfg);
83
+ node.info.dataFrame = (0, access_mapper_1.mapDataFrameAccess)(node, this.config.dfg, this.config.ctx);
84
84
  this.applyDataFrameExpression(node);
85
85
  }
86
86
  }
@@ -96,7 +96,7 @@ class DataFrameShapeInferenceVisitor extends semantic_cfg_guided_visitor_1.Seman
96
96
  const targetNode = this.getNormalizedAst(target);
97
97
  const sourceNode = this.getNormalizedAst(source);
98
98
  if (node !== undefined && targetNode !== undefined && sourceNode !== undefined) {
99
- node.info.dataFrame = (0, replacement_mapper_1.mapDataFrameReplacementFunction)(node, sourceNode, this.config.dfg);
99
+ node.info.dataFrame = (0, replacement_mapper_1.mapDataFrameReplacementFunction)(node, sourceNode, this.config.dfg, this.config.ctx);
100
100
  this.applyDataFrameExpression(node);
101
101
  this.clearUnassignedInfo(targetNode);
102
102
  }
@@ -2,11 +2,12 @@ import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-i
2
2
  import type { AbstractDomainValue } from '../domains/abstract-domain';
3
3
  import { PosIntervalDomain } from '../domains/positive-interval-domain';
4
4
  import { ProductDomain } from '../domains/product-domain';
5
- import { SetUpperBoundDomain } from '../domains/set-upper-bound-domain';
5
+ import type { SetRangeLimit } from '../domains/set-range-domain';
6
+ import { SetRangeDomain } from '../domains/set-range-domain';
6
7
  import { StateAbstractDomain } from '../domains/state-abstract-domain';
7
8
  /** The type of the abstract product representing the shape of data frames */
8
9
  export type AbstractDataFrameShape = {
9
- colnames: SetUpperBoundDomain<string>;
10
+ colnames: SetRangeDomain<string>;
10
11
  cols: PosIntervalDomain;
11
12
  rows: PosIntervalDomain;
12
13
  };
@@ -16,7 +17,7 @@ export type DataFrameShapeProperty<Property extends keyof AbstractDataFrameShape
16
17
  * The data frame abstract domain as product domain of a column names domain, column count domain, and row count domain.
17
18
  */
18
19
  export declare class DataFrameDomain extends ProductDomain<AbstractDataFrameShape> {
19
- constructor(value: AbstractDataFrameShape, maxColNames?: number);
20
+ constructor(value: AbstractDataFrameShape, maxColNames?: SetRangeLimit | number);
20
21
  create(value: AbstractDataFrameShape): this;
21
22
  /**
22
23
  * The current abstract value of the column names domain.
@@ -30,10 +31,6 @@ export declare class DataFrameDomain extends ProductDomain<AbstractDataFrameShap
30
31
  * The current abstract value of the row count domain.
31
32
  */
32
33
  get rows(): AbstractDataFrameShape['rows'];
33
- /**
34
- * The maximum number of inferred column names of the column names domain.
35
- */
36
- get maxColNames(): number;
37
34
  static bottom(maxColNames?: number): DataFrameDomain;
38
35
  static top(maxColNames?: number): DataFrameDomain;
39
36
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DataFrameStateDomain = exports.DataFrameDomain = void 0;
4
4
  const positive_interval_domain_1 = require("../domains/positive-interval-domain");
5
5
  const product_domain_1 = require("../domains/product-domain");
6
- const set_upper_bound_domain_1 = require("../domains/set-upper-bound-domain");
6
+ const set_range_domain_1 = require("../domains/set-range-domain");
7
7
  const state_abstract_domain_1 = require("../domains/state-abstract-domain");
8
8
  /**
9
9
  * The data frame abstract domain as product domain of a column names domain, column count domain, and row count domain.
@@ -11,13 +11,13 @@ const state_abstract_domain_1 = require("../domains/state-abstract-domain");
11
11
  class DataFrameDomain extends product_domain_1.ProductDomain {
12
12
  constructor(value, maxColNames) {
13
13
  super({
14
- colnames: new set_upper_bound_domain_1.SetUpperBoundDomain(value.colnames.value, maxColNames ?? value.colnames.limit),
14
+ colnames: new set_range_domain_1.SetRangeDomain(value.colnames.value, maxColNames ?? value.colnames.limit),
15
15
  cols: new positive_interval_domain_1.PosIntervalDomain(value.cols.value),
16
16
  rows: new positive_interval_domain_1.PosIntervalDomain(value.rows.value)
17
17
  });
18
18
  }
19
19
  create(value) {
20
- return new DataFrameDomain(value, this.maxColNames);
20
+ return new DataFrameDomain(value, this.colnames.limit);
21
21
  }
22
22
  /**
23
23
  * The current abstract value of the column names domain.
@@ -37,22 +37,16 @@ class DataFrameDomain extends product_domain_1.ProductDomain {
37
37
  get rows() {
38
38
  return this.value.rows;
39
39
  }
40
- /**
41
- * The maximum number of inferred column names of the column names domain.
42
- */
43
- get maxColNames() {
44
- return this.value.colnames.limit;
45
- }
46
40
  static bottom(maxColNames) {
47
41
  return new DataFrameDomain({
48
- colnames: set_upper_bound_domain_1.SetUpperBoundDomain.bottom(maxColNames),
42
+ colnames: set_range_domain_1.SetRangeDomain.bottom(maxColNames),
49
43
  cols: positive_interval_domain_1.PosIntervalDomain.bottom(),
50
44
  rows: positive_interval_domain_1.PosIntervalDomain.bottom()
51
45
  });
52
46
  }
53
47
  static top(maxColNames) {
54
48
  return new DataFrameDomain({
55
- colnames: set_upper_bound_domain_1.SetUpperBoundDomain.top(maxColNames),
49
+ colnames: set_range_domain_1.SetRangeDomain.top(maxColNames),
56
50
  cols: positive_interval_domain_1.PosIntervalDomain.top(),
57
51
  rows: positive_interval_domain_1.PosIntervalDomain.top()
58
52
  });
@@ -3,13 +3,15 @@ import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
3
3
  import type { RAccess, RNamedAccess } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-access';
4
4
  import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
5
5
  import type { DataFrameExpressionInfo } from '../absint-info';
6
+ import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
6
7
  /**
7
8
  * Maps a concrete data frame access to abstract data frame operations.
8
9
  * @param node - The R node of the access
9
10
  * @param dfg - The data flow graph for resolving the arguments
11
+ * @param ctx - The read-only Flowr analyzer context
10
12
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame access
11
13
  */
12
- export declare function mapDataFrameAccess(node: RNode<ParentInformation>, dfg: DataflowGraph): DataFrameExpressionInfo | undefined;
14
+ export declare function mapDataFrameAccess(node: RNode<ParentInformation>, dfg: DataflowGraph, ctx: ReadOnlyFlowrAnalyzerContext): DataFrameExpressionInfo | undefined;
13
15
  /**
14
16
  * Checks whether an access node represents a string-based access (`$` or `@`), and no index-based access (`[` or `[[`).
15
17
  */
@@ -18,13 +18,14 @@ const SpecialAccessArgumentsMapper = {
18
18
  * Maps a concrete data frame access to abstract data frame operations.
19
19
  * @param node - The R node of the access
20
20
  * @param dfg - The data flow graph for resolving the arguments
21
+ * @param ctx - The read-only Flowr analyzer context
21
22
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame access
22
23
  */
23
- function mapDataFrameAccess(node, dfg) {
24
+ function mapDataFrameAccess(node, dfg, ctx) {
24
25
  if (node.type !== type_1.RType.Access) {
25
26
  return;
26
27
  }
27
- const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias };
28
+ const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias, ctx };
28
29
  let operations;
29
30
  if (isStringBasedAccess(node)) {
30
31
  operations = mapDataFrameNamedColumnAccess(node, resolveInfo);
@@ -15,11 +15,11 @@ exports.isValidColName = isValidColName;
15
15
  const vertex_1 = require("../../../dataflow/graph/vertex");
16
16
  const make_argument_1 = require("../../../dataflow/internal/process/functions/call/argument/make-argument");
17
17
  const r_function_call_1 = require("../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
18
+ const visitor_1 = require("../../../r-bridge/lang-4.x/ast/model/processing/visitor");
18
19
  const type_1 = require("../../../r-bridge/lang-4.x/ast/model/type");
19
20
  const convert_values_1 = require("../../../r-bridge/lang-4.x/convert-values");
20
- const shape_inference_1 = require("../shape-inference");
21
21
  const resolve_args_1 = require("../resolve-args");
22
- const visitor_1 = require("../../../r-bridge/lang-4.x/ast/model/processing/visitor");
22
+ const shape_inference_1 = require("../shape-inference");
23
23
  /** Regular expression representing valid columns names, e.g. for `data.frame` */
24
24
  const ColNamesRegex = /^[A-Za-z.][A-Za-z0-9_.]*$/;
25
25
  /**
@@ -4,15 +4,17 @@ import type { RString } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-strin
4
4
  import type { RSymbol } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-symbol';
5
5
  import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
6
6
  import type { DataFrameAssignmentInfo } from '../absint-info';
7
+ import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
7
8
  /**
8
9
  * Maps a concrete data frame assignment to data frame assignment info containing the ids of the identifier and assigned expression.
9
10
  * We currently do not support function assignments dealing with data frames.
10
11
  * @param identifier - The R node of the variable identifier
11
12
  * @param expression - The R node of the assigned expression
12
13
  * @param dfg - The data flow graph for resolving the arguments
14
+ * @param ctx - The analysis context
13
15
  * @returns Data frame assignment info containing the IDs of the identifier and expression, or `undefined` if the node does not represent a data frame assignment
14
16
  */
15
- export declare function mapDataFrameVariableAssignment(identifier: RSymbol<ParentInformation> | RString<ParentInformation>, expression: RNode<ParentInformation>, dfg: DataflowGraph): DataFrameAssignmentInfo | undefined;
17
+ export declare function mapDataFrameVariableAssignment(identifier: RSymbol<ParentInformation> | RString<ParentInformation>, expression: RNode<ParentInformation>, dfg: DataflowGraph, ctx: ReadOnlyFlowrAnalyzerContext): DataFrameAssignmentInfo | undefined;
16
18
  /**
17
19
  * Checks whether a R node represents an assignment target, i.e. is a `RSymbol` or `RString`.
18
20
  */
@@ -11,10 +11,11 @@ const arguments_1 = require("./arguments");
11
11
  * @param identifier - The R node of the variable identifier
12
12
  * @param expression - The R node of the assigned expression
13
13
  * @param dfg - The data flow graph for resolving the arguments
14
+ * @param ctx - The analysis context
14
15
  * @returns Data frame assignment info containing the IDs of the identifier and expression, or `undefined` if the node does not represent a data frame assignment
15
16
  */
16
- function mapDataFrameVariableAssignment(identifier, expression, dfg) {
17
- const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias };
17
+ function mapDataFrameVariableAssignment(identifier, expression, dfg, ctx) {
18
+ const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias, ctx };
18
19
  if (!(0, arguments_1.isDataFrameArgument)(expression, resolveInfo)) {
19
20
  return;
20
21
  }
@@ -1,11 +1,11 @@
1
1
  import { type ResolveInfo } from '../../../dataflow/eval/resolve/alias-tracking';
2
2
  import type { DataflowGraph } from '../../../dataflow/graph/graph';
3
+ import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
3
4
  import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
4
5
  import { type RFunctionArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
5
6
  import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
6
7
  import type { DataFrameExpressionInfo, DataFrameOperation } from '../absint-info';
7
8
  import { type FunctionParameterLocation } from './arguments';
8
- import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
9
9
  /**
10
10
  * Represents the different types of data frames in R
11
11
  */
@@ -528,7 +528,7 @@ function mapDataFrameFunctionCall(node, dfg, ctx) {
528
528
  if (node.type !== type_1.RType.FunctionCall || !node.named) {
529
529
  return;
530
530
  }
531
- const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias };
531
+ const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias, ctx };
532
532
  let operations;
533
533
  if (isDataFrameFunction(node.functionName.content)) {
534
534
  const functionName = node.functionName.content;
@@ -946,20 +946,20 @@ function mapDataFrameMutate(args, params, info) {
946
946
  columns: accessedNames
947
947
  });
948
948
  }
949
- if (deletedCols === undefined || deletedCols.length > 0) {
949
+ if (mutatedCols === undefined || mutatedCols.length > 0 || deletedCols?.length === 0) {
950
950
  result.push({
951
- operation: 'removeCols',
951
+ operation: 'mutateCols',
952
952
  operand: operand?.info.id,
953
- colnames: deletedCols,
954
- options: { maybe: true }
953
+ colnames: mutatedCols
955
954
  });
956
955
  operand = undefined;
957
956
  }
958
- if (mutatedCols === undefined || mutatedCols.length > 0 || deletedCols?.length === 0) {
957
+ if (deletedCols === undefined || deletedCols.length > 0) {
959
958
  result.push({
960
- operation: 'mutateCols',
959
+ operation: 'removeCols',
961
960
  operand: operand?.info.id,
962
- colnames: mutatedCols
961
+ colnames: deletedCols,
962
+ options: { maybe: true }
963
963
  });
964
964
  operand = undefined;
965
965
  }
@@ -2,10 +2,12 @@ import type { DataflowGraph } from '../../../dataflow/graph/graph';
2
2
  import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
3
3
  import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
4
4
  import type { DataFrameExpressionInfo } from '../absint-info';
5
+ import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
5
6
  /**
6
7
  * Maps a concrete data frame replacement function to abstract data frame operations.
7
8
  * @param node - The R node of the replacement function
8
9
  * @param dfg - The data flow graph for resolving the arguments
10
+ * @param ctx - The read-only Flowr analysis context
9
11
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame replacement function
10
12
  */
11
- export declare function mapDataFrameReplacementFunction(node: RNode<ParentInformation>, expression: RNode<ParentInformation>, dfg: DataflowGraph): DataFrameExpressionInfo | undefined;
13
+ export declare function mapDataFrameReplacementFunction(node: RNode<ParentInformation>, expression: RNode<ParentInformation>, dfg: DataflowGraph, ctx: ReadOnlyFlowrAnalyzerContext): DataFrameExpressionInfo | undefined;
@@ -21,11 +21,12 @@ const DataFrameReplacementFunctionMapper = {
21
21
  * Maps a concrete data frame replacement function to abstract data frame operations.
22
22
  * @param node - The R node of the replacement function
23
23
  * @param dfg - The data flow graph for resolving the arguments
24
+ * @param ctx - The read-only Flowr analysis context
24
25
  * @returns Data frame expression info containing the mapped abstract data frame operations, or `undefined` if the node does not represent a data frame replacement function
25
26
  */
26
- function mapDataFrameReplacementFunction(node, expression, dfg) {
27
+ function mapDataFrameReplacementFunction(node, expression, dfg, ctx) {
27
28
  const parent = hasParentReplacement(node, dfg) ? dfg.idMap?.get(node.info.parent) : undefined;
28
- const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias };
29
+ const resolveInfo = { graph: dfg, idMap: dfg.idMap, full: true, resolve: config_1.VariableResolve.Alias, ctx };
29
30
  let operations;
30
31
  if (node.type === type_1.RType.Access) {
31
32
  if (node.access.every(arg => arg === r_function_call_1.EmptyArgument)) {