@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.
- package/core/print/slice-diff-ansi.js +7 -7
- package/core/steps.d.ts +352 -11
- package/core/steps.js +4 -4
- package/index.d.ts +0 -2
- package/index.js +0 -2
- package/package.json +65 -215
- package/util/{summarizer/summarizer.d.ts → summarizer.d.ts} +15 -1
- package/util/summarizer.js +37 -0
- package/util/version.d.ts +2 -0
- package/util/version.js +10 -0
- package/benchmark/index.d.ts +0 -3
- package/benchmark/index.js +0 -20
- package/benchmark/slicer.d.ts +0 -98
- package/benchmark/slicer.js +0 -213
- package/benchmark/stats/index.d.ts +0 -10
- package/benchmark/stats/index.js +0 -27
- package/benchmark/stats/print.d.ts +0 -7
- package/benchmark/stats/print.js +0 -155
- package/benchmark/stats/stats.d.ts +0 -40
- package/benchmark/stats/stats.js +0 -6
- package/benchmark/stopwatch.d.ts +0 -35
- package/benchmark/stopwatch.js +0 -79
- package/cli/benchmark-app.d.ts +0 -10
- package/cli/benchmark-app.js +0 -67
- package/cli/benchmark-helper-app.d.ts +0 -9
- package/cli/benchmark-helper-app.js +0 -69
- package/cli/common/features.d.ts +0 -3
- package/cli/common/features.js +0 -30
- package/cli/common/index.d.ts +0 -2
- package/cli/common/index.js +0 -19
- package/cli/common/options.d.ts +0 -20
- package/cli/common/options.js +0 -85
- package/cli/common/script.d.ts +0 -21
- package/cli/common/script.js +0 -61
- package/cli/common/scripts-info.d.ts +0 -25
- package/cli/common/scripts-info.js +0 -83
- package/cli/export-quads-app.d.ts +0 -7
- package/cli/export-quads-app.js +0 -42
- package/cli/repl/commands/cfg.d.ts +0 -3
- package/cli/repl/commands/cfg.js +0 -37
- package/cli/repl/commands/commands.d.ts +0 -13
- package/cli/repl/commands/commands.js +0 -142
- package/cli/repl/commands/dataflow.d.ts +0 -3
- package/cli/repl/commands/dataflow.js +0 -34
- package/cli/repl/commands/execute.d.ts +0 -4
- package/cli/repl/commands/execute.js +0 -27
- package/cli/repl/commands/index.d.ts +0 -2
- package/cli/repl/commands/index.js +0 -19
- package/cli/repl/commands/main.d.ts +0 -39
- package/cli/repl/commands/main.js +0 -14
- package/cli/repl/commands/normalize.d.ts +0 -3
- package/cli/repl/commands/normalize.js +0 -34
- package/cli/repl/commands/parse.d.ts +0 -2
- package/cli/repl/commands/parse.js +0 -109
- package/cli/repl/commands/quit.d.ts +0 -2
- package/cli/repl/commands/quit.js +0 -15
- package/cli/repl/commands/version.d.ts +0 -16
- package/cli/repl/commands/version.js +0 -33
- package/cli/repl/core.d.ts +0 -41
- package/cli/repl/core.js +0 -172
- package/cli/repl/execute.d.ts +0 -28
- package/cli/repl/execute.js +0 -79
- package/cli/repl/index.d.ts +0 -5
- package/cli/repl/index.js +0 -22
- package/cli/repl/prompt.d.ts +0 -2
- package/cli/repl/prompt.js +0 -9
- package/cli/repl/server/connection.d.ts +0 -21
- package/cli/repl/server/connection.js +0 -213
- package/cli/repl/server/messages/analysis.d.ts +0 -71
- package/cli/repl/server/messages/analysis.js +0 -21
- package/cli/repl/server/messages/error.d.ts +0 -11
- package/cli/repl/server/messages/error.js +0 -3
- package/cli/repl/server/messages/hello.d.ts +0 -20
- package/cli/repl/server/messages/hello.js +0 -3
- package/cli/repl/server/messages/index.d.ts +0 -1
- package/cli/repl/server/messages/index.js +0 -3
- package/cli/repl/server/messages/messages.d.ts +0 -35
- package/cli/repl/server/messages/messages.js +0 -40
- package/cli/repl/server/messages/repl.d.ts +0 -33
- package/cli/repl/server/messages/repl.js +0 -37
- package/cli/repl/server/messages/slice.d.ts +0 -25
- package/cli/repl/server/messages/slice.js +0 -37
- package/cli/repl/server/net.d.ts +0 -49
- package/cli/repl/server/net.js +0 -63
- package/cli/repl/server/send.d.ts +0 -4
- package/cli/repl/server/send.js +0 -18
- package/cli/repl/server/server.d.ts +0 -20
- package/cli/repl/server/server.js +0 -66
- package/cli/repl/server/validate.d.ts +0 -15
- package/cli/repl/server/validate.js +0 -34
- package/cli/slicer-app.d.ts +0 -11
- package/cli/slicer-app.js +0 -81
- package/cli/statistics-app.d.ts +0 -11
- package/cli/statistics-app.js +0 -98
- package/cli/statistics-helper-app.d.ts +0 -11
- package/cli/statistics-helper-app.js +0 -82
- package/cli/summarizer-app.d.ts +0 -18
- package/cli/summarizer-app.js +0 -66
- package/flowr.d.ts +0 -29
- package/flowr.js +0 -142
- package/statistics/features/common-syntax-probability.d.ts +0 -31
- package/statistics/features/common-syntax-probability.js +0 -156
- package/statistics/features/feature.d.ts +0 -175
- package/statistics/features/feature.js +0 -30
- package/statistics/features/index.d.ts +0 -1
- package/statistics/features/index.js +0 -18
- package/statistics/features/post-processing.d.ts +0 -12
- package/statistics/features/post-processing.js +0 -21
- package/statistics/features/supported/assignments/assignments.d.ts +0 -11
- package/statistics/features/supported/assignments/assignments.js +0 -53
- package/statistics/features/supported/assignments/index.d.ts +0 -1
- package/statistics/features/supported/assignments/index.js +0 -6
- package/statistics/features/supported/assignments/post-process.d.ts +0 -3
- package/statistics/features/supported/assignments/post-process.js +0 -125
- package/statistics/features/supported/comments/comments.d.ts +0 -18
- package/statistics/features/supported/comments/comments.js +0 -133
- package/statistics/features/supported/comments/index.d.ts +0 -1
- package/statistics/features/supported/comments/index.js +0 -6
- package/statistics/features/supported/comments/post-process.d.ts +0 -3
- package/statistics/features/supported/comments/post-process.js +0 -50
- package/statistics/features/supported/control-flow/control-flow.d.ts +0 -17
- package/statistics/features/supported/control-flow/control-flow.js +0 -67
- package/statistics/features/supported/control-flow/index.d.ts +0 -1
- package/statistics/features/supported/control-flow/index.js +0 -6
- package/statistics/features/supported/control-flow/post-process.d.ts +0 -3
- package/statistics/features/supported/control-flow/post-process.js +0 -65
- package/statistics/features/supported/data-access/data-access.d.ts +0 -15
- package/statistics/features/supported/data-access/data-access.js +0 -118
- package/statistics/features/supported/data-access/index.d.ts +0 -1
- package/statistics/features/supported/data-access/index.js +0 -6
- package/statistics/features/supported/data-access/post-process.d.ts +0 -3
- package/statistics/features/supported/data-access/post-process.js +0 -107
- package/statistics/features/supported/defined-functions/defined-functions.d.ts +0 -35
- package/statistics/features/supported/defined-functions/defined-functions.js +0 -139
- package/statistics/features/supported/defined-functions/index.d.ts +0 -1
- package/statistics/features/supported/defined-functions/index.js +0 -6
- package/statistics/features/supported/defined-functions/post-process.d.ts +0 -6
- package/statistics/features/supported/defined-functions/post-process.js +0 -177
- package/statistics/features/supported/expression-list/expression-list.d.ts +0 -9
- package/statistics/features/supported/expression-list/expression-list.js +0 -36
- package/statistics/features/supported/expression-list/index.d.ts +0 -1
- package/statistics/features/supported/expression-list/index.js +0 -6
- package/statistics/features/supported/expression-list/post-process.d.ts +0 -3
- package/statistics/features/supported/expression-list/post-process.js +0 -44
- package/statistics/features/supported/index.d.ts +0 -10
- package/statistics/features/supported/index.js +0 -27
- package/statistics/features/supported/loops/index.d.ts +0 -1
- package/statistics/features/supported/loops/index.js +0 -6
- package/statistics/features/supported/loops/loops.d.ts +0 -20
- package/statistics/features/supported/loops/loops.js +0 -79
- package/statistics/features/supported/loops/post-process.d.ts +0 -3
- package/statistics/features/supported/loops/post-process.js +0 -72
- package/statistics/features/supported/used-functions/index.d.ts +0 -1
- package/statistics/features/supported/used-functions/index.js +0 -6
- package/statistics/features/supported/used-functions/post-process.d.ts +0 -6
- package/statistics/features/supported/used-functions/post-process.js +0 -179
- package/statistics/features/supported/used-functions/used-functions.d.ts +0 -24
- package/statistics/features/supported/used-functions/used-functions.js +0 -95
- package/statistics/features/supported/used-packages/index.d.ts +0 -1
- package/statistics/features/supported/used-packages/index.js +0 -6
- package/statistics/features/supported/used-packages/post-process.d.ts +0 -3
- package/statistics/features/supported/used-packages/post-process.js +0 -121
- package/statistics/features/supported/used-packages/used-packages.d.ts +0 -16
- package/statistics/features/supported/used-packages/used-packages.js +0 -130
- package/statistics/features/supported/values/index.d.ts +0 -1
- package/statistics/features/supported/values/index.js +0 -6
- package/statistics/features/supported/values/post-process.d.ts +0 -3
- package/statistics/features/supported/values/post-process.js +0 -72
- package/statistics/features/supported/values/values.d.ts +0 -14
- package/statistics/features/supported/values/values.js +0 -101
- package/statistics/features/supported/variables/index.d.ts +0 -1
- package/statistics/features/supported/variables/index.js +0 -6
- package/statistics/features/supported/variables/post-process.d.ts +0 -9
- package/statistics/features/supported/variables/post-process.js +0 -122
- package/statistics/features/supported/variables/variables.d.ts +0 -15
- package/statistics/features/supported/variables/variables.js +0 -70
- package/statistics/index.d.ts +0 -6
- package/statistics/index.js +0 -24
- package/statistics/meta-statistics.d.ts +0 -33
- package/statistics/meta-statistics.js +0 -17
- package/statistics/output/file-provider.d.ts +0 -37
- package/statistics/output/file-provider.js +0 -97
- package/statistics/output/index.d.ts +0 -4
- package/statistics/output/index.js +0 -21
- package/statistics/output/print-stats.d.ts +0 -17
- package/statistics/output/print-stats.js +0 -69
- package/statistics/output/statistics-file.d.ts +0 -37
- package/statistics/output/statistics-file.js +0 -69
- package/statistics/statistics.d.ts +0 -24
- package/statistics/statistics.js +0 -108
- package/util/summarizer/auto-detect.d.ts +0 -2
- package/util/summarizer/auto-detect.js +0 -32
- package/util/summarizer/benchmark/data.d.ts +0 -66
- package/util/summarizer/benchmark/data.js +0 -13
- package/util/summarizer/benchmark/first-phase/input.d.ts +0 -3
- package/util/summarizer/benchmark/first-phase/input.js +0 -75
- package/util/summarizer/benchmark/first-phase/process.d.ts +0 -11
- package/util/summarizer/benchmark/first-phase/process.js +0 -217
- package/util/summarizer/benchmark/second-phase/graph.d.ts +0 -2
- package/util/summarizer/benchmark/second-phase/graph.js +0 -54
- package/util/summarizer/benchmark/second-phase/process.d.ts +0 -6
- package/util/summarizer/benchmark/second-phase/process.js +0 -126
- package/util/summarizer/benchmark/summarizer.d.ts +0 -31
- package/util/summarizer/benchmark/summarizer.js +0 -58
- package/util/summarizer/statistics/first-phase/process.d.ts +0 -6
- package/util/summarizer/statistics/first-phase/process.js +0 -81
- package/util/summarizer/statistics/post-process/clusterer.d.ts +0 -26
- package/util/summarizer/statistics/post-process/clusterer.js +0 -43
- package/util/summarizer/statistics/post-process/file-based-count.d.ts +0 -17
- package/util/summarizer/statistics/post-process/file-based-count.js +0 -49
- package/util/summarizer/statistics/post-process/histogram.d.ts +0 -59
- package/util/summarizer/statistics/post-process/histogram.js +0 -128
- package/util/summarizer/statistics/post-process/index.d.ts +0 -4
- package/util/summarizer/statistics/post-process/index.js +0 -21
- package/util/summarizer/statistics/post-process/post-process-output.d.ts +0 -16
- package/util/summarizer/statistics/post-process/post-process-output.js +0 -103
- package/util/summarizer/statistics/second-phase/process.d.ts +0 -11
- package/util/summarizer/statistics/second-phase/process.js +0 -117
- package/util/summarizer/statistics/summarizer.d.ts +0 -35
- package/util/summarizer/statistics/summarizer.js +0 -135
- package/util/summarizer/summarizer.js +0 -13
- /package/{statistics/output → util}/ansi.d.ts +0 -0
- /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';
|