UNPKG

@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
"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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