@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
157 lines • 14.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SourceNodeGraph = void 0;
const SourceNodeMetaData_1 = require("./SourceNodeMetaData");
const ModelMap_1 = require("./ModelMap");
const ModelSet_1 = require("./ModelSet");
class SourceNodeGraph {
constructor() {
this._sourceNodes = new ModelMap_1.ModelMap('string');
this._outgoingSum = new ModelMap_1.ModelMap('string');
this._incomingSum = new ModelMap_1.ModelMap('string');
this._outgoingEdges = new ModelMap_1.ModelMap('string');
this._incomingEdges = new ModelMap_1.ModelMap('string');
this._reachabilityCache = new ModelMap_1.ModelMap('string');
}
get sourceNodes() {
return this._sourceNodes;
}
get outgoingEdges() {
return this._outgoingEdges;
}
get incomingEdges() {
return this._incomingEdges;
}
outgoingSumOfNode(nodeID) {
let result = this._outgoingSum.get(nodeID);
if (result === undefined) {
const incomingEdges = this._outgoingEdges.get(nodeID);
if (incomingEdges === undefined) {
return undefined;
}
result = SourceNodeMetaData_1.SourceNodeMetaData.sum(...incomingEdges.values());
this._outgoingSum.set(nodeID, result);
}
return result;
}
incomingSumOfNode(nodeID) {
let result = this._incomingSum.get(nodeID);
if (result === undefined) {
const incomingEdges = this._incomingEdges.get(nodeID);
if (incomingEdges === undefined) {
return undefined;
}
result = SourceNodeMetaData_1.SourceNodeMetaData.sum(...incomingEdges.values());
this._incomingSum.set(nodeID, result);
}
return result;
}
addReferenceEdge(fromReport, fromSourceNode, toReport, toSourceNode, reference) {
// Create unique IDs for the source nodes
const fromSourceNodeID = `${fromReport.internID}:${fromSourceNode.id}`;
const toSourceNodeID = `${toReport.internID}:${toSourceNode.id}`;
// Ensure both source nodes are in the graph
this.sourceNodes.set(fromSourceNodeID, fromSourceNode);
this.sourceNodes.set(toSourceNodeID, toSourceNode);
// Get or create the outgoing and incoming edges maps
let outgoingReferences = this._outgoingEdges.get(fromSourceNodeID);
if (outgoingReferences === undefined) {
outgoingReferences = new ModelMap_1.ModelMap('string');
this._outgoingEdges.set(fromSourceNodeID, outgoingReferences);
}
let incomingReferences = this._incomingEdges.get(toSourceNodeID);
if (incomingReferences === undefined) {
incomingReferences = new ModelMap_1.ModelMap('string');
this._incomingEdges.set(toSourceNodeID, incomingReferences);
}
// Add the reference in both directions
outgoingReferences.set(toSourceNodeID, reference);
incomingReferences.set(fromSourceNodeID, reference);
}
insertSourceNode(report, globalIndex, sourceNodeMetaData) {
this.sourceNodes.set(`${report.internID}:${sourceNodeMetaData.id}`, sourceNodeMetaData);
for (const iterator of [
sourceNodeMetaData.lang_internal,
sourceNodeMetaData.intern,
sourceNodeMetaData.extern
]) {
for (const sourceNodeReference of iterator.values()) {
const source = report.resolveSourceNodeID(globalIndex, sourceNodeReference.id);
if (source.error === true) {
throw new Error('SourceNodeGraph.insertSourceNode: cannot resolve source source node for reference id: ' +
sourceNodeReference.id.toString());
}
this.addReferenceEdge(source.report, source.sourceNode, report, sourceNodeMetaData, sourceNodeReference);
}
}
}
static fromProjectReport(projectReport) {
return SourceNodeGraph.fromReport(projectReport, projectReport.globalIndex);
}
static fromReport(report, globalIndex, graph) {
const graphToInsert = graph || new SourceNodeGraph();
for (const sourceFileMetaData of report.lang_internal.values()) {
for (const sourceNodeMetaData of sourceFileMetaData.functions.values()) {
graphToInsert.insertSourceNode(report, globalIndex, sourceNodeMetaData);
}
}
for (const sourceFileMetaData of report.intern.values()) {
for (const sourceNodeMetaData of sourceFileMetaData.functions.values()) {
graphToInsert.insertSourceNode(report, globalIndex, sourceNodeMetaData);
}
}
for (const externModuleReport of report.extern.values()) {
SourceNodeGraph.fromReport(externModuleReport, globalIndex, graphToInsert);
}
return graphToInsert;
}
toJSON() {
return {
sourceNodes: this._sourceNodes.toJSON(),
outgoingEdges: this._outgoingEdges.toJSON(),
incomingEdges: this._incomingEdges.toJSON()
};
}
reachabilityForNode(nodeID) {
const cached = this._reachabilityCache.get(nodeID);
if (cached === undefined) {
const visited = new ModelSet_1.ModelSet();
this.dfs(nodeID, visited, this._reachabilityCache);
this._reachabilityCache.set(nodeID, visited);
return visited;
}
return cached;
}
dfs(sourceNodeID, visited, reach) {
if (reach !== undefined) {
const existing = reach.get(sourceNodeID);
if (existing !== undefined) {
existing.forEach((nodeID) => {
visited.add(nodeID);
});
return;
}
}
const neighbors = this._outgoingEdges.get(sourceNodeID);
if (neighbors === undefined) {
return;
}
for (const v of neighbors.keys()) {
if (!visited.has(v)) {
visited.add(v);
this.dfs(v, visited, reach);
}
}
}
reachability() {
if (this._reachabilityCache.size === this._sourceNodes.size) {
return this._reachabilityCache;
}
for (const nodeID of this._sourceNodes.keys()) {
this.reachabilityForNode(nodeID);
}
return this._reachabilityCache;
}
}
exports.SourceNodeGraph = SourceNodeGraph;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU291cmNlTm9kZUdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsL1NvdXJjZU5vZGVHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2REFBeUQ7QUFDekQseUNBQXFDO0FBQ3JDLHlDQUFxQztBQW9CckMsTUFBYSxlQUFlO0lBcUIzQjtRQUNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLG1CQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELElBQUksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUN6QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUMzQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQTtJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBMkI7UUFDNUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDMUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFB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