@oaklean/profiler-core
Version:
Part of the @oaklean suite. It provides all basic functions to work with the `.oak` file format. It allows parsing the `.oak` file format as well as tools for analyzing the measurement values. It also provides all necessary capabilities required for prec
601 lines • 61.1 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Report = void 0;
const fs = __importStar(require("fs"));
const BaseModel_1 = require("./BaseModel");
const ModelMap_1 = require("./ModelMap");
const NodeModule_1 = require("./NodeModule");
const SourceFileMetaData_1 = require("./SourceFileMetaData");
const SourceNodeMetaData_1 = require("./SourceNodeMetaData");
const ProfilerConfig_1 = require("./ProfilerConfig");
const SensorValues_1 = require("./SensorValues");
const PermissionHelper_1 = require("../helper/PermissionHelper");
const app_1 = require("../constants/app");
const UnifiedPath_1 = require("../system/UnifiedPath");
const BufferHelper_1 = require("../helper/BufferHelper");
const VersionHelper_1 = require("../helper/VersionHelper");
// Types
const types_1 = require("../types");
// global variable to assign an intern id to every report
// the intern id is only used to uniquely identify a report within a project report,
// since there could be multiple module reports for the same node module (but as a child of another module report)
let currentInternID = 0;
class Report extends BaseModel_1.BaseModel {
constructor(moduleIndex, kind) {
super();
this.reportVersion = app_1.VERSION;
this.kind = kind;
this.moduleIndex = moduleIndex;
this.internID = currentInternID++;
}
normalize(newGlobalIndex) {
var _a;
const new_lang_internal = new ModelMap_1.ModelMap('number');
for (const pathID of Array.from(this.lang_internal.keys()).sort()) {
const sourceFileMetaData = this.lang_internal.get(pathID);
sourceFileMetaData.normalize(newGlobalIndex);
if (sourceFileMetaData.pathIndex.id === undefined) {
throw new Error('Report.normalize(lang_internal): cannot resolve id of new created pathIndex');
}
new_lang_internal.set(sourceFileMetaData.pathIndex.id, sourceFileMetaData);
}
const newModuleIndex = this.moduleIndex.insertToOtherIndex(newGlobalIndex);
const new_intern = new ModelMap_1.ModelMap('number');
for (const pathID of Array.from(this.intern.keys()).sort()) {
const sourceFileMetaData = this.intern.get(pathID);
sourceFileMetaData.normalize(newGlobalIndex);
if (sourceFileMetaData.pathIndex.id === undefined) {
throw new Error('Report.normalize(intern): cannot resolve id of new created pathIndex');
}
new_intern.set(sourceFileMetaData.pathIndex.id, sourceFileMetaData);
}
const new_extern = new ModelMap_1.ModelMap('number');
for (const moduleID of Array.from(this.extern.keys()).sort()) {
const moduleReport = this.extern.get(moduleID);
moduleReport.normalize(newGlobalIndex);
new_extern.set(moduleReport.moduleIndex.id, moduleReport);
}
const newInternMapping = new ModelMap_1.ModelMap('number');
for (const PathID_source of Array.from(this.internMapping.keys()).sort()) {
const PathID_target = this.internMapping.get(PathID_source);
const pathIndex_source = this.moduleIndex.globalIndex.getPathIndexByID(PathID_source);
const pathIndex_target = this.moduleIndex.globalIndex.getPathIndexByID(PathID_target);
if (pathIndex_source === undefined || pathIndex_target === undefined) {
throw new Error('Report.normalize(internMapping): could not resolve path index');
}
const newModuleIndex_source = newGlobalIndex.getModuleIndex('get');
const newModuleIndex_target = newGlobalIndex.getModuleIndex('get');
if (newModuleIndex_source === undefined || newModuleIndex_target === undefined) {
throw new Error('Report.normalize(internMapping): could not resolve new module index');
}
const newPathIndex_source_id = newModuleIndex_source.getFilePathIndex('upsert', pathIndex_source.identifier).id;
const newPathIndex_target_id = (_a = newModuleIndex_target.getFilePathIndex('get', pathIndex_target.identifier)) === null || _a === void 0 ? void 0 : _a.id;
if (newPathIndex_source_id === undefined || newPathIndex_target_id === undefined) {
throw new Error('Report.normalize(internMapping): could not resolve new path index');
}
newInternMapping.set(newPathIndex_source_id, newPathIndex_target_id);
}
this.moduleIndex = newModuleIndex;
this._internMapping = newInternMapping;
this._lang_internal = new_lang_internal;
this._intern = new_intern;
this._extern = new_extern;
}
get lang_internalHeadlessSensorValues() {
if (this._lang_internalHeadlessSensorValues === undefined) {
this._lang_internalHeadlessSensorValues = new SensorValues_1.SensorValues({});
}
return this._lang_internalHeadlessSensorValues;
}
set lang_internalHeadlessSensorValues(value) {
this._lang_internalHeadlessSensorValues = value;
}
get internMapping() {
if (!this._internMapping) {
this._internMapping = new ModelMap_1.ModelMap('number');
}
return this._internMapping;
}
get lang_internal() {
if (!this._lang_internal) {
this._lang_internal = new ModelMap_1.ModelMap('number');
}
return this._lang_internal;
}
get intern() {
if (!this._intern) {
this._intern = new ModelMap_1.ModelMap('number');
}
return this._intern;
}
get extern() {
if (!this._extern) {
this._extern = new ModelMap_1.ModelMap('number');
}
return this._extern;
}
get reversedInternMapping() {
const result = new ModelMap_1.ModelMap('number');
for (const [key, value] of this.internMapping.entries()) {
result.set(value, key);
}
return result;
}
getLangInternalPathIndex(indexRequestType, filePath) {
var _a;
return (_a = this.
moduleIndex.
globalIndex.
getLangInternalIndex(indexRequestType)) === null || _a === void 0 ? void 0 : _a.getFilePathIndex(indexRequestType, filePath);
}
getModuleIndexByID(id) {
return this.moduleIndex.globalIndex.getModuleIndexByID(id);
}
getModuleIndex(indexRequestType, moduleIdentifier) {
return this.moduleIndex.
globalIndex.
getModuleIndex(indexRequestType, moduleIdentifier);
}
getPathIndexByID(id) {
return this.moduleIndex.globalIndex.getPathIndexByID(id);
}
getPathIndex(indexRequestType, filePath) {
return this.moduleIndex.getFilePathIndex(indexRequestType, filePath);
}
removeFromIntern(filePath) {
let filePaths = [];
if (typeof filePath === 'string') {
filePaths = [filePath];
}
else {
filePaths = filePath;
}
for (const pathToRemove of filePaths) {
const pathIndex = this.getPathIndex('get', pathToRemove);
if (pathIndex === undefined) {
continue;
}
const pathID = pathIndex.id;
if (this.intern.has(pathID)) {
this.intern.delete(pathID);
}
if (this.internMapping.has(pathID)) {
this.internMapping.delete(pathID);
}
}
for (const sourceFileMetaData of this.intern.values()) {
sourceFileMetaData.removeFromIntern(filePaths);
}
}
addSourceFileMapLink(compiledFilePath, sourceFilePath) {
const compiledFilePathIndex = this.getPathIndex('get', compiledFilePath.toString());
const compiledFilePathID = compiledFilePathIndex === null || compiledFilePathIndex === void 0 ? void 0 : compiledFilePathIndex.id;
if (compiledFilePathID === undefined || !this.intern.has(compiledFilePathID)) {
throw new Error(`addSourceFileMapLink: The compiled file target does not exist (${compiledFilePath.toString()})`);
}
const sourceFilePathIndex = this.getPathIndex('upsert', sourceFilePath.toString());
const sourceFilePathID = sourceFilePathIndex.id;
this.internMapping.set(sourceFilePathID, compiledFilePathID);
}
addToLangInternal(filePath, functionIdentifier) {
const pathIndex = this.getLangInternalPathIndex('upsert', filePath);
const filePathID = pathIndex.id;
// check if filePath is in intern
let sourceFileMetaData = this.lang_internal.get(filePathID);
if (!sourceFileMetaData) {
sourceFileMetaData = new SourceFileMetaData_1.SourceFileMetaData(filePath, pathIndex);
this.lang_internal.set(filePathID, sourceFileMetaData);
}
return sourceFileMetaData.createOrGetSourceNodeMetaData(functionIdentifier, types_1.SourceNodeMetaDataType.LangInternalSourceNode);
}
// IMPORTANT to change when new measurement type gets added
addSensorValuesToLangInternal(filePath, functionIdentifier, { cpuTime, cpuEnergyConsumption, ramEnergyConsumption }) {
const sourceNodeMetaData = this.addToLangInternal(filePath, functionIdentifier);
sourceNodeMetaData.sensorValues.profilerHits += 1;
sourceNodeMetaData.addToSensorValues({ cpuTime, cpuEnergyConsumption, ramEnergyConsumption });
return sourceNodeMetaData;
}
addToIntern(filePath, functionIdentifier) {
const filePathIndex = this.getPathIndex('upsert', filePath);
const filePathID = filePathIndex.id;
// check if filePath is in intern
let sourceFileMetaData = this.intern.get(filePathID);
if (!sourceFileMetaData) {
sourceFileMetaData = new SourceFileMetaData_1.SourceFileMetaData(filePath, filePathIndex);
this.intern.set(filePathID, sourceFileMetaData);
}
return sourceFileMetaData.createOrGetSourceNodeMetaData(functionIdentifier, types_1.SourceNodeMetaDataType.SourceNode);
}
// IMPORTANT to change when new measurement type gets added
addSensorValuesToIntern(filePath, functionIdentifier, { cpuTime, cpuEnergyConsumption, ramEnergyConsumption }) {
const sourceNodeMetaData = this.addToIntern(filePath, functionIdentifier);
sourceNodeMetaData.sensorValues.profilerHits += 1;
sourceNodeMetaData.addToSensorValues({ cpuTime, cpuEnergyConsumption, ramEnergyConsumption });
return sourceNodeMetaData;
}
addToExtern(filePath, nodeModule, functionIdentifier) {
const moduleIndex = this.moduleIndex.globalIndex.getModuleIndex('upsert', nodeModule.identifier);
// check if filePath is in extern
let moduleReport = this.extern.get(moduleIndex.id);
if (!moduleReport) {
moduleReport = new ModuleReport_1.ModuleReport(moduleIndex, nodeModule, this.kind);
this.extern.set(moduleIndex.id, moduleReport);
}
const sourceNodeMetaData = moduleReport.addToIntern(filePath.toString(), functionIdentifier);
return {
report: moduleReport,
sourceNodeMetaData: sourceNodeMetaData
};
}
// IMPORTANT to change when new measurement type gets added
addSensorValuesToExtern(filePath, nodeModule, functionIdentifier, { cpuTime, cpuEnergyConsumption, ramEnergyConsumption }) {
const { report, sourceNodeMetaData } = this.addToExtern(filePath, nodeModule, functionIdentifier);
sourceNodeMetaData.sensorValues.profilerHits += 1;
sourceNodeMetaData.addToSensorValues({ cpuTime, cpuEnergyConsumption, ramEnergyConsumption });
return {
report,
sourceNodeMetaData
};
}
/**
* Returns the meta data of a file
*
* since a meta data file is anonymized (no absolute path is stored)
* there is a total of three paths necessary to retrieve the correct meta data of a file
*
* this.relativeRootDir:
* describes the location of the execution (relative to the meta data file)
*
* projectReportFilePath:
* is the current location of the ProjectReport file
*
* relativeFilePath:
* is the location of a measured source file,
* relative to the execution path (this.relativeRootDir)
*
* All measurements are stored in this.lang_internal, this,intern and this,extern
* the keys are the corresponding relativeFilePaths
*
* the absolute path of the measured source file is:
* path.join(projectReportFilePath, this.relativeRootDir, relativeFilePath)
*
* therefore the relativeFilePath of the absolute one is:
* const relativeFilePath = path.relative(path.join(projectReportFilePath, this.relativeRootDir), absoluteFilePath)
*
* @param projectReportFilePath is the current location of the ProjectReport file
* @param absoluteFilePath is the absolute path of the measured source file
* @returns the measurements of the given source file
*/
getMetaDataFromFile(projectReportFilePath, absoluteFilePath) {
if (!this.relativeRootDir) {
const absoluteFilePathIndex = this.getPathIndex('get', absoluteFilePath.toString());
if (absoluteFilePathIndex === undefined) {
return undefined;
}
const absoluteFilePathID = absoluteFilePathIndex === null || absoluteFilePathIndex === void 0 ? void 0 : absoluteFilePathIndex.id;
const internResult = this.intern.get(absoluteFilePathID);
if (internResult) {
return internResult;
}
const mappedabsoluteFilePathID = this.internMapping.get(absoluteFilePathID);
if (mappedabsoluteFilePathID) {
return this.intern.get(mappedabsoluteFilePathID);
}
return undefined;
}
const relativeFilePath = projectReportFilePath.dirName().join(this.relativeRootDir).pathTo(absoluteFilePath);
const relativeFilePathIndex = this.getPathIndex('get', relativeFilePath.toString());
if (relativeFilePathIndex === undefined) {
return undefined;
}
const relativeFilePathID = relativeFilePathIndex === null || relativeFilePathIndex === void 0 ? void 0 : relativeFilePathIndex.id;
const internResult = this.intern.get(relativeFilePathID);
if (internResult) {
return internResult;
}
const mappedRelativeFilePathID = this.internMapping.get(relativeFilePathID);
if (mappedRelativeFilePathID) {
return this.intern.get(mappedRelativeFilePathID);
}
return undefined;
}
totalAndMaxMetaData() {
const totals = [];
const maxs = [];
for (const sourceFileMetaData of this.intern.values()) {
totals.push(sourceFileMetaData.totalSourceNodeMetaData().sum);
maxs.push(sourceFileMetaData.maxSourceNodeMetaData());
}
return new SourceFileMetaData_1.AggregatedSourceNodeMetaData(SourceNodeMetaData_1.SourceNodeMetaData.sum(...totals), SourceNodeMetaData_1.SourceNodeMetaData.max(...maxs));
}
validate() {
for (const sourceFileMetaData of this.intern.values()) {
sourceFileMetaData.validate();
}
for (const moduleReport of this.extern.values()) {
moduleReport.validate();
}
}
toJSON() {
var _a;
if (process.env.NODE_ENV === 'test') {
this.validate();
}
return {
reportVersion: this.reportVersion,
kind: this.kind,
relativeRootDir: (_a = this.relativeRootDir) === null || _a === void 0 ? void 0 : _a.toJSON(),
lang_internalHeadlessSensorValues: this.lang_internalHeadlessSensorValues.toJSON(),
internMapping: this.internMapping.toJSON(),
lang_internal: this.lang_internal.toJSON(),
intern: this.intern.toJSON(),
extern: this.extern.toJSON(),
};
}
static fromJSONReport(json, moduleIndex) {
let data;
if (typeof json === 'string') {
data = JSON.parse(json);
}
else {
data = json;
}
const result = new Report(moduleIndex, data.kind);
if (data.internMapping) {
for (const key of Object.keys(data.internMapping)) {
const keyNumber = parseInt(key);
result.internMapping.set(keyNumber, data.internMapping[keyNumber]);
}
}
if (data.lang_internal) {
for (const key of Object.keys(data.lang_internal)) {
const keyNumber = parseInt(key);
const pathIndex = result.getPathIndexByID(keyNumber);
if (pathIndex === undefined) {
throw new Error(`Report.fromJSONReport: (lang_internal) could not resolve path index from id: ${keyNumber}`);
}
result.lang_internal.set(keyNumber, SourceFileMetaData_1.SourceFileMetaData.fromJSON(data.lang_internal[keyNumber], pathIndex));
}
}
if (data.lang_internalHeadlessSensorValues) {
result.lang_internalHeadlessSensorValues = SensorValues_1.SensorValues.fromJSON(data.lang_internalHeadlessSensorValues);
}
if (data.intern) {
for (const key of Object.keys(data.intern)) {
const keyNumber = parseInt(key);
const pathIndex = result.getPathIndexByID(keyNumber);
if (pathIndex === undefined) {
throw new Error(`Report.fromJSONReport: (intern) could not resolve path index from id: ${keyNumber}`);
}
result.intern.set(keyNumber, SourceFileMetaData_1.SourceFileMetaData.fromJSON(data.intern[keyNumber], pathIndex));
}
}
if (data.extern) {
for (const key of Object.keys(data.extern)) {
const keyNumber = parseInt(key);
const nodeModule = NodeModule_1.NodeModule.fromJSON(data.extern[keyNumber].nodeModule);
const nextModuleIndex = moduleIndex.globalIndex.getModuleIndex('upsert', nodeModule.identifier);
result.extern.set(keyNumber, ModuleReport_1.ModuleReport.fromJSON(data.extern[keyNumber], nextModuleIndex));
}
}
if (data.relativeRootDir) {
result.relativeRootDir = new UnifiedPath_1.UnifiedPath(data.relativeRootDir);
}
result.reportVersion = data.reportVersion;
return result;
}
storeToFileReport(filePath, kind, type, config) {
if (!fs.existsSync(filePath.dirName().toPlatformString())) {
PermissionHelper_1.PermissionHelper.mkdirRecursivelyWithUserPermission(filePath.dirName().toPlatformString());
}
if (!this.relativeRootDir) {
const usedConfig = config !== undefined ? config : ProfilerConfig_1.ProfilerConfig.autoResolve();
this.relativeRootDir = filePath.dirName().pathTo(usedConfig.getRootDir());
}
switch (kind) {
case 'pretty-json':
PermissionHelper_1.PermissionHelper.writeFileWithUserPermission(filePath.toPlatformString(), JSON.stringify(this, null, 2));
break;
case 'json':
PermissionHelper_1.PermissionHelper.writeFileWithUserPermission(filePath.toPlatformString(), JSON.stringify(this));
break;
case 'bin':
PermissionHelper_1.PermissionHelper.writeFileWithUserPermission(filePath.toPlatformString(), this.toBuffer(type));
break;
default:
break;
}
}
static merge(moduleIndex, ...args) {
var _a;
if (args.length === 0) {
throw new Error('Report.merge: no Reports were given');
}
const result = new Report(moduleIndex, types_1.ReportKind.accumulated);
const version = args[0].reportVersion;
result.reportVersion = version;
const lang_internalHeadlessSensorValues = [];
const valuesToMerge = {
lang_internal: {},
intern: {},
extern: {},
};
for (const currentProjectReport of args) {
if (currentProjectReport.reportVersion !== version) {
throw new Error('ProjectReport.merge: Project reports versions are not compatible');
}
lang_internalHeadlessSensorValues.push(currentProjectReport.lang_internalHeadlessSensorValues);
for (const [pathID, mappedPathID] of currentProjectReport.internMapping.entries()) {
// extract paths from the given IDs
const pathIndex = currentProjectReport.getPathIndexByID(pathID);
const mappedPathIndex = currentProjectReport.getPathIndexByID(mappedPathID);
if (pathIndex === undefined || mappedPathIndex === undefined) {
throw new Error('Report.merge: (internMapping) could not resolve paths from ids');
}
// add old pathID to new index and get its newPathID
const newPathID = result.getPathIndex('upsert', pathIndex.identifier).id;
const resultValue = result.internMapping.get(newPathID);
if (!resultValue) {
// add old MappedPathID to new index and get its newMappedPathID
const newMappedPathID = result.getPathIndex('upsert', mappedPathIndex.identifier).id;
result.internMapping.set(newPathID, newMappedPathID);
}
else {
if (((_a = result.getPathIndexByID(resultValue)) === null || _a === void 0 ? void 0 : _a.identifier) !== mappedPathIndex.identifier) {
throw new Error('ProjectReport.merge: the ProjectReports contain different path mapping');
}
}
}
for (const [langInternalPathID, sourceFileMetaData] of currentProjectReport.lang_internal.entries()) {
const langInternalPathIndex = currentProjectReport.getPathIndexByID(langInternalPathID);
if (langInternalPathIndex === undefined) {
throw new Error('Report.merge: (lang_internal) could not resolve langInternalPath from id');
}
const langInternalPath = langInternalPathIndex.identifier;
if (!valuesToMerge.lang_internal[langInternalPath]) {
valuesToMerge.lang_internal[langInternalPath] = [];
}
valuesToMerge.lang_internal[langInternalPath].push(sourceFileMetaData);
}
for (const [sourceFilePathID, sourceFileMetaData] of currentProjectReport.intern.entries()) {
const sourceFilePathIndex = currentProjectReport.getPathIndexByID(sourceFilePathID);
if (sourceFilePathIndex === undefined) {
throw new Error('Report.merge: (intern) could not resolve sourceFilePath from id');
}
const sourceFilePath = sourceFilePathIndex.identifier;
if (!valuesToMerge.intern[sourceFilePath]) {
valuesToMerge.intern[sourceFilePath] = [];
}
valuesToMerge.intern[sourceFilePath].push(sourceFileMetaData);
}
for (const [moduleID, moduleReport] of currentProjectReport.extern.entries()) {
const nodeModuleIndex = currentProjectReport.getModuleIndexByID(moduleID);
if (nodeModuleIndex === undefined) {
throw new Error('Report.merge: (intern) could not resolve nodeModuleIdentifier from id');
}
const nodeModuleIdentifier = nodeModuleIndex.identifier;
if (!valuesToMerge.extern[nodeModuleIdentifier]) {
valuesToMerge.extern[nodeModuleIdentifier] = [];
}
valuesToMerge.extern[nodeModuleIdentifier].push(moduleReport);
}
}
for (const [langInternalPath, sourceFileMetaDatas] of Object.entries(valuesToMerge.lang_internal)) {
const langInternalPathIndex = result.
getLangInternalPathIndex('upsert', langInternalPath);
const langInternalPathID = langInternalPathIndex.id;
result.lang_internal.set(langInternalPathID, SourceFileMetaData_1.SourceFileMetaData.merge(langInternalPathIndex, ...sourceFileMetaDatas));
}
for (const [sourceFilePath, sourceFileMetaDatas] of Object.entries(valuesToMerge.intern)) {
const sourceFilePathIndex = result.getPathIndex('upsert', sourceFilePath);
const sourceFilePathID = sourceFilePathIndex.id;
result.intern.set(sourceFilePathID, SourceFileMetaData_1.SourceFileMetaData.merge(sourceFilePathIndex, ...sourceFileMetaDatas));
}
for (const [nodeModuleIdentifier, moduleReports] of Object.entries(valuesToMerge.extern)) {
const nodeModuleIndex = result.getModuleIndex('upsert', nodeModuleIdentifier);
const nodeModuleID = nodeModuleIndex.id;
result.extern.set(nodeModuleID, ModuleReport_1.ModuleReport.merge(nodeModuleIndex, ...moduleReports));
}
result.lang_internalHeadlessSensorValues = SensorValues_1.SensorValues.sum(...lang_internalHeadlessSensorValues);
return result;
}
toBuffer(type) {
const buffers = [
BufferHelper_1.BufferHelper.String2LToBuffer(this.reportVersion),
BufferHelper_1.BufferHelper.UInt8ToBuffer(this.kind),
BufferHelper_1.BufferHelper.UInt8ToBuffer(type),
BufferHelper_1.BufferHelper.BooleanToBuffer(this.relativeRootDir !== undefined)
];
if (this.relativeRootDir !== undefined) {
buffers.push(BufferHelper_1.BufferHelper.String2LToBuffer(this.relativeRootDir.toString()));
}
// if current Oaklean version is greater or equal to 0.1.4
// add lang_internal_headless_cpu_time to the buffer
if (VersionHelper_1.VersionHelper.compare(this.reportVersion, '0.1.4') >= 0) {
buffers.push(this.lang_internalHeadlessSensorValues.toBuffer());
}
buffers.push(this.internMapping.toBuffer(), this.intern.toBuffer(), this.lang_internal.toBuffer(), this.extern.toBuffer());
return Buffer.concat(buffers);
}
static consumeFromBufferReport(buffer, moduleIndex) {
let remainingBuffer = buffer;
const { instance: reportVersion, remainingBuffer: newRemainingBuffer0 } = BufferHelper_1.BufferHelper.String2LFromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer0;
const { instance: kind, remainingBuffer: newRemainingBuffer1 } = BufferHelper_1.BufferHelper.UInt8FromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer1;
const { instance: type, remainingBuffer: newRemainingBuffer2 } = BufferHelper_1.BufferHelper.UInt8FromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer2;
const { instance: relativeRootDirPresent, remainingBuffer: newRemainingBuffer3 } = BufferHelper_1.BufferHelper.BooleanFromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer3;
let relativeRootDir = undefined;
if (relativeRootDirPresent) {
const { instance, remainingBuffer: newRemainingBuffer3 } = BufferHelper_1.BufferHelper.String2LFromBuffer(remainingBuffer);
relativeRootDir = instance;
remainingBuffer = newRemainingBuffer3;
}
let langInternalHeadLessSensorValues = undefined;
// if the version of the Report is greater or equal to 0.1.4
// consume lang_internal_headless_cpu_time from the buffer
if (VersionHelper_1.VersionHelper.compare(reportVersion, '0.1.4') >= 0) {
const { instance: langInternalHeadLessSensorValues_instance, remainingBuffer: newRemainingBuffer3_1 } = SensorValues_1.SensorValues.consumeFromBuffer(remainingBuffer);
remainingBuffer = newRemainingBuffer3_1;
langInternalHeadLessSensorValues = langInternalHeadLessSensorValues_instance;
}
const { instance: internMapping, remainingBuffer: newRemainingBuffer4 } = ModelMap_1.ModelMap.consumeFromBuffer(remainingBuffer, 'number', 'number');
remainingBuffer = newRemainingBuffer4;
const consumeFromBuffer_SourceFileMetaData = (buffer) => {
return SourceFileMetaData_1.SourceFileMetaData.consumeFromBuffer(buffer, moduleIndex.globalIndex);
};
const { instance: intern, remainingBuffer: newRemainingBuffer5 } = ModelMap_1.ModelMap.consumeFromBuffer(remainingBuffer, 'number', consumeFromBuffer_SourceFileMetaData);
remainingBuffer = newRemainingBuffer5;
const { instance: lang_internal, remainingBuffer: newRemainingBuffer6 } = ModelMap_1.ModelMap.consumeFromBuffer(remainingBuffer, 'number', consumeFromBuffer_SourceFileMetaData);
remainingBuffer = newRemainingBuffer6;
const consumeFromBuffer_ModuleReport = (buffer) => {
return ModuleReport_1.ModuleReport.consumeFromBuffer_ModuleReport(buffer, moduleIndex.globalIndex);
};
const { instance: extern, remainingBuffer: newRemainingBuffer7 } = ModelMap_1.ModelMap.consumeFromBuffer(remainingBuffer, 'number', consumeFromBuffer_ModuleReport);
remainingBuffer = newRemainingBuffer7;
const result = new Report(moduleIndex, kind);
result.reportVersion = reportVersion;
result.relativeRootDir = relativeRootDir !== undefined ? new UnifiedPath_1.UnifiedPath(relativeRootDir) : undefined;
result._internMapping = internMapping;
result._intern = intern;
result._lang_internal = lang_internal;
result._extern = extern;
if (langInternalHeadLessSensorValues) {
result.lang_internalHeadlessSensorValues = langInternalHeadLessSensorValues;
}
return {
instance: result,
type,
remainingBuffer
};
}
}
exports.Report = Report;
// eslint-disable-next-line import/order
const ModuleReport_1 = require("./ModuleReport");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsL1JlcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF3QjtBQUV4QiwyQ0FBdUM7QUFDdkMseUNBQXFDO0FBQ3JDLDZDQUF5QztBQUN6Qyw2REFHNkI7QUFDN0IsNkRBRTZCO0FBQzdCLHFEQUFpRDtBQUNqRCxpREFBNkM7QUFLN0MsaUVBQTZEO0FBQzdELDBDQUEwQztBQUMxQyx1REFBbUQ7QUFDbkQseURBQXFEO0FBQ3JELDJEQUF1RDtBQUN2RCxRQUFRO0FBQ1Isb0NBaUJpQjtBQUdqQix5REFBeUQ7QUFDekQsb0ZBQW9GO0FBQ3BGLGtIQUFrSDtBQUNsSCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUE7QUFFdkIsTUFBYSxNQUFPLFNBQVEscUJBQVM7SUFnQnBDLFlBQ0MsV0FBd0IsRUFDeEIsSUFBZ0I7UUFFaEIsS0FBSyxFQUFFLENBQUE7UUFDUCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQU8sQ0FBQTtRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRCxTQUFTLENBQ1IsY0FBMkI7O1FBRTNCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxtQkFBUSxDQUFvQyxRQUFRLENBQUMsQ0FBQTtRQUNuRixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUUsQ0FBQTtZQUMxRCxrQkFB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