@eagleoutice/flowr 1.4.1 → 1.5.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 (300) hide show
  1. package/README.md +3 -3
  2. package/abstract-interpretation/processor.js +9 -3
  3. package/config.d.ts +16 -0
  4. package/config.js +75 -0
  5. package/core/input.d.ts +1 -1
  6. package/core/output.d.ts +1 -2
  7. package/core/print/parse-printer.d.ts +1 -2
  8. package/core/print/parse-printer.js +6 -4
  9. package/core/print/slice-diff-ansi.js +7 -7
  10. package/core/slicer.js +4 -8
  11. package/core/steps.d.ts +355 -31
  12. package/core/steps.js +7 -14
  13. package/dataflow/environments/environment.js +8 -0
  14. package/dataflow/environments/register.js +1 -0
  15. package/dataflow/extractor.d.ts +2 -2
  16. package/dataflow/extractor.js +10 -2
  17. package/dataflow/internal/process/functions/function-call.js +7 -1
  18. package/dataflow/internal/process/functions/source.d.ts +8 -0
  19. package/dataflow/internal/process/functions/source.js +81 -0
  20. package/dataflow/processor.d.ts +10 -1
  21. package/index.d.ts +0 -2
  22. package/index.js +0 -2
  23. package/package.json +75 -202
  24. package/r-bridge/lang-4.x/ast/index.d.ts +1 -0
  25. package/r-bridge/lang-4.x/ast/index.js +3 -0
  26. package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +2 -0
  27. package/r-bridge/lang-4.x/ast/model/processing/decorate.js +6 -1
  28. package/r-bridge/lang-4.x/ast/parser/json/format.d.ts +14 -0
  29. package/r-bridge/lang-4.x/ast/parser/json/format.js +26 -0
  30. package/r-bridge/lang-4.x/ast/parser/json/parser.d.ts +7 -0
  31. package/r-bridge/lang-4.x/ast/parser/json/parser.js +57 -0
  32. package/r-bridge/lang-4.x/ast/parser/xml/data.d.ts +0 -3
  33. package/r-bridge/lang-4.x/ast/parser/xml/index.d.ts +0 -2
  34. package/r-bridge/lang-4.x/ast/parser/xml/index.js +0 -2
  35. package/r-bridge/lang-4.x/ast/parser/xml/input-format.d.ts +5 -1
  36. package/r-bridge/lang-4.x/ast/parser/xml/input-format.js +7 -10
  37. package/r-bridge/lang-4.x/ast/parser/xml/internal/access.js +2 -2
  38. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then-else.js +1 -1
  39. package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then.js +2 -2
  40. package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.js +4 -4
  41. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/argument.js +2 -2
  42. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/call.js +4 -4
  43. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.js +2 -2
  44. package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/parameter.js +2 -2
  45. package/r-bridge/lang-4.x/ast/parser/xml/internal/index.d.ts +0 -1
  46. package/r-bridge/lang-4.x/ast/parser/xml/internal/index.js +0 -1
  47. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.js +2 -2
  48. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.js +3 -6
  49. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.js +2 -2
  50. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.js +2 -2
  51. package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.js +2 -2
  52. package/r-bridge/lang-4.x/ast/parser/xml/internal/meta.d.ts +6 -11
  53. package/r-bridge/lang-4.x/ast/parser/xml/internal/meta.js +15 -23
  54. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/binary.js +6 -6
  55. package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.js +3 -3
  56. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.js +2 -2
  57. package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.js +2 -2
  58. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.js +3 -3
  59. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.js +3 -4
  60. package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.js +2 -2
  61. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.js +2 -2
  62. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.js +2 -2
  63. package/r-bridge/lang-4.x/ast/parser/xml/internal/values/symbol.js +4 -4
  64. package/r-bridge/lang-4.x/values.d.ts +0 -1
  65. package/r-bridge/lang-4.x/values.js +14 -6
  66. package/r-bridge/retriever.d.ts +25 -21
  67. package/r-bridge/retriever.js +73 -23
  68. package/r-bridge/shell-executor.d.ts +3 -17
  69. package/r-bridge/shell-executor.js +9 -78
  70. package/r-bridge/shell.d.ts +5 -27
  71. package/r-bridge/shell.js +31 -92
  72. package/{statistics/output → util}/ansi.js +1 -1
  73. package/util/args.d.ts +8 -4
  74. package/util/args.js +11 -4
  75. package/util/cfg/visitor.js +1 -1
  76. package/util/files.d.ts +6 -0
  77. package/util/files.js +11 -1
  78. package/util/log.js +3 -0
  79. package/util/{summarizer/summarizer.d.ts → summarizer.d.ts} +15 -1
  80. package/util/summarizer.js +37 -0
  81. package/util/version.d.ts +2 -0
  82. package/util/version.js +10 -0
  83. package/benchmark/index.d.ts +0 -3
  84. package/benchmark/index.js +0 -20
  85. package/benchmark/slicer.d.ts +0 -101
  86. package/benchmark/slicer.js +0 -225
  87. package/benchmark/stats/index.d.ts +0 -10
  88. package/benchmark/stats/index.js +0 -27
  89. package/benchmark/stats/print.d.ts +0 -7
  90. package/benchmark/stats/print.js +0 -157
  91. package/benchmark/stats/stats.d.ts +0 -41
  92. package/benchmark/stats/stats.js +0 -6
  93. package/benchmark/stopwatch.d.ts +0 -35
  94. package/benchmark/stopwatch.js +0 -79
  95. package/cli/benchmark-app.d.ts +0 -9
  96. package/cli/benchmark-app.js +0 -52
  97. package/cli/benchmark-helper-app.d.ts +0 -7
  98. package/cli/benchmark-helper-app.js +0 -60
  99. package/cli/common/features.d.ts +0 -3
  100. package/cli/common/features.js +0 -30
  101. package/cli/common/index.d.ts +0 -2
  102. package/cli/common/index.js +0 -19
  103. package/cli/common/options.d.ts +0 -20
  104. package/cli/common/options.js +0 -82
  105. package/cli/common/script.d.ts +0 -21
  106. package/cli/common/script.js +0 -61
  107. package/cli/common/scripts-info.d.ts +0 -24
  108. package/cli/common/scripts-info.js +0 -69
  109. package/cli/export-quads-app.d.ts +0 -7
  110. package/cli/export-quads-app.js +0 -46
  111. package/cli/repl/commands/cfg.d.ts +0 -3
  112. package/cli/repl/commands/cfg.js +0 -37
  113. package/cli/repl/commands/commands.d.ts +0 -11
  114. package/cli/repl/commands/commands.js +0 -103
  115. package/cli/repl/commands/dataflow.d.ts +0 -3
  116. package/cli/repl/commands/dataflow.js +0 -34
  117. package/cli/repl/commands/execute.d.ts +0 -4
  118. package/cli/repl/commands/execute.js +0 -27
  119. package/cli/repl/commands/index.d.ts +0 -2
  120. package/cli/repl/commands/index.js +0 -19
  121. package/cli/repl/commands/main.d.ts +0 -39
  122. package/cli/repl/commands/main.js +0 -14
  123. package/cli/repl/commands/normalize.d.ts +0 -3
  124. package/cli/repl/commands/normalize.js +0 -34
  125. package/cli/repl/commands/parse.d.ts +0 -2
  126. package/cli/repl/commands/parse.js +0 -109
  127. package/cli/repl/commands/quit.d.ts +0 -2
  128. package/cli/repl/commands/quit.js +0 -12
  129. package/cli/repl/commands/version.d.ts +0 -16
  130. package/cli/repl/commands/version.js +0 -33
  131. package/cli/repl/core.d.ts +0 -39
  132. package/cli/repl/core.js +0 -116
  133. package/cli/repl/execute.d.ts +0 -28
  134. package/cli/repl/execute.js +0 -79
  135. package/cli/repl/index.d.ts +0 -5
  136. package/cli/repl/index.js +0 -22
  137. package/cli/repl/prompt.d.ts +0 -2
  138. package/cli/repl/prompt.js +0 -9
  139. package/cli/repl/server/connection.d.ts +0 -21
  140. package/cli/repl/server/connection.js +0 -218
  141. package/cli/repl/server/messages/analysis.d.ts +0 -71
  142. package/cli/repl/server/messages/analysis.js +0 -21
  143. package/cli/repl/server/messages/error.d.ts +0 -11
  144. package/cli/repl/server/messages/error.js +0 -3
  145. package/cli/repl/server/messages/hello.d.ts +0 -20
  146. package/cli/repl/server/messages/hello.js +0 -3
  147. package/cli/repl/server/messages/index.d.ts +0 -1
  148. package/cli/repl/server/messages/index.js +0 -3
  149. package/cli/repl/server/messages/messages.d.ts +0 -35
  150. package/cli/repl/server/messages/messages.js +0 -40
  151. package/cli/repl/server/messages/repl.d.ts +0 -33
  152. package/cli/repl/server/messages/repl.js +0 -37
  153. package/cli/repl/server/messages/slice.d.ts +0 -25
  154. package/cli/repl/server/messages/slice.js +0 -37
  155. package/cli/repl/server/net.d.ts +0 -49
  156. package/cli/repl/server/net.js +0 -63
  157. package/cli/repl/server/send.d.ts +0 -4
  158. package/cli/repl/server/send.js +0 -18
  159. package/cli/repl/server/server.d.ts +0 -20
  160. package/cli/repl/server/server.js +0 -66
  161. package/cli/repl/server/validate.d.ts +0 -15
  162. package/cli/repl/server/validate.js +0 -34
  163. package/cli/slicer-app.d.ts +0 -11
  164. package/cli/slicer-app.js +0 -81
  165. package/cli/statistics-app.d.ts +0 -11
  166. package/cli/statistics-app.js +0 -98
  167. package/cli/statistics-helper-app.d.ts +0 -11
  168. package/cli/statistics-helper-app.js +0 -83
  169. package/cli/summarizer-app.d.ts +0 -18
  170. package/cli/summarizer-app.js +0 -67
  171. package/flowr.d.ts +0 -27
  172. package/flowr.js +0 -137
  173. package/r-bridge/lang-4.x/ast/parser/xml/config.d.ts +0 -25
  174. package/r-bridge/lang-4.x/ast/parser/xml/config.js +0 -16
  175. package/r-bridge/lang-4.x/ast/parser/xml/internal/xml-to-json.d.ts +0 -9
  176. package/r-bridge/lang-4.x/ast/parser/xml/internal/xml-to-json.js +0 -51
  177. package/r-bridge/lang-4.x/ast/parser/xml/parser.d.ts +0 -17
  178. package/r-bridge/lang-4.x/ast/parser/xml/parser.js +0 -30
  179. package/statistics/features/common-syntax-probability.d.ts +0 -31
  180. package/statistics/features/common-syntax-probability.js +0 -156
  181. package/statistics/features/feature.d.ts +0 -175
  182. package/statistics/features/feature.js +0 -30
  183. package/statistics/features/index.d.ts +0 -1
  184. package/statistics/features/index.js +0 -18
  185. package/statistics/features/post-processing.d.ts +0 -12
  186. package/statistics/features/post-processing.js +0 -21
  187. package/statistics/features/supported/assignments/assignments.d.ts +0 -11
  188. package/statistics/features/supported/assignments/assignments.js +0 -53
  189. package/statistics/features/supported/assignments/index.d.ts +0 -1
  190. package/statistics/features/supported/assignments/index.js +0 -6
  191. package/statistics/features/supported/assignments/post-process.d.ts +0 -3
  192. package/statistics/features/supported/assignments/post-process.js +0 -125
  193. package/statistics/features/supported/comments/comments.d.ts +0 -18
  194. package/statistics/features/supported/comments/comments.js +0 -133
  195. package/statistics/features/supported/comments/index.d.ts +0 -1
  196. package/statistics/features/supported/comments/index.js +0 -6
  197. package/statistics/features/supported/comments/post-process.d.ts +0 -3
  198. package/statistics/features/supported/comments/post-process.js +0 -50
  199. package/statistics/features/supported/control-flow/control-flow.d.ts +0 -17
  200. package/statistics/features/supported/control-flow/control-flow.js +0 -67
  201. package/statistics/features/supported/control-flow/index.d.ts +0 -1
  202. package/statistics/features/supported/control-flow/index.js +0 -6
  203. package/statistics/features/supported/control-flow/post-process.d.ts +0 -3
  204. package/statistics/features/supported/control-flow/post-process.js +0 -65
  205. package/statistics/features/supported/data-access/data-access.d.ts +0 -15
  206. package/statistics/features/supported/data-access/data-access.js +0 -118
  207. package/statistics/features/supported/data-access/index.d.ts +0 -1
  208. package/statistics/features/supported/data-access/index.js +0 -6
  209. package/statistics/features/supported/data-access/post-process.d.ts +0 -3
  210. package/statistics/features/supported/data-access/post-process.js +0 -107
  211. package/statistics/features/supported/defined-functions/defined-functions.d.ts +0 -35
  212. package/statistics/features/supported/defined-functions/defined-functions.js +0 -139
  213. package/statistics/features/supported/defined-functions/index.d.ts +0 -1
  214. package/statistics/features/supported/defined-functions/index.js +0 -6
  215. package/statistics/features/supported/defined-functions/post-process.d.ts +0 -6
  216. package/statistics/features/supported/defined-functions/post-process.js +0 -177
  217. package/statistics/features/supported/expression-list/expression-list.d.ts +0 -9
  218. package/statistics/features/supported/expression-list/expression-list.js +0 -36
  219. package/statistics/features/supported/expression-list/index.d.ts +0 -1
  220. package/statistics/features/supported/expression-list/index.js +0 -6
  221. package/statistics/features/supported/expression-list/post-process.d.ts +0 -3
  222. package/statistics/features/supported/expression-list/post-process.js +0 -44
  223. package/statistics/features/supported/index.d.ts +0 -10
  224. package/statistics/features/supported/index.js +0 -27
  225. package/statistics/features/supported/loops/index.d.ts +0 -1
  226. package/statistics/features/supported/loops/index.js +0 -6
  227. package/statistics/features/supported/loops/loops.d.ts +0 -20
  228. package/statistics/features/supported/loops/loops.js +0 -79
  229. package/statistics/features/supported/loops/post-process.d.ts +0 -3
  230. package/statistics/features/supported/loops/post-process.js +0 -72
  231. package/statistics/features/supported/used-functions/index.d.ts +0 -1
  232. package/statistics/features/supported/used-functions/index.js +0 -6
  233. package/statistics/features/supported/used-functions/post-process.d.ts +0 -6
  234. package/statistics/features/supported/used-functions/post-process.js +0 -179
  235. package/statistics/features/supported/used-functions/used-functions.d.ts +0 -24
  236. package/statistics/features/supported/used-functions/used-functions.js +0 -95
  237. package/statistics/features/supported/used-packages/index.d.ts +0 -1
  238. package/statistics/features/supported/used-packages/index.js +0 -6
  239. package/statistics/features/supported/used-packages/post-process.d.ts +0 -3
  240. package/statistics/features/supported/used-packages/post-process.js +0 -121
  241. package/statistics/features/supported/used-packages/used-packages.d.ts +0 -16
  242. package/statistics/features/supported/used-packages/used-packages.js +0 -130
  243. package/statistics/features/supported/values/index.d.ts +0 -1
  244. package/statistics/features/supported/values/index.js +0 -6
  245. package/statistics/features/supported/values/post-process.d.ts +0 -3
  246. package/statistics/features/supported/values/post-process.js +0 -72
  247. package/statistics/features/supported/values/values.d.ts +0 -14
  248. package/statistics/features/supported/values/values.js +0 -101
  249. package/statistics/features/supported/variables/index.d.ts +0 -1
  250. package/statistics/features/supported/variables/index.js +0 -6
  251. package/statistics/features/supported/variables/post-process.d.ts +0 -9
  252. package/statistics/features/supported/variables/post-process.js +0 -122
  253. package/statistics/features/supported/variables/variables.d.ts +0 -15
  254. package/statistics/features/supported/variables/variables.js +0 -70
  255. package/statistics/index.d.ts +0 -6
  256. package/statistics/index.js +0 -24
  257. package/statistics/meta-statistics.d.ts +0 -33
  258. package/statistics/meta-statistics.js +0 -17
  259. package/statistics/output/file-provider.d.ts +0 -37
  260. package/statistics/output/file-provider.js +0 -97
  261. package/statistics/output/index.d.ts +0 -4
  262. package/statistics/output/index.js +0 -21
  263. package/statistics/output/print-stats.d.ts +0 -17
  264. package/statistics/output/print-stats.js +0 -69
  265. package/statistics/output/statistics-file.d.ts +0 -37
  266. package/statistics/output/statistics-file.js +0 -69
  267. package/statistics/statistics.d.ts +0 -24
  268. package/statistics/statistics.js +0 -109
  269. package/util/summarizer/auto-detect.d.ts +0 -2
  270. package/util/summarizer/auto-detect.js +0 -32
  271. package/util/summarizer/benchmark/data.d.ts +0 -66
  272. package/util/summarizer/benchmark/data.js +0 -13
  273. package/util/summarizer/benchmark/first-phase/input.d.ts +0 -2
  274. package/util/summarizer/benchmark/first-phase/input.js +0 -59
  275. package/util/summarizer/benchmark/first-phase/process.d.ts +0 -10
  276. package/util/summarizer/benchmark/first-phase/process.js +0 -208
  277. package/util/summarizer/benchmark/second-phase/graph.d.ts +0 -2
  278. package/util/summarizer/benchmark/second-phase/graph.js +0 -54
  279. package/util/summarizer/benchmark/second-phase/process.d.ts +0 -4
  280. package/util/summarizer/benchmark/second-phase/process.js +0 -89
  281. package/util/summarizer/benchmark/summarizer.d.ts +0 -35
  282. package/util/summarizer/benchmark/summarizer.js +0 -49
  283. package/util/summarizer/statistics/first-phase/process.d.ts +0 -6
  284. package/util/summarizer/statistics/first-phase/process.js +0 -81
  285. package/util/summarizer/statistics/post-process/clusterer.d.ts +0 -26
  286. package/util/summarizer/statistics/post-process/clusterer.js +0 -43
  287. package/util/summarizer/statistics/post-process/file-based-count.d.ts +0 -17
  288. package/util/summarizer/statistics/post-process/file-based-count.js +0 -49
  289. package/util/summarizer/statistics/post-process/histogram.d.ts +0 -59
  290. package/util/summarizer/statistics/post-process/histogram.js +0 -128
  291. package/util/summarizer/statistics/post-process/index.d.ts +0 -4
  292. package/util/summarizer/statistics/post-process/index.js +0 -21
  293. package/util/summarizer/statistics/post-process/post-process-output.d.ts +0 -16
  294. package/util/summarizer/statistics/post-process/post-process-output.js +0 -104
  295. package/util/summarizer/statistics/second-phase/process.d.ts +0 -11
  296. package/util/summarizer/statistics/second-phase/process.js +0 -117
  297. package/util/summarizer/statistics/summarizer.d.ts +0 -35
  298. package/util/summarizer/statistics/summarizer.js +0 -135
  299. package/util/summarizer/summarizer.js +0 -13
  300. /package/{statistics/output → util}/ansi.d.ts +0 -0
@@ -1,35 +0,0 @@
1
- import type { Feature } from '../../feature';
2
- import type { Writable } from 'ts-essentials';
3
- import type { SourcePosition } from '../../../../util/range';
4
- import type { MergeableRecord } from '../../../../util/objects';
5
- declare const initialFunctionDefinitionInfo: {
6
- /** all, anonymous, assigned, non-assigned, ... */
7
- total: number;
8
- /** how many are really using OP-Lambda? */
9
- lambdasOnly: number;
10
- /** using `<<-`, `<-`, `=`, `->` `->>` */
11
- assignedFunctions: number;
12
- nestedFunctions: number;
13
- /** functions that in some easily detectable way call themselves */
14
- recursive: number;
15
- deepestNesting: number;
16
- };
17
- export type FunctionDefinitionInfo = Writable<typeof initialFunctionDefinitionInfo>;
18
- export declare const AllDefinitionsFileBase = "all-definitions";
19
- export interface SingleFunctionDefinitionInformation extends MergeableRecord {
20
- location: SourcePosition;
21
- /** locations of all direct call sites */
22
- callsites: SourcePosition[];
23
- numberOfParameters: number;
24
- returns: {
25
- explicit: boolean;
26
- location: SourcePosition;
27
- }[];
28
- length: {
29
- lines: number;
30
- characters: number;
31
- nonWhitespaceCharacters: number;
32
- };
33
- }
34
- export declare const definedFunctions: Feature<FunctionDefinitionInfo>;
35
- export {};
@@ -1,139 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.definedFunctions = exports.AllDefinitionsFileBase = void 0;
4
- const output_1 = require("../../../output");
5
- const r_bridge_1 = require("../../../../r-bridge");
6
- const dataflow_1 = require("../../../../dataflow");
7
- const assert_1 = require("../../../../util/assert");
8
- const post_process_1 = require("./post-process");
9
- const initialFunctionDefinitionInfo = {
10
- /** all, anonymous, assigned, non-assigned, ... */
11
- total: 0,
12
- /** how many are really using OP-Lambda? */
13
- lambdasOnly: 0,
14
- /** using `<<-`, `<-`, `=`, `->` `->>` */
15
- assignedFunctions: 0,
16
- nestedFunctions: 0,
17
- /** functions that in some easily detectable way call themselves */
18
- recursive: 0,
19
- deepestNesting: 0
20
- };
21
- exports.AllDefinitionsFileBase = 'all-definitions';
22
- function retrieveAllCallsites(input, node, recursiveCalls) {
23
- const dfStart = input.dataflow.graph.outgoingEdges(node.info.id);
24
- const callsites = [];
25
- for (const [target, edge] of dfStart ?? []) {
26
- if (!edge.types.has(dataflow_1.EdgeType.Calls)) {
27
- continue;
28
- }
29
- const loc = input.normalizedRAst.idMap.get(target)?.location?.start;
30
- if (loc) {
31
- callsites.push(loc);
32
- }
33
- }
34
- for (const call of recursiveCalls) {
35
- const loc = call.location;
36
- if (loc) {
37
- callsites.push(loc.start);
38
- }
39
- }
40
- return callsites;
41
- }
42
- function visitDefinitions(info, input) {
43
- const definitionStack = [];
44
- const allDefinitions = [];
45
- (0, r_bridge_1.visitAst)(input.normalizedRAst.ast, node => {
46
- if (node.type !== "RFunctionDefinition" /* RType.FunctionDefinition */) {
47
- return;
48
- }
49
- const graph = input.dataflow.graph;
50
- const dfNode = graph.get(node.info.id, true);
51
- if (dfNode === undefined) {
52
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, 'no-dataflow-node-found', [node], input.filepath);
53
- return;
54
- }
55
- const [fnDefinition] = dfNode;
56
- (0, assert_1.guard)(fnDefinition.tag === 'function-definition', () => `Dataflow node is not a function definition (${JSON.stringify(fnDefinition)}))})`);
57
- const returnTypes = fnDefinition.exitPoints.map(ep => graph.get(ep, true)).filter(assert_1.isNotUndefined)
58
- .map(([vertex]) => ({
59
- explicit: vertex.tag === 'function-call' && vertex.name === 'return',
60
- location: input.normalizedRAst.idMap.get(vertex.id)?.location?.start ?? { line: -1, column: -1 }
61
- }));
62
- if (definitionStack.length > 0) {
63
- info.nestedFunctions++;
64
- info.deepestNesting = Math.max(info.deepestNesting, definitionStack.length);
65
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, 'nested-definitions', [node.info.fullLexeme ?? node.lexeme], input.filepath);
66
- }
67
- // parameter names:
68
- const parameterNames = node.parameters.map(p => p.info.fullLexeme ?? p.lexeme);
69
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, 'usedParameterNames', parameterNames, input.filepath);
70
- const isLambda = node.lexeme.startsWith('\\');
71
- if (isLambda) {
72
- info.lambdasOnly++;
73
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, 'allLambdas', [node.info.fullLexeme ?? node.lexeme], input.filepath);
74
- }
75
- definitionStack.push(node);
76
- // we find definitions with silly defined-by edges
77
- const assigned = new Set();
78
- const edges = input.dataflow.graph.ingoingEdges(node.info.id);
79
- if (edges !== undefined) {
80
- for (const [targetId, edge] of edges) {
81
- if (edge.types.has(dataflow_1.EdgeType.DefinedBy)) {
82
- const target = input.normalizedRAst.idMap.get(targetId);
83
- (0, assert_1.guard)(target !== undefined, 'Dataflow edge points to unknown node');
84
- const name = target.info.fullLexeme ?? target.lexeme;
85
- if (name) {
86
- assigned.add(name);
87
- }
88
- info.assignedFunctions++;
89
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, 'assignedFunctions', [name ?? '<unknown>'], input.filepath);
90
- }
91
- if (edge.types.has(dataflow_1.EdgeType.Calls)) {
92
- const target = input.normalizedRAst.idMap.get(targetId);
93
- (0, assert_1.guard)(target !== undefined, 'Dataflow edge points to unknown node');
94
- }
95
- }
96
- }
97
- // track all calls with the same name that do not already have a bound calls edge, superfluous if recursive tracking is explicit
98
- const recursiveCalls = [];
99
- (0, r_bridge_1.visitAst)(node.body, n => {
100
- if (n.type === "RFunctionCall" /* RType.FunctionCall */ && n.flavor === 'named' && assigned.has(n.functionName.lexeme)) {
101
- recursiveCalls.push(n);
102
- }
103
- });
104
- // one recursive definition, but we record all
105
- info.recursive += recursiveCalls.length > 0 ? 1 : 0;
106
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, 'recursive', recursiveCalls.map(n => n.info.fullLexeme ?? n.lexeme ?? 'unknown'), input.filepath);
107
- const lexeme = node.info.fullLexeme;
108
- const lexemeSplit = lexeme?.split('\n');
109
- allDefinitions.push({
110
- location: node.location.start,
111
- callsites: retrieveAllCallsites(input, node, recursiveCalls),
112
- numberOfParameters: node.parameters.length,
113
- returns: returnTypes,
114
- length: {
115
- lines: lexemeSplit?.length ?? -1,
116
- characters: lexeme?.length ?? -1,
117
- nonWhitespaceCharacters: lexeme?.replaceAll(/\s/g, '').length ?? 0
118
- }
119
- });
120
- }, node => {
121
- // drop again :D
122
- if (node.type === "RFunctionDefinition" /* RType.FunctionDefinition */) {
123
- definitionStack.pop();
124
- }
125
- });
126
- info.total += allDefinitions.length;
127
- (0, output_1.appendStatisticsFile)(exports.definedFunctions.name, exports.AllDefinitionsFileBase, allDefinitions, input.filepath);
128
- }
129
- exports.definedFunctions = {
130
- name: 'Defined Functions',
131
- description: 'All functions defined within the document',
132
- process(existing, input) {
133
- visitDefinitions(existing, input);
134
- return existing;
135
- },
136
- initialValue: initialFunctionDefinitionInfo,
137
- postProcess: post_process_1.postProcess
138
- };
139
- //# sourceMappingURL=defined-functions.js.map
@@ -1 +0,0 @@
1
- export { definedFunctions } from './defined-functions';
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.definedFunctions = void 0;
4
- var defined_functions_1 = require("./defined-functions");
5
- Object.defineProperty(exports, "definedFunctions", { enumerable: true, get: function () { return defined_functions_1.definedFunctions; } });
6
- //# sourceMappingURL=index.js.map
@@ -1,6 +0,0 @@
1
- import type { FeatureStatisticsWithMeta } from '../../feature';
2
- import type { StatisticsSummarizerConfiguration } from '../../../../util/summarizer/statistics/summarizer';
3
- /**
4
- * Note: the summary does not contain a 0 for each function that is _not_ called by a file. Hence, the minimum can not be 0 (division for mean etc. will still be performed on total file count)
5
- */
6
- export declare function postProcess(featureRoot: string, info: Map<string, FeatureStatisticsWithMeta>, outputPath: string, config: StatisticsSummarizerConfiguration): void;
@@ -1,177 +0,0 @@
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.postProcess = void 0;
7
- const data_1 = require("../../../../util/summarizer/benchmark/data");
8
- const process_1 = require("../../../../util/summarizer/benchmark/first-phase/process");
9
- const files_1 = require("../../../../util/files");
10
- const path_1 = __importDefault(require("path"));
11
- const node_fs_1 = __importDefault(require("node:fs"));
12
- const time_1 = require("../../../../util/time");
13
- const defined_functions_1 = require("./defined-functions");
14
- const post_processing_1 = require("../../post-processing");
15
- const arrays_1 = require("../../../../util/arrays");
16
- function getFnDefCsv(idx, info) {
17
- return `${JSON.stringify(idx)},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.total.flat()))}`
18
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.parameters.flat()))}`
19
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.length.lines.flat()))}`
20
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.length.chars.flat()))}`
21
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.length.nonWhitespaceChars.flat()))}`
22
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.returns.explicit.flat()))}`
23
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.returns.implicit.flat()))}`
24
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.returns.onlyExplicit.flat()))}`
25
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.returns.onlyImplicit.flat()))}`
26
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.exitPointsLinePercentageInDef.flat(2)))}`
27
- + `,${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(info.linePercentageInFile.flat()))}\n`;
28
- }
29
- function addToList(data, count, filepath, config) {
30
- data.count.push(count);
31
- if (count > 0) {
32
- (0, post_processing_1.recordFilePath)(data, filepath, config);
33
- }
34
- }
35
- function retrievePerFileDefinitionInformation(featureRoot, info, config, outputPath) {
36
- /**
37
- * maps fn-name (including namespace) to several definition information
38
- * we use tuples to reduce the memory!
39
- */
40
- const definitionsPerFile = [];
41
- const mergedSuperDefinitions = emptyFunctionDefinitionSummary();
42
- // we collect only `all-calls`
43
- (0, files_1.readLineByLineSync)(path_1.default.join(featureRoot, `${defined_functions_1.AllDefinitionsFileBase}.txt`), (line, lineNumber) => processNextLine(definitionsPerFile, lineNumber, info, JSON.parse(String(line))));
44
- console.log(` [${(0, time_1.date2string)(new Date())}] Defined functions process completed, start to write out function info`);
45
- const fnOutStream = node_fs_1.default.createWriteStream(path_1.default.join(outputPath, 'function-definitions.csv'));
46
- const prefixes = ['total', 'params', 'length-lines', 'length-chars', 'length-non-ws-chars', 'return-explicit', 'return-implicit', 'return-only-explicit', 'return-only-implicit', 'exit-points-line-crac', 'def-line-frac'];
47
- const others = prefixes.flatMap(data_1.summarizedMeasurement2CsvHeader).join(',');
48
- fnOutStream.write(`counter,${others}\n`);
49
- for (const [idx, info] of definitionsPerFile.entries()) {
50
- fnOutStream.write(getFnDefCsv(idx, info));
51
- mergedSuperDefinitions.total.push(...info.total);
52
- mergedSuperDefinitions.parameters.push(...info.parameters);
53
- mergedSuperDefinitions.length.lines.push(...info.length.lines);
54
- mergedSuperDefinitions.length.chars.push(...info.length.chars);
55
- mergedSuperDefinitions.length.nonWhitespaceChars.push(...info.length.nonWhitespaceChars);
56
- mergedSuperDefinitions.returns.explicit.push(...info.returns.explicit);
57
- mergedSuperDefinitions.returns.implicit.push(...info.returns.implicit);
58
- mergedSuperDefinitions.returns.onlyExplicit.push(...info.returns.onlyExplicit);
59
- mergedSuperDefinitions.returns.onlyImplicit.push(...info.returns.onlyImplicit);
60
- mergedSuperDefinitions.exitPointsLinePercentageInDef.push(...info.exitPointsLinePercentageInDef);
61
- mergedSuperDefinitions.linePercentageInFile.push(...info.linePercentageInFile);
62
- mergedSuperDefinitions.callsites.push(...info.callsites);
63
- }
64
- // now, write the ultimate summary at the end of the file
65
- fnOutStream.write(getFnDefCsv('all', mergedSuperDefinitions));
66
- fnOutStream.close();
67
- }
68
- function retrieveMetaInformation(info, config, outputPath) {
69
- const data = {
70
- total: (0, post_processing_1.emptySummarizedWithProject)(),
71
- lambdasOnly: (0, post_processing_1.emptySummarizedWithProject)(),
72
- assignedFunctions: (0, post_processing_1.emptySummarizedWithProject)(),
73
- nestedFunctions: (0, post_processing_1.emptySummarizedWithProject)(),
74
- recursive: (0, post_processing_1.emptySummarizedWithProject)(),
75
- deepestNesting: (0, post_processing_1.emptySummarizedWithProject)()
76
- };
77
- for (const [filepath, meta] of info.entries()) {
78
- const us = meta.definedFunctions;
79
- addToList(data.total, us.total, filepath, config);
80
- addToList(data.lambdasOnly, us.lambdasOnly, filepath, config);
81
- addToList(data.assignedFunctions, us.assignedFunctions, filepath, config);
82
- addToList(data.nestedFunctions, us.nestedFunctions, filepath, config);
83
- addToList(data.recursive, us.recursive, filepath, config);
84
- addToList(data.deepestNesting, us.deepestNesting, filepath, config);
85
- }
86
- console.log(` [${(0, time_1.date2string)(new Date())}] Defined functions metadata reading completed, summarizing and writing to file`);
87
- const out = node_fs_1.default.createWriteStream(path_1.default.join(outputPath, 'function-definitions-meta.csv'));
88
- out.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
89
- for (const [key, val] of Object.entries(data)) {
90
- const data = val;
91
- out.write(`${JSON.stringify(key)},${data.uniqueProjects.size},${data.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(data.count))}\n`);
92
- }
93
- out.close();
94
- }
95
- function retrieveAssignedFunctionNames(featureRoot, config, outputPath) {
96
- const varNames = new Map();
97
- (0, files_1.readLineByLineSync)(path_1.default.join(featureRoot, 'assignedFunctions.txt'), line => {
98
- const parsed = JSON.parse(String(line));
99
- const [hits, context] = parsed;
100
- const countsForFile = (0, arrays_1.array2bag)(hits);
101
- for (const [name, count] of countsForFile.entries()) {
102
- let get = varNames.get(name);
103
- if (!get) {
104
- get = (0, post_processing_1.emptySummarizedWithProject)();
105
- varNames.set(name, get);
106
- }
107
- addToList(get, count, context ?? '', config);
108
- }
109
- });
110
- const varNamesOut = node_fs_1.default.createWriteStream(path_1.default.join(outputPath, 'function-definitions-var-names.csv'));
111
- varNamesOut.write(`name,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
112
- for (const [key, val] of varNames.entries()) {
113
- varNamesOut.write(`${JSON.stringify(key)},${val.uniqueProjects.size},${val.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(val.count))}\n`);
114
- }
115
- varNamesOut.close();
116
- }
117
- /**
118
- * Note: the summary does not contain a 0 for each function that is _not_ called by a file. Hence, the minimum can not be 0 (division for mean etc. will still be performed on total file count)
119
- */
120
- function postProcess(featureRoot, info, outputPath, config) {
121
- // each number[][] contains a 'number[]' per file
122
- retrievePerFileDefinitionInformation(featureRoot, info, config, outputPath);
123
- console.log(` [${(0, time_1.date2string)(new Date())}] Defined functions reading completed, summarizing info...`);
124
- retrieveMetaInformation(info, config, outputPath);
125
- retrieveAssignedFunctionNames(featureRoot, config, outputPath);
126
- }
127
- exports.postProcess = postProcess;
128
- function emptyFunctionDefinitionSummary() {
129
- return {
130
- total: [],
131
- parameters: [],
132
- length: {
133
- lines: [],
134
- chars: [],
135
- nonWhitespaceChars: []
136
- },
137
- returns: {
138
- explicit: [],
139
- implicit: [],
140
- onlyExplicit: [],
141
- onlyImplicit: []
142
- },
143
- exitPointsLinePercentageInDef: [],
144
- linePercentageInFile: [],
145
- callsites: []
146
- };
147
- }
148
- function processNextLine(data, lineNumber, info, line) {
149
- if (lineNumber % 2_500 === 0) {
150
- console.log(` [${(0, time_1.date2string)(new Date())}] Defined functions processed ${lineNumber} lines`);
151
- }
152
- const [hits, context] = line;
153
- const forFile = emptyFunctionDefinitionSummary();
154
- for (const { location, length, returns, numberOfParameters, callsites } of hits) {
155
- const stats = info.get(context ?? '')?.stats.lines[0].length;
156
- // we retrieve the first component fo the path
157
- forFile.total.push(1);
158
- forFile.parameters.push(numberOfParameters);
159
- forFile.length.lines.push(length.lines);
160
- forFile.length.chars.push(length.characters);
161
- forFile.length.nonWhitespaceChars.push(length.nonWhitespaceCharacters);
162
- const explicits = returns.filter(r => r.explicit);
163
- forFile.returns.explicit.push(explicits.length);
164
- forFile.returns.implicit.push(returns.length - explicits.length);
165
- forFile.returns.onlyExplicit.push(explicits.length === returns.length ? 1 : 0);
166
- forFile.returns.onlyImplicit.push(explicits.length === 0 ? 1 : 0);
167
- forFile.exitPointsLinePercentageInDef.push(returns.map(r => r.location.line).map(l => l / length.lines));
168
- forFile.callsites.push(callsites.length);
169
- if (stats) {
170
- forFile.linePercentageInFile.push(location.line / stats);
171
- }
172
- }
173
- // push all of that to main :D
174
- forFile.total = [forFile.total.length];
175
- data.push(forFile);
176
- }
177
- //# sourceMappingURL=post-process.js.map
@@ -1,9 +0,0 @@
1
- import type { Writable } from 'ts-essentials';
2
- import type { Feature } from '../../feature';
3
- declare const initialExpressionListInfo: {
4
- allExpressionLists: number;
5
- deepestNesting: number;
6
- };
7
- export type ExpressionListInfo = Writable<typeof initialExpressionListInfo>;
8
- export declare const expressionList: Feature<ExpressionListInfo>;
9
- export {};
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.expressionList = void 0;
4
- const r_bridge_1 = require("../../../../r-bridge");
5
- const post_process_1 = require("./post-process");
6
- const initialExpressionListInfo = {
7
- allExpressionLists: 0,
8
- deepestNesting: 0
9
- };
10
- function visitLists(info, input) {
11
- let nest = -1; // we start with nesting 0
12
- let total = 0;
13
- (0, r_bridge_1.visitAst)(input.normalizedRAst.ast, node => {
14
- if (node.type === "RExpressionList" /* RType.ExpressionList */) {
15
- nest++;
16
- total++;
17
- info.deepestNesting = Math.max(info.deepestNesting, nest);
18
- }
19
- }, node => {
20
- if (node.type === "RExpressionList" /* RType.ExpressionList */) {
21
- nest--;
22
- }
23
- });
24
- info.allExpressionLists += total;
25
- }
26
- exports.expressionList = {
27
- name: 'Expression Lists',
28
- description: 'Counts expression list nestings',
29
- process(existing, input) {
30
- visitLists(existing, input);
31
- return existing;
32
- },
33
- initialValue: initialExpressionListInfo,
34
- postProcess: post_process_1.postProcess
35
- };
36
- //# sourceMappingURL=expression-list.js.map
@@ -1 +0,0 @@
1
- export { expressionList } from './expression-list';
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.expressionList = void 0;
4
- var expression_list_1 = require("./expression-list");
5
- Object.defineProperty(exports, "expressionList", { enumerable: true, get: function () { return expression_list_1.expressionList; } });
6
- //# sourceMappingURL=index.js.map
@@ -1,3 +0,0 @@
1
- import type { FeatureStatisticsWithMeta } from '../../feature';
2
- import type { StatisticsSummarizerConfiguration } from '../../../../util/summarizer/statistics/summarizer';
3
- export declare function postProcess(featureRoot: string, info: Map<string, FeatureStatisticsWithMeta>, outputPath: string, config: StatisticsSummarizerConfiguration): void;
@@ -1,44 +0,0 @@
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.postProcess = void 0;
7
- const post_processing_1 = require("../../post-processing");
8
- const node_fs_1 = __importDefault(require("node:fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const data_1 = require("../../../../util/summarizer/benchmark/data");
11
- const process_1 = require("../../../../util/summarizer/benchmark/first-phase/process");
12
- function postProcess(featureRoot, info, outputPath, config) {
13
- const collected = {};
14
- const deepestNestingOut = node_fs_1.default.createWriteStream(path_1.default.join(outputPath, 'deepest-nesting-per-file.csv'));
15
- deepestNestingOut.write('file,deepest-nesting\n');
16
- for (const [filepath, data] of info.entries()) {
17
- const value = data.expressionList;
18
- for (const [key, val] of Object.entries(value)) {
19
- let get = collected[key];
20
- if (!get) {
21
- get = (0, post_processing_1.emptySummarizedWithProject)();
22
- collected[key] = get;
23
- }
24
- if (key === 'deepestNesting') {
25
- deepestNestingOut.write(`${JSON.stringify(filepath)},${val}\n`);
26
- }
27
- get.count.push(val);
28
- if (val > 0) {
29
- (0, post_processing_1.recordFilePath)(get, filepath, config);
30
- }
31
- }
32
- }
33
- deepestNestingOut.close();
34
- const variablesOutStream = node_fs_1.default.createWriteStream(path_1.default.join(outputPath, 'used-expression-lists.csv'));
35
- variablesOutStream.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
36
- for (const [key, val] of Object.entries(collected)) {
37
- const data = val;
38
- const sum = (0, process_1.summarizeMeasurement)(data.count);
39
- variablesOutStream.write(`${JSON.stringify(key)},${data.uniqueProjects.size},${data.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)(sum)}\n`);
40
- }
41
- variablesOutStream.close();
42
- }
43
- exports.postProcess = postProcess;
44
- //# sourceMappingURL=post-process.js.map
@@ -1,10 +0,0 @@
1
- export * from './loops/loops';
2
- export * from './values/values';
3
- export * from './comments/comments';
4
- export * from './data-access/data-access';
5
- export * from './assignments/assignments';
6
- export * from './control-flow/control-flow';
7
- export * from './used-packages/used-packages';
8
- export * from './used-functions/used-functions';
9
- export * from './defined-functions/defined-functions';
10
- export * from './expression-list/expression-list';
@@ -1,27 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./loops/loops"), exports);
18
- __exportStar(require("./values/values"), exports);
19
- __exportStar(require("./comments/comments"), exports);
20
- __exportStar(require("./data-access/data-access"), exports);
21
- __exportStar(require("./assignments/assignments"), exports);
22
- __exportStar(require("./control-flow/control-flow"), exports);
23
- __exportStar(require("./used-packages/used-packages"), exports);
24
- __exportStar(require("./used-functions/used-functions"), exports);
25
- __exportStar(require("./defined-functions/defined-functions"), exports);
26
- __exportStar(require("./expression-list/expression-list"), exports);
27
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- export { loops } from './loops';
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loops = void 0;
4
- var loops_1 = require("./loops");
5
- Object.defineProperty(exports, "loops", { enumerable: true, get: function () { return loops_1.loops; } });
6
- //# sourceMappingURL=index.js.map
@@ -1,20 +0,0 @@
1
- import type { Feature } from '../../feature';
2
- import type { Writable } from 'ts-essentials';
3
- declare const initialLoopInfo: {
4
- forLoops: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
5
- forLoopVar: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
6
- forBody: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
7
- whileLoops: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
8
- whileBody: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
9
- repeatLoops: bigint;
10
- repeatBody: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
11
- breakStatements: number;
12
- nextStatements: number;
13
- /** apply, tapply, lapply, ...*/
14
- implicitLoops: number;
15
- nestedExplicitLoops: number;
16
- deepestExplicitNesting: number;
17
- };
18
- export type LoopInfo = Writable<typeof initialLoopInfo>;
19
- export declare const loops: Feature<LoopInfo>;
20
- export {};
@@ -1,79 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loops = void 0;
4
- const output_1 = require("../../../output");
5
- const r_bridge_1 = require("../../../../r-bridge");
6
- const common_syntax_probability_1 = require("../../common-syntax-probability");
7
- const post_process_1 = require("./post-process");
8
- const initialLoopInfo = {
9
- forLoops: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
10
- forLoopVar: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
11
- forBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
12
- whileLoops: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
13
- whileBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
14
- repeatLoops: 0n,
15
- repeatBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
16
- breakStatements: 0,
17
- nextStatements: 0,
18
- /** apply, tapply, lapply, ...*/
19
- implicitLoops: 0,
20
- nestedExplicitLoops: 0,
21
- deepestExplicitNesting: 0
22
- };
23
- const isImplicitLoop = /[lsvmt]?apply/;
24
- function visitLoops(info, input) {
25
- // holds number of loops and their nesting depths
26
- const loopStack = [];
27
- (0, r_bridge_1.visitAst)(input.normalizedRAst.ast, node => {
28
- switch (node.type) {
29
- case "RNext" /* RType.Next */:
30
- info.nextStatements++;
31
- return;
32
- case "RBreak" /* RType.Break */:
33
- info.breakStatements++;
34
- return;
35
- case "RFunctionCall" /* RType.FunctionCall */:
36
- if (node.flavor === 'named' && isImplicitLoop.test(node.functionName.lexeme)) {
37
- info.implicitLoops++;
38
- (0, output_1.appendStatisticsFile)(exports.loops.name, 'implicit-loop', [node.functionName.info.fullLexeme ?? node.functionName.lexeme], input.filepath);
39
- }
40
- return;
41
- case "RForLoop" /* RType.ForLoop */:
42
- (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.forLoops, node.vector);
43
- (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.forLoopVar, node.variable);
44
- (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.forBody, ...node.body.children);
45
- break;
46
- case "RWhileLoop" /* RType.WhileLoop */:
47
- (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.whileLoops, node.condition);
48
- (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.whileBody, ...node.body.children);
49
- break;
50
- case "RRepeatLoop" /* RType.RepeatLoop */:
51
- info.repeatLoops++;
52
- (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.repeatBody, ...node.body.children);
53
- break;
54
- default: return;
55
- }
56
- (0, output_1.appendStatisticsFile)(exports.loops.name, 'all-loops', [node.info.fullLexeme ?? node.lexeme], input.filepath);
57
- if (loopStack.length > 0) {
58
- info.nestedExplicitLoops++;
59
- info.deepestExplicitNesting = Math.max(info.deepestExplicitNesting, loopStack.length);
60
- }
61
- loopStack.push(node);
62
- }, node => {
63
- // drop again :D
64
- if (node.type === "RForLoop" /* RType.ForLoop */ || node.type === "RWhileLoop" /* RType.WhileLoop */ || node.type === "RRepeatLoop" /* RType.RepeatLoop */) {
65
- loopStack.pop();
66
- }
67
- });
68
- }
69
- exports.loops = {
70
- name: 'Loops',
71
- description: 'All looping structures in the document',
72
- process(existing, input) {
73
- visitLoops(existing, input);
74
- return existing;
75
- },
76
- initialValue: initialLoopInfo,
77
- postProcess: post_process_1.postProcess
78
- };
79
- //# sourceMappingURL=loops.js.map
@@ -1,3 +0,0 @@
1
- import type { FeatureStatisticsWithMeta } from '../../feature';
2
- import type { StatisticsSummarizerConfiguration } from '../../../../util/summarizer/statistics/summarizer';
3
- export declare function postProcess(featureRoot: string, info: Map<string, FeatureStatisticsWithMeta>, outputPath: string, config: StatisticsSummarizerConfiguration): void;