@eagleoutice/flowr 1.4.2 → 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 (223) hide show
  1. package/core/print/slice-diff-ansi.js +7 -7
  2. package/core/steps.d.ts +352 -11
  3. package/core/steps.js +4 -4
  4. package/index.d.ts +0 -2
  5. package/index.js +0 -2
  6. package/package.json +65 -215
  7. package/util/{summarizer/summarizer.d.ts → summarizer.d.ts} +15 -1
  8. package/util/summarizer.js +37 -0
  9. package/util/version.d.ts +2 -0
  10. package/util/version.js +10 -0
  11. package/benchmark/index.d.ts +0 -3
  12. package/benchmark/index.js +0 -20
  13. package/benchmark/slicer.d.ts +0 -98
  14. package/benchmark/slicer.js +0 -213
  15. package/benchmark/stats/index.d.ts +0 -10
  16. package/benchmark/stats/index.js +0 -27
  17. package/benchmark/stats/print.d.ts +0 -7
  18. package/benchmark/stats/print.js +0 -155
  19. package/benchmark/stats/stats.d.ts +0 -40
  20. package/benchmark/stats/stats.js +0 -6
  21. package/benchmark/stopwatch.d.ts +0 -35
  22. package/benchmark/stopwatch.js +0 -79
  23. package/cli/benchmark-app.d.ts +0 -10
  24. package/cli/benchmark-app.js +0 -67
  25. package/cli/benchmark-helper-app.d.ts +0 -9
  26. package/cli/benchmark-helper-app.js +0 -69
  27. package/cli/common/features.d.ts +0 -3
  28. package/cli/common/features.js +0 -30
  29. package/cli/common/index.d.ts +0 -2
  30. package/cli/common/index.js +0 -19
  31. package/cli/common/options.d.ts +0 -20
  32. package/cli/common/options.js +0 -85
  33. package/cli/common/script.d.ts +0 -21
  34. package/cli/common/script.js +0 -61
  35. package/cli/common/scripts-info.d.ts +0 -25
  36. package/cli/common/scripts-info.js +0 -83
  37. package/cli/export-quads-app.d.ts +0 -7
  38. package/cli/export-quads-app.js +0 -42
  39. package/cli/repl/commands/cfg.d.ts +0 -3
  40. package/cli/repl/commands/cfg.js +0 -37
  41. package/cli/repl/commands/commands.d.ts +0 -13
  42. package/cli/repl/commands/commands.js +0 -142
  43. package/cli/repl/commands/dataflow.d.ts +0 -3
  44. package/cli/repl/commands/dataflow.js +0 -34
  45. package/cli/repl/commands/execute.d.ts +0 -4
  46. package/cli/repl/commands/execute.js +0 -27
  47. package/cli/repl/commands/index.d.ts +0 -2
  48. package/cli/repl/commands/index.js +0 -19
  49. package/cli/repl/commands/main.d.ts +0 -39
  50. package/cli/repl/commands/main.js +0 -14
  51. package/cli/repl/commands/normalize.d.ts +0 -3
  52. package/cli/repl/commands/normalize.js +0 -34
  53. package/cli/repl/commands/parse.d.ts +0 -2
  54. package/cli/repl/commands/parse.js +0 -109
  55. package/cli/repl/commands/quit.d.ts +0 -2
  56. package/cli/repl/commands/quit.js +0 -15
  57. package/cli/repl/commands/version.d.ts +0 -16
  58. package/cli/repl/commands/version.js +0 -33
  59. package/cli/repl/core.d.ts +0 -41
  60. package/cli/repl/core.js +0 -172
  61. package/cli/repl/execute.d.ts +0 -28
  62. package/cli/repl/execute.js +0 -79
  63. package/cli/repl/index.d.ts +0 -5
  64. package/cli/repl/index.js +0 -22
  65. package/cli/repl/prompt.d.ts +0 -2
  66. package/cli/repl/prompt.js +0 -9
  67. package/cli/repl/server/connection.d.ts +0 -21
  68. package/cli/repl/server/connection.js +0 -213
  69. package/cli/repl/server/messages/analysis.d.ts +0 -71
  70. package/cli/repl/server/messages/analysis.js +0 -21
  71. package/cli/repl/server/messages/error.d.ts +0 -11
  72. package/cli/repl/server/messages/error.js +0 -3
  73. package/cli/repl/server/messages/hello.d.ts +0 -20
  74. package/cli/repl/server/messages/hello.js +0 -3
  75. package/cli/repl/server/messages/index.d.ts +0 -1
  76. package/cli/repl/server/messages/index.js +0 -3
  77. package/cli/repl/server/messages/messages.d.ts +0 -35
  78. package/cli/repl/server/messages/messages.js +0 -40
  79. package/cli/repl/server/messages/repl.d.ts +0 -33
  80. package/cli/repl/server/messages/repl.js +0 -37
  81. package/cli/repl/server/messages/slice.d.ts +0 -25
  82. package/cli/repl/server/messages/slice.js +0 -37
  83. package/cli/repl/server/net.d.ts +0 -49
  84. package/cli/repl/server/net.js +0 -63
  85. package/cli/repl/server/send.d.ts +0 -4
  86. package/cli/repl/server/send.js +0 -18
  87. package/cli/repl/server/server.d.ts +0 -20
  88. package/cli/repl/server/server.js +0 -66
  89. package/cli/repl/server/validate.d.ts +0 -15
  90. package/cli/repl/server/validate.js +0 -34
  91. package/cli/slicer-app.d.ts +0 -11
  92. package/cli/slicer-app.js +0 -81
  93. package/cli/statistics-app.d.ts +0 -11
  94. package/cli/statistics-app.js +0 -98
  95. package/cli/statistics-helper-app.d.ts +0 -11
  96. package/cli/statistics-helper-app.js +0 -82
  97. package/cli/summarizer-app.d.ts +0 -18
  98. package/cli/summarizer-app.js +0 -66
  99. package/flowr.d.ts +0 -29
  100. package/flowr.js +0 -142
  101. package/statistics/features/common-syntax-probability.d.ts +0 -31
  102. package/statistics/features/common-syntax-probability.js +0 -156
  103. package/statistics/features/feature.d.ts +0 -175
  104. package/statistics/features/feature.js +0 -30
  105. package/statistics/features/index.d.ts +0 -1
  106. package/statistics/features/index.js +0 -18
  107. package/statistics/features/post-processing.d.ts +0 -12
  108. package/statistics/features/post-processing.js +0 -21
  109. package/statistics/features/supported/assignments/assignments.d.ts +0 -11
  110. package/statistics/features/supported/assignments/assignments.js +0 -53
  111. package/statistics/features/supported/assignments/index.d.ts +0 -1
  112. package/statistics/features/supported/assignments/index.js +0 -6
  113. package/statistics/features/supported/assignments/post-process.d.ts +0 -3
  114. package/statistics/features/supported/assignments/post-process.js +0 -125
  115. package/statistics/features/supported/comments/comments.d.ts +0 -18
  116. package/statistics/features/supported/comments/comments.js +0 -133
  117. package/statistics/features/supported/comments/index.d.ts +0 -1
  118. package/statistics/features/supported/comments/index.js +0 -6
  119. package/statistics/features/supported/comments/post-process.d.ts +0 -3
  120. package/statistics/features/supported/comments/post-process.js +0 -50
  121. package/statistics/features/supported/control-flow/control-flow.d.ts +0 -17
  122. package/statistics/features/supported/control-flow/control-flow.js +0 -67
  123. package/statistics/features/supported/control-flow/index.d.ts +0 -1
  124. package/statistics/features/supported/control-flow/index.js +0 -6
  125. package/statistics/features/supported/control-flow/post-process.d.ts +0 -3
  126. package/statistics/features/supported/control-flow/post-process.js +0 -65
  127. package/statistics/features/supported/data-access/data-access.d.ts +0 -15
  128. package/statistics/features/supported/data-access/data-access.js +0 -118
  129. package/statistics/features/supported/data-access/index.d.ts +0 -1
  130. package/statistics/features/supported/data-access/index.js +0 -6
  131. package/statistics/features/supported/data-access/post-process.d.ts +0 -3
  132. package/statistics/features/supported/data-access/post-process.js +0 -107
  133. package/statistics/features/supported/defined-functions/defined-functions.d.ts +0 -35
  134. package/statistics/features/supported/defined-functions/defined-functions.js +0 -139
  135. package/statistics/features/supported/defined-functions/index.d.ts +0 -1
  136. package/statistics/features/supported/defined-functions/index.js +0 -6
  137. package/statistics/features/supported/defined-functions/post-process.d.ts +0 -6
  138. package/statistics/features/supported/defined-functions/post-process.js +0 -177
  139. package/statistics/features/supported/expression-list/expression-list.d.ts +0 -9
  140. package/statistics/features/supported/expression-list/expression-list.js +0 -36
  141. package/statistics/features/supported/expression-list/index.d.ts +0 -1
  142. package/statistics/features/supported/expression-list/index.js +0 -6
  143. package/statistics/features/supported/expression-list/post-process.d.ts +0 -3
  144. package/statistics/features/supported/expression-list/post-process.js +0 -44
  145. package/statistics/features/supported/index.d.ts +0 -10
  146. package/statistics/features/supported/index.js +0 -27
  147. package/statistics/features/supported/loops/index.d.ts +0 -1
  148. package/statistics/features/supported/loops/index.js +0 -6
  149. package/statistics/features/supported/loops/loops.d.ts +0 -20
  150. package/statistics/features/supported/loops/loops.js +0 -79
  151. package/statistics/features/supported/loops/post-process.d.ts +0 -3
  152. package/statistics/features/supported/loops/post-process.js +0 -72
  153. package/statistics/features/supported/used-functions/index.d.ts +0 -1
  154. package/statistics/features/supported/used-functions/index.js +0 -6
  155. package/statistics/features/supported/used-functions/post-process.d.ts +0 -6
  156. package/statistics/features/supported/used-functions/post-process.js +0 -179
  157. package/statistics/features/supported/used-functions/used-functions.d.ts +0 -24
  158. package/statistics/features/supported/used-functions/used-functions.js +0 -95
  159. package/statistics/features/supported/used-packages/index.d.ts +0 -1
  160. package/statistics/features/supported/used-packages/index.js +0 -6
  161. package/statistics/features/supported/used-packages/post-process.d.ts +0 -3
  162. package/statistics/features/supported/used-packages/post-process.js +0 -121
  163. package/statistics/features/supported/used-packages/used-packages.d.ts +0 -16
  164. package/statistics/features/supported/used-packages/used-packages.js +0 -130
  165. package/statistics/features/supported/values/index.d.ts +0 -1
  166. package/statistics/features/supported/values/index.js +0 -6
  167. package/statistics/features/supported/values/post-process.d.ts +0 -3
  168. package/statistics/features/supported/values/post-process.js +0 -72
  169. package/statistics/features/supported/values/values.d.ts +0 -14
  170. package/statistics/features/supported/values/values.js +0 -101
  171. package/statistics/features/supported/variables/index.d.ts +0 -1
  172. package/statistics/features/supported/variables/index.js +0 -6
  173. package/statistics/features/supported/variables/post-process.d.ts +0 -9
  174. package/statistics/features/supported/variables/post-process.js +0 -122
  175. package/statistics/features/supported/variables/variables.d.ts +0 -15
  176. package/statistics/features/supported/variables/variables.js +0 -70
  177. package/statistics/index.d.ts +0 -6
  178. package/statistics/index.js +0 -24
  179. package/statistics/meta-statistics.d.ts +0 -33
  180. package/statistics/meta-statistics.js +0 -17
  181. package/statistics/output/file-provider.d.ts +0 -37
  182. package/statistics/output/file-provider.js +0 -97
  183. package/statistics/output/index.d.ts +0 -4
  184. package/statistics/output/index.js +0 -21
  185. package/statistics/output/print-stats.d.ts +0 -17
  186. package/statistics/output/print-stats.js +0 -69
  187. package/statistics/output/statistics-file.d.ts +0 -37
  188. package/statistics/output/statistics-file.js +0 -69
  189. package/statistics/statistics.d.ts +0 -24
  190. package/statistics/statistics.js +0 -108
  191. package/util/summarizer/auto-detect.d.ts +0 -2
  192. package/util/summarizer/auto-detect.js +0 -32
  193. package/util/summarizer/benchmark/data.d.ts +0 -66
  194. package/util/summarizer/benchmark/data.js +0 -13
  195. package/util/summarizer/benchmark/first-phase/input.d.ts +0 -3
  196. package/util/summarizer/benchmark/first-phase/input.js +0 -75
  197. package/util/summarizer/benchmark/first-phase/process.d.ts +0 -11
  198. package/util/summarizer/benchmark/first-phase/process.js +0 -217
  199. package/util/summarizer/benchmark/second-phase/graph.d.ts +0 -2
  200. package/util/summarizer/benchmark/second-phase/graph.js +0 -54
  201. package/util/summarizer/benchmark/second-phase/process.d.ts +0 -6
  202. package/util/summarizer/benchmark/second-phase/process.js +0 -126
  203. package/util/summarizer/benchmark/summarizer.d.ts +0 -31
  204. package/util/summarizer/benchmark/summarizer.js +0 -58
  205. package/util/summarizer/statistics/first-phase/process.d.ts +0 -6
  206. package/util/summarizer/statistics/first-phase/process.js +0 -81
  207. package/util/summarizer/statistics/post-process/clusterer.d.ts +0 -26
  208. package/util/summarizer/statistics/post-process/clusterer.js +0 -43
  209. package/util/summarizer/statistics/post-process/file-based-count.d.ts +0 -17
  210. package/util/summarizer/statistics/post-process/file-based-count.js +0 -49
  211. package/util/summarizer/statistics/post-process/histogram.d.ts +0 -59
  212. package/util/summarizer/statistics/post-process/histogram.js +0 -128
  213. package/util/summarizer/statistics/post-process/index.d.ts +0 -4
  214. package/util/summarizer/statistics/post-process/index.js +0 -21
  215. package/util/summarizer/statistics/post-process/post-process-output.d.ts +0 -16
  216. package/util/summarizer/statistics/post-process/post-process-output.js +0 -103
  217. package/util/summarizer/statistics/second-phase/process.d.ts +0 -11
  218. package/util/summarizer/statistics/second-phase/process.js +0 -117
  219. package/util/summarizer/statistics/summarizer.d.ts +0 -35
  220. package/util/summarizer/statistics/summarizer.js +0 -135
  221. package/util/summarizer/summarizer.js +0 -13
  222. /package/{statistics/output → util}/ansi.d.ts +0 -0
  223. /package/{statistics/output → util}/ansi.js +0 -0
@@ -1,50 +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 comments_1 = require("./comments");
9
- const assert_1 = require("../../../../util/assert");
10
- const fs_1 = __importDefault(require("fs"));
11
- const path_1 = __importDefault(require("path"));
12
- const process_1 = require("../../../../util/summarizer/benchmark/first-phase/process");
13
- // monoids would be helpful :c
14
- function appendCommentsPostProcessing(a, b, numberOfLines, filepath, skipForProjects) {
15
- for (const [key, val] of Object.entries(b)) {
16
- const get = a[key];
17
- (0, assert_1.guard)(get !== undefined, `key ${key} is not present in the comments post processing`);
18
- get.count.push(val);
19
- get.fracOfLines.push(val / numberOfLines);
20
- if (val > 0) {
21
- get.uniqueFiles.add(filepath);
22
- get.uniqueProjects.add(filepath.split(path_1.default.sep)[skipForProjects] ?? '');
23
- }
24
- }
25
- }
26
- const initialCommentsMeta = () => ({ count: [], uniqueProjects: new Set(), uniqueFiles: new Set(), fracOfLines: [] });
27
- function mapComments(data, fn) {
28
- const collected = {};
29
- for (const [key, value] of Object.entries(data)) {
30
- collected[key] = fn(value);
31
- }
32
- return collected;
33
- }
34
- function postProcess(featureRoot, info, outputPath, config) {
35
- // for each we collect the count and the number of files that contain them
36
- const collected = mapComments(comments_1.initialCommentInfo, initialCommentsMeta);
37
- for (const [filepath, feature] of info.entries()) {
38
- appendCommentsPostProcessing(collected, feature.comments, feature.stats.lines[0].length, filepath, config.projectSkip);
39
- }
40
- const fnOutStream = fs_1.default.createWriteStream(path_1.default.join(outputPath, 'comments.csv'));
41
- fnOutStream.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)('count')},${(0, data_1.summarizedMeasurement2CsvHeader)('frac-of-lines')}\n`);
42
- for (const [key, val] of Object.entries(collected)) {
43
- const { count, uniqueProjects, uniqueFiles, fracOfLines } = val;
44
- const counts = (0, process_1.summarizeMeasurement)(count);
45
- const lineFrac = (0, process_1.summarizeMeasurement)(fracOfLines);
46
- fnOutStream.write(`${JSON.stringify(key)},${uniqueProjects.size},${uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)(counts)},${(0, data_1.summarizedMeasurement2Csv)(lineFrac)}\n`);
47
- }
48
- }
49
- exports.postProcess = postProcess;
50
- //# sourceMappingURL=post-process.js.map
@@ -1,17 +0,0 @@
1
- import type { Feature } from '../../feature';
2
- import type { Writable } from 'ts-essentials';
3
- declare const initialControlflowInfo: {
4
- ifThen: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
5
- thenBody: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
6
- ifThenElse: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
7
- elseBody: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
8
- /** can be nested with if-s or if-then-else's */
9
- nestedIfThen: number;
10
- nestedIfThenElse: number;
11
- deepestNesting: number;
12
- /** switch(...) */
13
- switchCase: import("../../common-syntax-probability").CommonSyntaxTypeCounts<bigint>;
14
- };
15
- export type ControlflowInfo = Writable<typeof initialControlflowInfo>;
16
- export declare const controlflow: Feature<ControlflowInfo>;
17
- export {};
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.controlflow = void 0;
4
- const common_syntax_probability_1 = require("../../common-syntax-probability");
5
- const r_bridge_1 = require("../../../../r-bridge");
6
- const post_process_1 = require("./post-process");
7
- const initialControlflowInfo = {
8
- ifThen: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
9
- thenBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
10
- ifThenElse: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
11
- elseBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(),
12
- /** can be nested with if-s or if-then-else's */
13
- nestedIfThen: 0,
14
- nestedIfThenElse: 0,
15
- deepestNesting: 0,
16
- /** switch(...) */
17
- switchCase: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)()
18
- };
19
- function visitIfThenElse(info, input) {
20
- const ifThenElseStack = [];
21
- (0, r_bridge_1.visitAst)(input.normalizedRAst.ast, node => {
22
- if (node.type !== "RIfThenElse" /* RType.IfThenElse */) {
23
- if (node.type === "RFunctionCall" /* RType.FunctionCall */ && node.flavor === 'named' && node.functionName.content === 'switch') {
24
- const initialArg = node.arguments[0];
25
- if (initialArg) {
26
- info.switchCase = (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.switchCase, initialArg);
27
- }
28
- }
29
- return;
30
- }
31
- const ifThenElse = node.otherwise !== undefined;
32
- if (ifThenElseStack.length > 0) {
33
- if (ifThenElse) {
34
- info.nestedIfThenElse++;
35
- }
36
- else {
37
- info.nestedIfThen++;
38
- }
39
- info.deepestNesting = Math.max(info.deepestNesting, ifThenElseStack.length);
40
- }
41
- ifThenElseStack.push(node);
42
- info.thenBody = (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.thenBody, ...node.then.children);
43
- if (ifThenElse) {
44
- info.ifThenElse = (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.ifThenElse, node.condition);
45
- info.elseBody = (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.elseBody, ...node.otherwise.children);
46
- }
47
- else {
48
- info.ifThen = (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(info.ifThen, node.condition);
49
- }
50
- }, node => {
51
- // drop again :D
52
- if (node.type === "RIfThenElse" /* RType.IfThenElse */) {
53
- ifThenElseStack.pop();
54
- }
55
- });
56
- }
57
- exports.controlflow = {
58
- name: 'Controlflow',
59
- description: 'Deals with if-then-else and switch-case',
60
- process(existing, input) {
61
- visitIfThenElse(existing, input);
62
- return existing;
63
- },
64
- initialValue: initialControlflowInfo,
65
- postProcess: post_process_1.postProcess
66
- };
67
- //# sourceMappingURL=control-flow.js.map
@@ -1 +0,0 @@
1
- export { controlflow } from './control-flow';
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.controlflow = void 0;
4
- var control_flow_1 = require("./control-flow");
5
- Object.defineProperty(exports, "controlflow", { enumerable: true, get: function () { return control_flow_1.controlflow; } });
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,65 +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 common_syntax_probability_1 = require("../../common-syntax-probability");
8
- const post_processing_1 = require("../../post-processing");
9
- const data_1 = require("../../../../util/summarizer/benchmark/data");
10
- const process_1 = require("../../../../util/summarizer/benchmark/first-phase/process");
11
- const fs_1 = __importDefault(require("fs"));
12
- const path_1 = __importDefault(require("path"));
13
- function postProcess(featureRoot, info, outputPath, config) {
14
- const collected = {
15
- ifThen: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(() => []),
16
- thenBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(() => []),
17
- ifThenElse: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(() => []),
18
- elseBody: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(() => []),
19
- nestedIfThen: (0, post_processing_1.emptySummarizedWithProject)(),
20
- nestedIfThenElse: (0, post_processing_1.emptySummarizedWithProject)(),
21
- deepestNesting: (0, post_processing_1.emptySummarizedWithProject)(),
22
- switchCase: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(() => [])
23
- };
24
- for (const [filepath, data] of info.entries()) {
25
- const value = data.controlflow;
26
- for (const [key, val] of Object.entries(value)) {
27
- if (typeof val === 'object') {
28
- (0, common_syntax_probability_1.appendCommonSyntaxTypeCounter)(collected[key], val);
29
- }
30
- else {
31
- const get = collected[key];
32
- get.count.push(val);
33
- if (val > 0) {
34
- (0, post_processing_1.recordFilePath)(get, filepath, config);
35
- }
36
- }
37
- }
38
- }
39
- const metaOut = fs_1.default.createWriteStream(path_1.default.join(outputPath, 'control-flow-meta.csv'));
40
- metaOut.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
41
- for (const [key, val] of Object.entries(collected)) {
42
- const data = val;
43
- if ('uniqueProjects' in data) {
44
- metaOut.write(`${JSON.stringify(key)},${data.uniqueProjects.size},${data.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(data.count))}\n`);
45
- }
46
- else {
47
- const out = fs_1.default.createWriteStream(path_1.default.join(outputPath, `control-flow-type-${key}.csv`));
48
- // name is for fields like number etc. to allow to group multiple entries
49
- out.write(`kind,name,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
50
- for (const [name, vals] of Object.entries(data)) {
51
- if (Array.isArray(vals)) {
52
- out.write(`${JSON.stringify(name)},"",${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(vals.flat()))}\n`);
53
- }
54
- else {
55
- for (const [keyName, keyValue] of Object.entries(vals)) {
56
- out.write(`${JSON.stringify(name)},${JSON.stringify(keyName)},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(keyValue.flat()))}\n`);
57
- }
58
- }
59
- }
60
- out.close();
61
- }
62
- }
63
- }
64
- exports.postProcess = postProcess;
65
- //# sourceMappingURL=post-process.js.map
@@ -1,15 +0,0 @@
1
- import type { Feature } from '../../feature';
2
- import type { Writable } from 'ts-essentials';
3
- import type { CommonSyntaxTypeCounts } from '../../common-syntax-probability';
4
- declare const initialDataAccessInfo: {
5
- singleBracket: Record<number, bigint | CommonSyntaxTypeCounts<bigint>>;
6
- doubleBracket: Record<number, bigint | CommonSyntaxTypeCounts<bigint>>;
7
- chainedOrNestedAccess: number;
8
- longestChain: number;
9
- deepestNesting: number;
10
- byName: number;
11
- bySlot: number;
12
- };
13
- export type DataAccessInfo = Writable<typeof initialDataAccessInfo>;
14
- export declare const dataAccess: Feature<DataAccessInfo>;
15
- export {};
@@ -1,118 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dataAccess = void 0;
4
- const r_bridge_1 = require("../../../../r-bridge");
5
- const assert_1 = require("../../../../util/assert");
6
- const output_1 = require("../../../output");
7
- const common_syntax_probability_1 = require("../../common-syntax-probability");
8
- const post_process_1 = require("./post-process");
9
- const initialDataAccessInfo = {
10
- // for the nth argument, how many of them are constant etc.
11
- singleBracket: {
12
- // only counts if empty
13
- 0: 0n,
14
- 1: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)()
15
- },
16
- doubleBracket: {
17
- // similar to single bracket
18
- 0: 0n,
19
- 1: (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)()
20
- },
21
- chainedOrNestedAccess: 0,
22
- longestChain: 0,
23
- deepestNesting: 0,
24
- byName: 0,
25
- bySlot: 0,
26
- };
27
- function classifyArguments(args, existing) {
28
- if (args.length === 0) {
29
- existing[0]++;
30
- return;
31
- }
32
- let i = 1;
33
- for (const arg of args) {
34
- if (arg === null) {
35
- existing[0]++;
36
- continue;
37
- }
38
- existing[i] = (0, common_syntax_probability_1.updateCommonSyntaxTypeCounts)(existing[i] ?? (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(), arg);
39
- i++;
40
- }
41
- }
42
- function visitAccess(info, input) {
43
- const accessNest = [];
44
- const accessChain = [];
45
- const parentRoleCache = new Map();
46
- (0, r_bridge_1.visitAst)(input.normalizedRAst.ast, node => {
47
- if (node.type !== "RAccess" /* RType.Access */) {
48
- return;
49
- }
50
- const roles = (0, r_bridge_1.rolesOfParents)(node, input.normalizedRAst.idMap);
51
- let acc = false;
52
- let idxAcc = false;
53
- for (const role of roles) {
54
- if (role === "accessed" /* RoleInParent.Accessed */) {
55
- acc = true;
56
- break; // we only account for the first one
57
- }
58
- else if (role === "index-access" /* RoleInParent.IndexAccess */) {
59
- idxAcc = true;
60
- break;
61
- }
62
- }
63
- // here we have to check after the addition as we can only check the parental context
64
- if (acc) {
65
- accessChain.push(node);
66
- info.chainedOrNestedAccess++;
67
- info.longestChain = Math.max(info.longestChain, accessChain.length);
68
- }
69
- else if (idxAcc) {
70
- accessNest.push(node);
71
- info.chainedOrNestedAccess++;
72
- info.deepestNesting = Math.max(info.deepestNesting, accessNest.length);
73
- }
74
- parentRoleCache.set(node.info.id, { acc, idxAcc });
75
- if (accessNest.length === 0 && accessChain.length === 0) { // store topmost, after add as it must not be a child to do that
76
- (0, output_1.appendStatisticsFile)(exports.dataAccess.name, 'dataAccess', [node.info.fullLexeme ?? node.lexeme], input.filepath);
77
- }
78
- const op = node.operator;
79
- switch (op) {
80
- case '@':
81
- info.bySlot++;
82
- return;
83
- case '$':
84
- info.byName++;
85
- return;
86
- case '[':
87
- classifyArguments(node.access, info.singleBracket);
88
- break;
89
- case '[[':
90
- classifyArguments(node.access, info.doubleBracket);
91
- break;
92
- default: (0, assert_1.assertUnreachable)(op);
93
- }
94
- (0, assert_1.guard)(Array.isArray(node.access), '[ and [[ must provide access as array');
95
- }, node => {
96
- // drop again :D
97
- if (node.type === "RAccess" /* RType.Access */) {
98
- const ctx = parentRoleCache.get(node.info.id);
99
- if (ctx?.acc) {
100
- accessChain.pop();
101
- }
102
- else if (ctx?.idxAcc) {
103
- accessNest.pop();
104
- }
105
- }
106
- });
107
- }
108
- exports.dataAccess = {
109
- name: 'Data Access',
110
- description: 'Ways of accessing data structures in R',
111
- process(existing, input) {
112
- visitAccess(existing, input);
113
- return existing;
114
- },
115
- initialValue: initialDataAccessInfo,
116
- postProcess: post_process_1.postProcess
117
- };
118
- //# sourceMappingURL=data-access.js.map
@@ -1 +0,0 @@
1
- export { dataAccess } from './data-access';
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dataAccess = void 0;
4
- var data_access_1 = require("./data-access");
5
- Object.defineProperty(exports, "dataAccess", { enumerable: true, get: function () { return data_access_1.dataAccess; } });
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,107 +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 common_syntax_probability_1 = require("../../common-syntax-probability");
9
- const post_processing_1 = require("../../post-processing");
10
- const numbers_1 = require("../../../../util/numbers");
11
- const fs_1 = __importDefault(require("fs"));
12
- const path_1 = __importDefault(require("path"));
13
- const process_1 = require("../../../../util/summarizer/benchmark/first-phase/process");
14
- function addToList(data, dataAccess, filepath, config) {
15
- data.count.push(dataAccess);
16
- if (dataAccess > 0) {
17
- (0, post_processing_1.recordFilePath)(data, filepath, config);
18
- }
19
- }
20
- function summarizeForBracket(dataAccess, data, filepath, config) {
21
- for (const [key, val] of Object.entries(dataAccess)) {
22
- const numericKey = Number(key);
23
- const get = data.get(numericKey) ?? (0, common_syntax_probability_1.emptyCommonSyntaxTypeCounts)(() => []);
24
- if (typeof val === 'bigint' || typeof val === 'string') {
25
- // it is for argument 0
26
- const sumGet = get;
27
- const numericVal = (0, numbers_1.bigint2number)(val);
28
- sumGet.count.push(numericVal);
29
- if (numericVal > 0) {
30
- (0, post_processing_1.recordFilePath)(sumGet, filepath, config);
31
- }
32
- }
33
- else {
34
- (0, common_syntax_probability_1.appendCommonSyntaxTypeCounter)(get, val);
35
- }
36
- data.set(numericKey, get);
37
- }
38
- }
39
- function writeSingleOrDoubleEmpty(outputPath, key, name, vals) {
40
- const out = fs_1.default.createWriteStream(path_1.default.join(outputPath, `data-access-type-${key}-${name}.csv`));
41
- // name is for fields like number etc. to allow to group multiple entries
42
- out.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
43
- out.write(`"0",${vals.uniqueProjects.size},${vals.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(vals.count))}\n`);
44
- out.close();
45
- }
46
- function writeSingleOrDoubleBrackets(data, outputPath, key) {
47
- for (const [name, vals] of data.entries()) {
48
- // the 0 column
49
- if ('uniqueProjects' in vals) {
50
- writeSingleOrDoubleEmpty(outputPath, key, name, vals);
51
- }
52
- else {
53
- // non-0-column
54
- const out = fs_1.default.createWriteStream(path_1.default.join(outputPath, `data-access-type-${key}-${name}.csv`));
55
- // name is for fields like number etc. to allow to group multiple entries
56
- out.write(`kind,name,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
57
- for (const [entryName, values] of Object.entries(vals)) {
58
- if (Array.isArray(values)) {
59
- out.write(`${JSON.stringify(entryName)},"",${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(values.flat()))}\n`);
60
- }
61
- else {
62
- for (const [keyName, keyValue] of Object.entries(values)) {
63
- out.write(`${JSON.stringify(entryName)},${JSON.stringify(keyName)},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(keyValue.flat()))}\n`);
64
- }
65
- }
66
- }
67
- out.close();
68
- }
69
- }
70
- }
71
- function postProcess(featureRoot, info, outputPath, config) {
72
- const summarize = {
73
- singleBracket: new Map(),
74
- doubleBracket: new Map(),
75
- chainedOrNestedAccess: (0, post_processing_1.emptySummarizedWithProject)(),
76
- longestChain: (0, post_processing_1.emptySummarizedWithProject)(),
77
- deepestNesting: (0, post_processing_1.emptySummarizedWithProject)(),
78
- byName: (0, post_processing_1.emptySummarizedWithProject)(),
79
- bySlot: (0, post_processing_1.emptySummarizedWithProject)()
80
- };
81
- // initialize the special 0
82
- summarize.singleBracket.set(0, (0, post_processing_1.emptySummarizedWithProject)());
83
- summarize.doubleBracket.set(0, (0, post_processing_1.emptySummarizedWithProject)());
84
- for (const [filepath, value] of info.entries()) {
85
- const dataAccess = value.dataAccess;
86
- addToList(summarize.chainedOrNestedAccess, dataAccess.chainedOrNestedAccess, filepath, config);
87
- addToList(summarize.longestChain, dataAccess.longestChain, filepath, config);
88
- addToList(summarize.deepestNesting, dataAccess.deepestNesting, filepath, config);
89
- addToList(summarize.byName, dataAccess.byName, filepath, config);
90
- addToList(summarize.bySlot, dataAccess.bySlot, filepath, config);
91
- summarizeForBracket(dataAccess.singleBracket, summarize.singleBracket, filepath, config);
92
- summarizeForBracket(dataAccess.doubleBracket, summarize.doubleBracket, filepath, config);
93
- }
94
- const metaOut = fs_1.default.createWriteStream(path_1.default.join(outputPath, 'data-access-meta.csv'));
95
- metaOut.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
96
- for (const [key, value] of Object.entries(summarize)) {
97
- const data = value;
98
- if ('uniqueProjects' in data) {
99
- metaOut.write(`${JSON.stringify(key)},${data.uniqueProjects.size},${data.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)((0, process_1.summarizeMeasurement)(data.count))}\n`);
100
- continue;
101
- }
102
- writeSingleOrDoubleBrackets(data, outputPath, key);
103
- }
104
- metaOut.close();
105
- }
106
- exports.postProcess = postProcess;
107
- //# sourceMappingURL=post-process.js.map
@@ -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';