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

107 lines 9.47 kB
"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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