@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
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 () {
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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