@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,72 +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 fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const process_1 = require("../../../../util/summarizer/benchmark/first-phase/process");
|
|
11
|
-
const files_1 = require("../../../../util/files");
|
|
12
|
-
const time_1 = require("../../../../util/time");
|
|
13
|
-
const arrays_1 = require("../../../../util/arrays");
|
|
14
|
-
const post_processing_1 = require("../../post-processing");
|
|
15
|
-
function postProcess(featureRoot, info, outputPath, config) {
|
|
16
|
-
const collected = {};
|
|
17
|
-
for (const [filepath, data] of info.entries()) {
|
|
18
|
-
const value = data.values;
|
|
19
|
-
for (const [key, val] of Object.entries(value)) {
|
|
20
|
-
let get = collected[key];
|
|
21
|
-
if (!get) {
|
|
22
|
-
get = (0, post_processing_1.emptySummarizedWithProject)();
|
|
23
|
-
collected[key] = get;
|
|
24
|
-
}
|
|
25
|
-
get.count.push(val);
|
|
26
|
-
if (val > 0) {
|
|
27
|
-
(0, post_processing_1.recordFilePath)(get, filepath, config);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
const valuesOutStream = fs_1.default.createWriteStream(path_1.default.join(outputPath, 'values.csv'));
|
|
32
|
-
valuesOutStream.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
|
|
33
|
-
for (const [key, val] of Object.entries(collected)) {
|
|
34
|
-
const data = val;
|
|
35
|
-
const sum = (0, process_1.summarizeMeasurement)(data.count);
|
|
36
|
-
valuesOutStream.write(`${JSON.stringify(key)},${data.uniqueProjects.size},${data.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)(sum)}\n`);
|
|
37
|
-
}
|
|
38
|
-
valuesOutStream.close();
|
|
39
|
-
// now we read all numeric values to get the top used magic numbers (per file)
|
|
40
|
-
const valueMap = new Map();
|
|
41
|
-
(0, files_1.readLineByLineSync)(path_1.default.join(featureRoot, 'numeric.txt'), (line, lineNumber) => {
|
|
42
|
-
if (line.length === 0) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (lineNumber % 2_500 === 0) {
|
|
46
|
-
console.log(` [${(0, time_1.date2string)(new Date())}] Collecting numeric values ${lineNumber}`);
|
|
47
|
-
}
|
|
48
|
-
const [values, context] = JSON.parse(String(line));
|
|
49
|
-
const bag = (0, arrays_1.array2bag)(values);
|
|
50
|
-
for (const [key, val] of bag.entries()) {
|
|
51
|
-
let get = valueMap.get(key);
|
|
52
|
-
if (!get) {
|
|
53
|
-
get = { count: [], uniqueFiles: new Set(), uniqueProjects: new Set() };
|
|
54
|
-
valueMap.set(key, get);
|
|
55
|
-
}
|
|
56
|
-
get.count.push(val);
|
|
57
|
-
if (val > 0) {
|
|
58
|
-
get.uniqueFiles.add(context ?? '');
|
|
59
|
-
get.uniqueProjects.add(context?.split(path_1.default.sep)[config.projectSkip] ?? '');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
const magicNumbersOutStream = fs_1.default.createWriteStream(path_1.default.join(outputPath, 'magic-numbers.csv'));
|
|
64
|
-
magicNumbersOutStream.write(`num,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
|
|
65
|
-
for (const [key, val] of valueMap.entries()) {
|
|
66
|
-
const sum = (0, process_1.summarizeMeasurement)(val.count);
|
|
67
|
-
magicNumbersOutStream.write(`${JSON.stringify(key)},${val.uniqueProjects.size},${val.uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)(sum)}\n`);
|
|
68
|
-
}
|
|
69
|
-
magicNumbersOutStream.close();
|
|
70
|
-
}
|
|
71
|
-
exports.postProcess = postProcess;
|
|
72
|
-
//# sourceMappingURL=post-process.js.map
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Feature } from '../../feature';
|
|
2
|
-
import type { Writable } from 'ts-essentials';
|
|
3
|
-
declare const initialValueInfo: {
|
|
4
|
-
allNumerics: number;
|
|
5
|
-
imaginaryNumbers: number;
|
|
6
|
-
integers: number;
|
|
7
|
-
floatHex: number;
|
|
8
|
-
logical: number;
|
|
9
|
-
specialConstants: number;
|
|
10
|
-
strings: number;
|
|
11
|
-
};
|
|
12
|
-
export type ValueInfo = Writable<typeof initialValueInfo>;
|
|
13
|
-
export declare const values: Feature<ValueInfo>;
|
|
14
|
-
export {};
|
|
@@ -1,101 +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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.values = void 0;
|
|
27
|
-
const xpath = __importStar(require("xpath-ts2"));
|
|
28
|
-
const r_bridge_1 = require("../../../../r-bridge");
|
|
29
|
-
const assert_1 = require("../../../../util/assert");
|
|
30
|
-
const output_1 = require("../../../output");
|
|
31
|
-
const post_process_1 = require("./post-process");
|
|
32
|
-
const initialValueInfo = {
|
|
33
|
-
allNumerics: 0,
|
|
34
|
-
imaginaryNumbers: 0,
|
|
35
|
-
integers: 0,
|
|
36
|
-
floatHex: 0,
|
|
37
|
-
logical: 0,
|
|
38
|
-
specialConstants: 0,
|
|
39
|
-
strings: 0
|
|
40
|
-
};
|
|
41
|
-
const numericConstantQuery = xpath.parse('//NUM_CONST');
|
|
42
|
-
const stringConstantQuery = xpath.parse('//STR_CONST');
|
|
43
|
-
const specialConstantsQuery = xpath.parse('//NULL_CONST');
|
|
44
|
-
const shortLogicalSymbolQuery = xpath.parse('//SYMBOL[text() = \'T\' or text() = \'F\']');
|
|
45
|
-
function classifyNumericConstants(numeric, existing) {
|
|
46
|
-
if (numeric === r_bridge_1.RTrue || numeric === r_bridge_1.RFalse) {
|
|
47
|
-
return 'logical';
|
|
48
|
-
}
|
|
49
|
-
if (numeric === r_bridge_1.RNa || numeric === 'NaN' || numeric === r_bridge_1.RNull || numeric === 'Inf' || numeric === '-Inf') {
|
|
50
|
-
return 'special-constants';
|
|
51
|
-
}
|
|
52
|
-
if (numeric.includes('i')) {
|
|
53
|
-
existing.imaginaryNumbers++;
|
|
54
|
-
}
|
|
55
|
-
else if (numeric.endsWith('L')) {
|
|
56
|
-
existing.integers++;
|
|
57
|
-
}
|
|
58
|
-
else if (r_bridge_1.RNumHexFloatRegex.test(numeric)) {
|
|
59
|
-
existing.floatHex++;
|
|
60
|
-
}
|
|
61
|
-
return 'allNumerics';
|
|
62
|
-
}
|
|
63
|
-
exports.values = {
|
|
64
|
-
name: 'Values',
|
|
65
|
-
description: 'All values used (as constants etc.)',
|
|
66
|
-
process(existing, input) {
|
|
67
|
-
const strings = stringConstantQuery.select({ node: input.parsedRAst });
|
|
68
|
-
const numerics = numericConstantQuery.select({ node: input.parsedRAst });
|
|
69
|
-
const specialConstants = specialConstantsQuery.select({ node: input.parsedRAst });
|
|
70
|
-
const specialLogicalSymbols = shortLogicalSymbolQuery.select({ node: input.parsedRAst });
|
|
71
|
-
const numbers = [];
|
|
72
|
-
numerics.map(n => [n, classifyNumericConstants(n.textContent ?? '<unknown>', existing)])
|
|
73
|
-
.forEach(([n, type]) => {
|
|
74
|
-
switch (type) {
|
|
75
|
-
case 'allNumerics':
|
|
76
|
-
numbers.push(n);
|
|
77
|
-
break;
|
|
78
|
-
case 'logical':
|
|
79
|
-
specialLogicalSymbols.push(n);
|
|
80
|
-
break;
|
|
81
|
-
case 'special-constants':
|
|
82
|
-
specialConstants.push(n);
|
|
83
|
-
break;
|
|
84
|
-
default:
|
|
85
|
-
(0, assert_1.assertUnreachable)(type);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
existing.strings += strings.length;
|
|
89
|
-
existing.allNumerics += numerics.length;
|
|
90
|
-
existing.specialConstants += specialConstants.length;
|
|
91
|
-
existing.logical += specialLogicalSymbols.length;
|
|
92
|
-
(0, output_1.appendStatisticsFile)(this.name, 'numeric', numbers, input.filepath);
|
|
93
|
-
(0, output_1.appendStatisticsFile)(this.name, 'string', strings, input.filepath);
|
|
94
|
-
(0, output_1.appendStatisticsFile)(this.name, 'specialConstant', specialConstants, input.filepath);
|
|
95
|
-
(0, output_1.appendStatisticsFile)(this.name, 'logical', specialLogicalSymbols, input.filepath);
|
|
96
|
-
return existing;
|
|
97
|
-
},
|
|
98
|
-
initialValue: initialValueInfo,
|
|
99
|
-
postProcess: post_process_1.postProcess
|
|
100
|
-
};
|
|
101
|
-
//# sourceMappingURL=values.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { variables } from './variables';
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.variables = void 0;
|
|
4
|
-
var variables_1 = require("./variables");
|
|
5
|
-
Object.defineProperty(exports, "variables", { enumerable: true, get: function () { return variables_1.variables; } });
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { FeatureStatisticsWithMeta } from '../../feature';
|
|
2
|
-
import type { StatisticsSummarizerConfiguration } from '../../../../util/summarizer/statistics/summarizer';
|
|
3
|
-
import type { SummarizedWithProject } from '../../post-processing';
|
|
4
|
-
export declare function postProcess(featureRoot: string, info: Map<string, FeatureStatisticsWithMeta>, outputPath: string, config: StatisticsSummarizerConfiguration): void;
|
|
5
|
-
type VariableInfoMap = Map<string, SummarizedWithProject & {
|
|
6
|
-
linePercentageInFile: number[][];
|
|
7
|
-
}>;
|
|
8
|
-
export declare function writeVariableInfoToCsv(outputPath: string, filename: `${string}.csv`, data: VariableInfoMap): void;
|
|
9
|
-
export {};
|
|
@@ -1,122 +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.writeVariableInfoToCsv = exports.postProcess = void 0;
|
|
7
|
-
const post_processing_1 = require("../../post-processing");
|
|
8
|
-
const fs_1 = __importDefault(require("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
|
-
const files_1 = require("../../../../util/files");
|
|
13
|
-
function collectUsedVariables(featureRoot, info, config, outputPath) {
|
|
14
|
-
const used = collectVariableInfoFor(path_1.default.join(featureRoot, 'usedVariables.txt'), info, config);
|
|
15
|
-
writeVariableInfoToCsv(outputPath, 'used-variables.csv', used);
|
|
16
|
-
// we manually clear these maps to save memory
|
|
17
|
-
used.clear();
|
|
18
|
-
}
|
|
19
|
-
function collectDefinedVariables(featureRoot, info, config, outputPath) {
|
|
20
|
-
const defined = collectVariableInfoFor(path_1.default.join(featureRoot, 'definedVariables.txt'), info, config);
|
|
21
|
-
writeVariableInfoToCsv(outputPath, 'defined-variables.csv', defined);
|
|
22
|
-
defined.clear();
|
|
23
|
-
}
|
|
24
|
-
function collectRedefinedVariables(featureRoot, info, config, outputPath) {
|
|
25
|
-
const redefined = collectVariableInfoFor(path_1.default.join(featureRoot, 'redefinedVariables.txt'), info, config);
|
|
26
|
-
writeVariableInfoToCsv(outputPath, 'redefined-variables.csv', redefined);
|
|
27
|
-
redefined.clear();
|
|
28
|
-
}
|
|
29
|
-
function writeVariableCountsToCsv(outputPath, collected) {
|
|
30
|
-
const variablesOutStream = fs_1.default.createWriteStream(path_1.default.join(outputPath, 'variable-counts.csv'));
|
|
31
|
-
variablesOutStream.write(`kind,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)()}\n`);
|
|
32
|
-
for (const [key, val] of Object.entries(collected)) {
|
|
33
|
-
if (key === 'unknownVariables') {
|
|
34
|
-
// they are for function calls etc and in hindsight not a good idea
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
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
|
-
function collectInformation(info, config) {
|
|
44
|
-
const collected = {};
|
|
45
|
-
for (const [filepath, data] of info.entries()) {
|
|
46
|
-
const value = data.variables;
|
|
47
|
-
for (const [key, val] of Object.entries(value)) {
|
|
48
|
-
let get = collected[key];
|
|
49
|
-
if (!get) {
|
|
50
|
-
get = (0, post_processing_1.emptySummarizedWithProject)();
|
|
51
|
-
collected[key] = get;
|
|
52
|
-
}
|
|
53
|
-
get.count.push(val);
|
|
54
|
-
if (val > 0) {
|
|
55
|
-
(0, post_processing_1.recordFilePath)(get, filepath, config);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return collected;
|
|
60
|
-
}
|
|
61
|
-
function postProcess(featureRoot, info, outputPath, config) {
|
|
62
|
-
const collected = collectInformation(info, config);
|
|
63
|
-
writeVariableCountsToCsv(outputPath, collected);
|
|
64
|
-
collectUsedVariables(featureRoot, info, config, outputPath);
|
|
65
|
-
collectDefinedVariables(featureRoot, info, config, outputPath);
|
|
66
|
-
collectRedefinedVariables(featureRoot, info, config, outputPath);
|
|
67
|
-
}
|
|
68
|
-
exports.postProcess = postProcess;
|
|
69
|
-
function writeVariableInfoToCsv(outputPath, filename, data) {
|
|
70
|
-
const out = fs_1.default.createWriteStream(path_1.default.join(outputPath, filename));
|
|
71
|
-
out.write(`variable,unique-projects,unique-files,${(0, data_1.summarizedMeasurement2CsvHeader)('count')},${(0, data_1.summarizedMeasurement2CsvHeader)('line-frac')}\n`);
|
|
72
|
-
for (const [key, val] of data.entries()) {
|
|
73
|
-
const { count, uniqueProjects, uniqueFiles, linePercentageInFile } = val;
|
|
74
|
-
const counts = (0, process_1.summarizeMeasurement)(count);
|
|
75
|
-
const lineFrac = (0, process_1.summarizeMeasurement)(linePercentageInFile.flat());
|
|
76
|
-
out.write(`${JSON.stringify(key)},${uniqueProjects.size},${uniqueFiles.size},${(0, data_1.summarizedMeasurement2Csv)(counts)},${(0, data_1.summarizedMeasurement2Csv)(lineFrac)}\n`);
|
|
77
|
-
}
|
|
78
|
-
out.close();
|
|
79
|
-
}
|
|
80
|
-
exports.writeVariableInfoToCsv = writeVariableInfoToCsv;
|
|
81
|
-
function collectVariableInfoFor(filepath, info, config) {
|
|
82
|
-
// variable name to summary
|
|
83
|
-
const collected = new Map();
|
|
84
|
-
(0, files_1.readLineByLineSync)(filepath, (line, lineNumber) => {
|
|
85
|
-
if (line.length === 0) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
if (lineNumber % 2_500 === 0) {
|
|
89
|
-
console.log(` Processed ${lineNumber} lines of ${filepath}`);
|
|
90
|
-
}
|
|
91
|
-
const [vars, context] = JSON.parse(line.toString());
|
|
92
|
-
const numberOfLines = info.get(context ?? '')?.stats.lines[0].length;
|
|
93
|
-
// first we have to collect what this file gives us
|
|
94
|
-
const perFile = new Map();
|
|
95
|
-
for (const [name, [line]] of vars) {
|
|
96
|
-
let get = perFile.get(name);
|
|
97
|
-
if (!get) {
|
|
98
|
-
get = { ...(0, post_processing_1.emptySummarizedWithProject)(), linePercentageInFile: [] };
|
|
99
|
-
perFile.set(name, get);
|
|
100
|
-
}
|
|
101
|
-
get.count.push(1);
|
|
102
|
-
if (numberOfLines) {
|
|
103
|
-
get.linePercentageInFile.push(line / numberOfLines);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
// now we merge it into the global map (oh gosh this is so horrible
|
|
107
|
-
for (const [name, data] of perFile.entries()) {
|
|
108
|
-
let get = collected.get(name);
|
|
109
|
-
if (!get) {
|
|
110
|
-
get = { ...(0, post_processing_1.emptySummarizedWithProject)(), linePercentageInFile: [] };
|
|
111
|
-
collected.set(name, get);
|
|
112
|
-
}
|
|
113
|
-
get.count.push(data.count.length);
|
|
114
|
-
get.linePercentageInFile.push(data.linePercentageInFile);
|
|
115
|
-
if (data.count.length > 0) {
|
|
116
|
-
(0, post_processing_1.recordFilePath)(get, context, config);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
return collected;
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=post-process.js.map
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Feature } from '../../feature';
|
|
2
|
-
import type { Writable } from 'ts-essentials';
|
|
3
|
-
declare const initialVariableInfo: {
|
|
4
|
-
numberOfVariableUses: number;
|
|
5
|
-
numberOfDefinitions: number;
|
|
6
|
-
numberOfRedefinitions: number;
|
|
7
|
-
unknownVariables: number;
|
|
8
|
-
};
|
|
9
|
-
export type VariableInfo = Writable<typeof initialVariableInfo>;
|
|
10
|
-
export type DefinedVariableInformation = [
|
|
11
|
-
name: string,
|
|
12
|
-
location: [line: number, character: number]
|
|
13
|
-
];
|
|
14
|
-
export declare const variables: Feature<VariableInfo>;
|
|
15
|
-
export {};
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.variables = void 0;
|
|
4
|
-
const r_bridge_1 = require("../../../../r-bridge");
|
|
5
|
-
const output_1 = require("../../../output");
|
|
6
|
-
const dataflow_1 = require("../../../../dataflow");
|
|
7
|
-
const post_process_1 = require("./post-process");
|
|
8
|
-
const initialVariableInfo = {
|
|
9
|
-
numberOfVariableUses: 0,
|
|
10
|
-
numberOfDefinitions: 0,
|
|
11
|
-
numberOfRedefinitions: 0,
|
|
12
|
-
// we failed to get the type/role, maybe for function call names etc.
|
|
13
|
-
unknownVariables: 0
|
|
14
|
-
};
|
|
15
|
-
function visitVariables(info, input) {
|
|
16
|
-
// same-def-def edges are bidirectional, we want to avoid counting them twice!
|
|
17
|
-
const redefinedBlocker = new Set();
|
|
18
|
-
(0, r_bridge_1.visitAst)(input.normalizedRAst.ast, node => {
|
|
19
|
-
if (node.type !== "RSymbol" /* RType.Symbol */ || (0, r_bridge_1.isSpecialSymbol)(node)) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
// search for the node in the DF graph
|
|
23
|
-
const mayNode = input.dataflow.graph.get(node.info.id);
|
|
24
|
-
if (mayNode === undefined) {
|
|
25
|
-
info.unknownVariables++;
|
|
26
|
-
(0, output_1.appendStatisticsFile)(exports.variables.name, 'unknown', [[
|
|
27
|
-
node.info.fullLexeme ?? node.lexeme,
|
|
28
|
-
[node.location.start.line, node.location.start.column]
|
|
29
|
-
]], input.filepath);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const [dfNode, edges] = mayNode;
|
|
33
|
-
if (dfNode.tag === 'variable-definition') {
|
|
34
|
-
info.numberOfDefinitions++;
|
|
35
|
-
const lexeme = node.info.fullLexeme ?? node.lexeme;
|
|
36
|
-
(0, output_1.appendStatisticsFile)(exports.variables.name, 'definedVariables', [[
|
|
37
|
-
lexeme,
|
|
38
|
-
[node.location.start.line, node.location.start.column]
|
|
39
|
-
]], input.filepath);
|
|
40
|
-
// check for redefinitions
|
|
41
|
-
const hasRedefinitions = [...edges.entries()].some(([target, edge]) => !redefinedBlocker.has(target) && edge.types.has(dataflow_1.EdgeType.SameDefDef));
|
|
42
|
-
if (hasRedefinitions) {
|
|
43
|
-
info.numberOfRedefinitions++;
|
|
44
|
-
redefinedBlocker.add(node.info.id);
|
|
45
|
-
(0, output_1.appendStatisticsFile)(exports.variables.name, 'redefinedVariables', [[
|
|
46
|
-
lexeme,
|
|
47
|
-
[node.location.start.line, node.location.start.column]
|
|
48
|
-
]], input.filepath);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
else if (dfNode.tag === 'use') {
|
|
52
|
-
info.numberOfVariableUses++;
|
|
53
|
-
(0, output_1.appendStatisticsFile)(exports.variables.name, 'usedVariables', [[
|
|
54
|
-
node.info.fullLexeme ?? node.lexeme,
|
|
55
|
-
[node.location.start.line, node.location.start.column]
|
|
56
|
-
]], input.filepath);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
exports.variables = {
|
|
61
|
-
name: 'Variables',
|
|
62
|
-
description: 'Variable Usage, Assignments, and Redefinitions',
|
|
63
|
-
process(existing, input) {
|
|
64
|
-
visitVariables(existing, input);
|
|
65
|
-
return existing;
|
|
66
|
-
},
|
|
67
|
-
initialValue: initialVariableInfo,
|
|
68
|
-
postProcess: post_process_1.postProcess
|
|
69
|
-
};
|
|
70
|
-
//# sourceMappingURL=variables.js.map
|
package/statistics/index.d.ts
DELETED
package/statistics/index.js
DELETED
|
@@ -1,24 +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
|
-
exports.initialMetaStatistics = void 0;
|
|
18
|
-
__exportStar(require("./statistics"), exports);
|
|
19
|
-
__exportStar(require("./features"), exports);
|
|
20
|
-
__exportStar(require("./output"), exports);
|
|
21
|
-
__exportStar(require("../util/summarizer/statistics/post-process"), exports);
|
|
22
|
-
var meta_statistics_1 = require("./meta-statistics");
|
|
23
|
-
Object.defineProperty(exports, "initialMetaStatistics", { enumerable: true, get: function () { return meta_statistics_1.initialMetaStatistics; } });
|
|
24
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { RParseRequestFromFile, RParseRequestFromText } from '../r-bridge';
|
|
2
|
-
/**
|
|
3
|
-
* Statistics on skipped files, the time required, and more.
|
|
4
|
-
*
|
|
5
|
-
* @see extractUsageStatistics
|
|
6
|
-
* @see initialMetaStatistics
|
|
7
|
-
*/
|
|
8
|
-
export interface MetaStatistics {
|
|
9
|
-
/**
|
|
10
|
-
* The number of requests that were parsed successfully
|
|
11
|
-
*/
|
|
12
|
-
successfulParsed: number;
|
|
13
|
-
/**
|
|
14
|
-
* The processing time for each request
|
|
15
|
-
*/
|
|
16
|
-
processingTimeMs: number[];
|
|
17
|
-
/**
|
|
18
|
-
* All failed requests (e.g., if they can not be converted to XML)
|
|
19
|
-
*/
|
|
20
|
-
failedRequests: (RParseRequestFromText | RParseRequestFromFile)[];
|
|
21
|
-
/**
|
|
22
|
-
* Number of lines with each individual line length consumed for each request
|
|
23
|
-
*/
|
|
24
|
-
lines: number[][];
|
|
25
|
-
/**
|
|
26
|
-
* The number of nodes in the normalized AST
|
|
27
|
-
*/
|
|
28
|
-
numberOfNormalizedNodes: number[];
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Returns an initial {@link MetaStatistics} object, using neutral defaults (like the empty list).
|
|
32
|
-
*/
|
|
33
|
-
export declare function initialMetaStatistics(): MetaStatistics;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.initialMetaStatistics = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Returns an initial {@link MetaStatistics} object, using neutral defaults (like the empty list).
|
|
6
|
-
*/
|
|
7
|
-
function initialMetaStatistics() {
|
|
8
|
-
return {
|
|
9
|
-
successfulParsed: 0,
|
|
10
|
-
numberOfNormalizedNodes: [],
|
|
11
|
-
processingTimeMs: [],
|
|
12
|
-
failedRequests: [],
|
|
13
|
-
lines: []
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
exports.initialMetaStatistics = initialMetaStatistics;
|
|
17
|
-
//# sourceMappingURL=meta-statistics.js.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export type AppendFnType = string | number | symbol;
|
|
2
|
-
export interface StatisticAppendProvider {
|
|
3
|
-
append(name: string, fn: AppendFnType, content: string): void;
|
|
4
|
-
}
|
|
5
|
-
export type DummyAppendMemoryMap = Map<string, Map<AppendFnType, string[]>>;
|
|
6
|
-
export declare class DummyAppendProvider implements StatisticAppendProvider {
|
|
7
|
-
private readonly map;
|
|
8
|
-
/**
|
|
9
|
-
* If you pass a map the dummy will log all append calls to the map, using the feature name and the appendage type as keys
|
|
10
|
-
*
|
|
11
|
-
* @param map - The map to log to
|
|
12
|
-
*/
|
|
13
|
-
constructor(map?: DummyAppendMemoryMap | undefined);
|
|
14
|
-
append(name: string, fn: AppendFnType, content: string): void;
|
|
15
|
-
}
|
|
16
|
-
export declare const defaultStatisticsFileSuffix = ".txt";
|
|
17
|
-
/**
|
|
18
|
-
* Provides cached open connections for all files to connect.
|
|
19
|
-
* allowing to append to the same file often.
|
|
20
|
-
* <p>
|
|
21
|
-
* While we could simply reopen these files, it is safer/more performant to keep the connection open.
|
|
22
|
-
*/
|
|
23
|
-
export declare class StatisticFileProvider implements StatisticAppendProvider {
|
|
24
|
-
readonly statisticsDirectory: string;
|
|
25
|
-
private readonly connections;
|
|
26
|
-
constructor(statisticsDirectory: string | undefined);
|
|
27
|
-
/**
|
|
28
|
-
* @param name - the name of the feature {@link Feature#name}
|
|
29
|
-
* @param fn - the name of the feature-aspect to record
|
|
30
|
-
*/
|
|
31
|
-
private statisticsFile;
|
|
32
|
-
/**
|
|
33
|
-
* Append the given content to the information for a feature of the given name and function.
|
|
34
|
-
*/
|
|
35
|
-
append(name: string, fn: AppendFnType, content: string): void;
|
|
36
|
-
private getHandle;
|
|
37
|
-
}
|
|
@@ -1,97 +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.StatisticFileProvider = exports.defaultStatisticsFileSuffix = exports.DummyAppendProvider = void 0;
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const assert_1 = require("../../util/assert");
|
|
10
|
-
const log_1 = require("../../util/log");
|
|
11
|
-
class DummyAppendProvider {
|
|
12
|
-
map;
|
|
13
|
-
/**
|
|
14
|
-
* If you pass a map the dummy will log all append calls to the map, using the feature name and the appendage type as keys
|
|
15
|
-
*
|
|
16
|
-
* @param map - The map to log to
|
|
17
|
-
*/
|
|
18
|
-
constructor(map = undefined) {
|
|
19
|
-
this.map = map;
|
|
20
|
-
}
|
|
21
|
-
append(name, fn, content) {
|
|
22
|
-
if (log_1.log.settings.minLevel >= 1 /* LogLevel.Trace */) {
|
|
23
|
-
log_1.log.trace(`DummyAppendProvider: ${name} ${String(fn)} ${content}`);
|
|
24
|
-
}
|
|
25
|
-
if (this.map) {
|
|
26
|
-
const fnMap = this.map.get(name);
|
|
27
|
-
const contentArr = content.split('\n');
|
|
28
|
-
if (fnMap) {
|
|
29
|
-
const contentList = fnMap.get(fn);
|
|
30
|
-
if (contentList) {
|
|
31
|
-
contentList.push(...contentArr);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
// just in case the map already had some entries
|
|
35
|
-
fnMap.set(fn, contentArr);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
this.map.set(name, new Map([[fn, contentArr]]));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
exports.DummyAppendProvider = DummyAppendProvider;
|
|
45
|
-
exports.defaultStatisticsFileSuffix = '.txt';
|
|
46
|
-
/**
|
|
47
|
-
* Provides cached open connections for all files to connect.
|
|
48
|
-
* allowing to append to the same file often.
|
|
49
|
-
* <p>
|
|
50
|
-
* While we could simply reopen these files, it is safer/more performant to keep the connection open.
|
|
51
|
-
*/
|
|
52
|
-
class StatisticFileProvider {
|
|
53
|
-
statisticsDirectory;
|
|
54
|
-
connections = new Map();
|
|
55
|
-
constructor(statisticsDirectory) {
|
|
56
|
-
(0, assert_1.guard)(statisticsDirectory !== undefined, 'Please supply an output directory!');
|
|
57
|
-
this.statisticsDirectory = statisticsDirectory;
|
|
58
|
-
// just to make sure, that they are closed
|
|
59
|
-
process.on('beforeExit', () => {
|
|
60
|
-
this.connections.forEach(fd => {
|
|
61
|
-
fs_1.default.closeSync(fd);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* @param name - the name of the feature {@link Feature#name}
|
|
67
|
-
* @param fn - the name of the feature-aspect to record
|
|
68
|
-
*/
|
|
69
|
-
statisticsFile(name, fn) {
|
|
70
|
-
return path_1.default.join(this.statisticsDirectory, name, `${fn}${exports.defaultStatisticsFileSuffix}`);
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Append the given content to the information for a feature of the given name and function.
|
|
74
|
-
*/
|
|
75
|
-
append(name, fn, content) {
|
|
76
|
-
const descriptor = this.getHandle(name, String(fn));
|
|
77
|
-
fs_1.default.appendFileSync(descriptor, content + '\n', 'utf8');
|
|
78
|
-
}
|
|
79
|
-
getHandle(name, fn) {
|
|
80
|
-
const key = `${name}-${fn}`;
|
|
81
|
-
const fileHandle = this.connections.get(key);
|
|
82
|
-
if (fileHandle) {
|
|
83
|
-
return fileHandle;
|
|
84
|
-
}
|
|
85
|
-
// open the connection and ensure the location
|
|
86
|
-
const filepath = this.statisticsFile(name, String(fn));
|
|
87
|
-
const dirpath = path_1.default.dirname(filepath);
|
|
88
|
-
if (!fs_1.default.existsSync(dirpath)) {
|
|
89
|
-
fs_1.default.mkdirSync(dirpath, { recursive: true });
|
|
90
|
-
}
|
|
91
|
-
const fileDescriptor = fs_1.default.openSync(filepath, 'a');
|
|
92
|
-
this.connections.set(key, fileDescriptor);
|
|
93
|
-
return fileDescriptor;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
exports.StatisticFileProvider = StatisticFileProvider;
|
|
97
|
-
//# sourceMappingURL=file-provider.js.map
|