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

308 lines 23.7 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ProgramStructureTree = void 0; const fs = __importStar(require("fs")); const BaseModel_1 = require("./BaseModel"); const ModelMap_1 = require("./ModelMap"); const PermissionHelper_1 = require("../helper/PermissionHelper"); const SourceNodeIdentifierHelper_1 = require("../helper/SourceNodeIdentifierHelper"); // Types const types_1 = require("../types"); class ProgramStructureTree extends BaseModel_1.BaseModel { constructor(parent, id, type, identifierType, identifier, beginLoc, endLoc) { super(); if (!SourceNodeIdentifierHelper_1.SourceNodeIdentifierHelper.validateSourceNodeIdentifierPart(identifier)) { throw new Error('ProgramStructureTree.constructor invalid identifier format: ' + identifier); } this.parent = parent; this.id = id; this.type = type; this.identifierType = identifierType; this.identifier = identifier; this.beginLoc = beginLoc; this.endLoc = endLoc; this._children = new ModelMap_1.ModelMap('string'); this._childrenByBeginLoc = new Map(); // Cache initialization this.identifierBySourceLocationCache = new Map(); this.containsLocationCache = new Map(); this.sourceLocationOfIdentifierCache = new Map(); } hasChildren(sourceNodeIdentifierPart) { return this._children.has(sourceNodeIdentifierPart); } getChildren(sourceNodeIdentifierPart) { return this._children.get(sourceNodeIdentifierPart); } childrenValues() { return this._children.values(); } childrenEntries() { return this._children.entries(); } get childrenSize() { return this._children.size; } addChildren(child) { this._children.set(child.identifier, child); this._childrenByBeginLoc.set(`${child.beginLoc.line}:${child.beginLoc.column}`, child); } static compareNodeLocations(a, b) { const [aLine, aColumn] = a.split(':').map(Number); const [bLine, bColumn] = b.split(':').map(Number); if (aLine < bLine) { return -1; } if (aLine > bLine) { return 1; } if (aColumn < bColumn) { return -1; } if (aColumn > bColumn) { return 1; } return 0; } get sortedChildrenKeys() { if (this._sortedChildrenKeys === undefined) { this._sortedChildrenKeys = Array.from(this._childrenByBeginLoc.keys()).sort(ProgramStructureTree.compareNodeLocations); } return this._sortedChildrenKeys; } numberOfLeafs() { const traverse = (currentNode) => { if (currentNode._children.size === 0) { if (currentNode.type === types_1.ProgramStructureTreeType.Root) { return 0; } return 1; } let count = 0; for (const child of currentNode._children.values()) { count += traverse(child); } return count; }; return traverse(this); } /** * Returns the identifier path of the current node. */ identifierPath() { if (this.parent === null) { return this.identifier; } return (this.parent.identifierPath() + '.' + this.identifier); } identifierHierarchy() { const traverse = (currentNode) => { const result = { type: currentNode.type }; for (const [childIdentifier, child] of currentNode._children.entries()) { const children = result.children || {}; children[childIdentifier] = traverse(child); result.children = children; } return result; }; return traverse(this); } toJSON() { return { id: this.id, type: this.type, identifierType: this.identifierType, identifier: this.identifier, beginLoc: this.beginLoc, endLoc: this.endLoc, children: this._children.toJSON() || {} }; } storeToFile(filePath) { PermissionHelper_1.PermissionHelper.writeFileWithUserPermission(filePath, JSON.stringify(this, null, 2)); } static loadFromFile(filePath) { if (!fs.existsSync(filePath.toPlatformString())) { return undefined; } return ProgramStructureTree.fromJSON(fs.readFileSync(filePath.toPlatformString()).toString()); } static fromJSON(json) { return ProgramStructureTree.fromJSONWithParent(json, null); } static fromJSONWithParent(json, parent) { let data; if (typeof json === 'string') { data = JSON.parse(json); } else { data = json; } const result = new ProgramStructureTree(parent, data.id, data.type, data.identifierType, data.identifier, data.beginLoc, data.endLoc); for (const key of Object.keys(data.children)) { result.addChildren(ProgramStructureTree.fromJSON(data.children[key])); } return result; } containsLocation(loc) { const lookupKey = `${loc.line}:${loc.column}`; const cacheResult = this.containsLocationCache.get(lookupKey); if (cacheResult !== undefined) { return cacheResult; } if (loc.line >= this.beginLoc.line && loc.line <= this.endLoc.line) { if (loc.line === this.beginLoc.line && loc.column < this.beginLoc.column) { this.containsLocationCache.set(lookupKey, false); return false; } if (loc.line === this.endLoc.line && loc.column > this.endLoc.column) { this.containsLocationCache.set(lookupKey, false); return false; } this.containsLocationCache.set(lookupKey, true); return true; } this.containsLocationCache.set(lookupKey, false); return false; } identifierNodeBySourceLocation(targetLoc) { const lookupKey = `${targetLoc.line}:${targetLoc.column}`; const traverse = (identifier, currentNode) => { if (currentNode._children.size === 0) { return { identifier, node: currentNode }; } const childrenBeginLocations = currentNode.sortedChildrenKeys; let beginIndex = 0; let endIndex = currentNode._children.size - 1; let pivotIndex; while (beginIndex <= endIndex) { pivotIndex = Math.floor((beginIndex + endIndex) / 2); const pivotBeginLocation = childrenBeginLocations[pivotIndex]; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const child = currentNode._childrenByBeginLoc.get(pivotBeginLocation); const comp = ProgramStructureTree.compareNodeLocations(lookupKey, pivotBeginLocation); if (comp === 0) { return { identifier: (identifier + '.' + child.identifier), node: child }; } if (comp === -1) { endIndex = pivotIndex - 1; } else { if (child.containsLocation(targetLoc)) { return traverse((identifier + '.' + child.identifier), child); } beginIndex = pivotIndex + 1; } } return { identifier, node: currentNode }; }; if (this.containsLocation(targetLoc)) { return traverse(this.identifier, this); } if (this.type === types_1.ProgramStructureTreeType.Root) { if (targetLoc.line <= this.beginLoc.line && targetLoc.line <= this.endLoc.line) { return { // treat as root node if its before the root node identifier: this.identifier, node: this }; } } return undefined; } identifierBySourceLocation(targetLoc) { const lookupKey = `${targetLoc.line}:${targetLoc.column}`; const cacheResult = this.identifierBySourceLocationCache.get(lookupKey); if (cacheResult !== undefined) { return cacheResult; } const { identifier } = this.identifierNodeBySourceLocation(targetLoc) || { identifier: '' }; this.identifierBySourceLocationCache.set(lookupKey, identifier); return identifier; } sourceLocationOfIdentifier(identifier) { const cacheResult = this.sourceLocationOfIdentifierCache.get(identifier); if (cacheResult !== undefined) { return cacheResult; } const traverse = (identifierStack, currentNode) => { if (identifierStack[0] === currentNode.identifier) { if (identifierStack.length === 1) { return { beginLoc: currentNode.beginLoc, endLoc: currentNode.endLoc }; } const shiftedIdentifierStack = identifierStack.slice(1); for (const child of currentNode._children.values()) { const result = traverse(shiftedIdentifierStack, child); if (result) { return result; } } } return null; }; const identifierStack = SourceNodeIdentifierHelper_1.SourceNodeIdentifierHelper.split(identifier); const result = traverse(identifierStack, this); this.sourceLocationOfIdentifierCache.set(identifier, result); return result; } } exports.ProgramStructureTree = ProgramStructureTree; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZ3JhbVN0cnVjdHVyZVRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvUHJvZ3JhbVN0cnVjdHVyZVRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXdCO0FBRXhCLDJDQUF1QztBQUN2Qyx5Q0FBcUM7QUFHckMsaUVBQTZEO0FBQzdELHFGQUFpRjtBQUNqRixRQUFRO0FBQ1Isb0NBU2lCO0FBSWpCLE1BQWEsb0JBRVgsU0FBUSxxQkFBUztJQXlCbEIsWUFDQyxNQUV1QixFQUN2QixFQUFVLEVBQ1YsSUFBTyxFQUNQLGNBQThCLEVBQzlCLFVBQTJDLEVBQzNDLFFBQXNCLEVBQ3RCLE1BQW9CO1FBRXBCLEtBQUssRUFBRSxDQUFBO1FBQ1AsSUFDQyxDQUFDLHVEQUEwQixDQUFDLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxFQUN2RSxDQUFDO1lBQ0YsTUFBTSxJQUFJLEtBQUssQ0FDZCw4REFBOEQ7Z0JBQzdELFVBQVUsQ0FDWCxDQUFBO1FBQ0YsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO1FBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLG1CQUFRLENBRzNCLFFBQVEsQ0FBQyxDQUFBO1FBQ1gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFFcEMsdUJBQXVCO1FBQ3ZCLElB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