@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
107 lines • 9.47 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProgramStructureTree = void 0;
const BaseModel_1 = require("./BaseModel");
const ModelMap_1 = require("./ModelMap");
const SourceNodeMetaData_1 = require("./SourceNodeMetaData");
const memoize_1 = require("../helper/memoize");
// Types
const types_1 = require("../types");
class ProgramStructureTree extends BaseModel_1.BaseModel {
constructor(id, type, identifierType, identifier, beginLoc, endLoc) {
super();
if (!(0, SourceNodeMetaData_1.validateSourceNodeIdentifier)(identifier)) {
throw new Error('ProgramStructureTree.constructor invalid identifier format: ' + identifier);
}
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.containsLocation = (0, memoize_1.memoize)(this.containsLocation.bind(this));
this.identifierBySourceLocation = (0, memoize_1.memoize)(this.identifierBySourceLocation.bind(this));
this.sourceLocationOfIdentifier = (0, memoize_1.memoize)(this.sourceLocationOfIdentifier.bind(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() || {}
};
}
static fromJSON(json) {
let data;
if (typeof json === 'string') {
data = JSON.parse(json);
}
else {
data = json;
}
const result = new ProgramStructureTree(data.id, data.type, data.identifierType, data.identifier, data.beginLoc, data.endLoc);
for (const key of Object.keys(data.children)) {
result.children.set(key, ProgramStructureTree.fromJSON(data.children[key]));
}
return result;
}
containsLocation(loc) {
if (loc.line >= this.beginLoc.line && loc.line <= this.endLoc.line) {
if (loc.line === this.beginLoc.line && loc.column < this.beginLoc.column) {
return false;
}
if (loc.line === this.endLoc.line && loc.column > this.endLoc.column) {
return false;
}
return true;
}
return false;
}
identifierBySourceLocation(targetLoc) {
const traverse = (identifier, currentNode) => {
for (const [childIdentifier, child] of currentNode.children.entries()) {
if (child.containsLocation(targetLoc)) {
return traverse((identifier + '.' + childIdentifier), child);
}
}
return identifier;
};
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 this.identifier; // treat as root node if its before the root node
}
}
return '';
}
sourceLocationOfIdentifier(identifier) {
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 undefined;
};
const identifierStack = identifier.split('.');
return traverse(identifierStack, this);
}
}
exports.ProgramStructureTree = ProgramStructureTree;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZ3JhbVN0cnVjdHVyZVRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kZWwvUHJvZ3JhbVN0cnVjdHVyZVRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLHlDQUFxQztBQUNyQyw2REFBbUU7QUFFbkUsK0NBQTJDO0FBQzNDLFFBQVE7QUFDUixvQ0FPaUI7QUFHakIsTUFBYSxvQkFBcUIsU0FBUSxxQkFBUztJQVNsRCxZQUNDLEVBQVUsRUFDVixJQUE4QixFQUM5QixjQUE4QixFQUM5QixVQUF1QyxFQUN2QyxRQUFzQixFQUN0QixNQUFvQjtRQUVwQixLQUFLLEVBQUUsQ0FBQTtRQUNQLElBQUksQ0FBQyxJQUFBLGlEQUE0QixFQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsR0FBRyxVQUFVLENBQUMsQ0FBQTtRQUM3RixDQUFDO1FBRUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFDWixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBK0IsUUFBUSxDQUFDLENBQUE7UUFFcEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUEsaUJBQU8sRUFBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUEsaUJBQU8sRUFBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxD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