@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
174 lines • 15.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PathIndex = void 0;
const SourceNodeIndex_1 = require("./SourceNodeIndex");
const BaseModel_1 = require("../BaseModel");
const ModelMap_1 = require("../ModelMap");
const UnifiedPath_1 = require("../../system/UnifiedPath");
const SourceNodeRegex_1 = require("../../constants/SourceNodeRegex");
// Types
const types_1 = require("../../types");
class PathIndex extends BaseModel_1.BaseModel {
constructor(identifier, moduleIndex, id) {
super();
this.identifier = identifier;
this.moduleIndex = moduleIndex;
this._id = id;
this.sourceNodeMap = new ModelMap_1.ModelMap('string');
this.reverseSourceNodeMap = new ModelMap_1.ModelMap('number');
}
get containsUncommittedChanges() {
return this._containsUncommittedChanges === undefined ? false : true;
}
set containsUncommittedChanges(v) {
this._containsUncommittedChanges = v === true ? true : undefined;
}
insertToOtherIndex(globalIndex) {
const newModuleIndex = this.moduleIndex.insertToOtherIndex(globalIndex);
return newModuleIndex.getFilePathIndex('upsert', this.identifier);
}
toBuffer() {
throw new Error('PathIndex.toBuffer: not yet implemented');
}
sourceNodeIDs() {
return Array.from(this.reverseSourceNodeMap.keys());
}
addToSourceNodeMap(sourceNodeIndex) {
this.sourceNodeMap.set(sourceNodeIndex.identifier, sourceNodeIndex);
this.reverseSourceNodeMap.set(sourceNodeIndex.id, sourceNodeIndex);
}
set id(id) {
this._id = id;
}
get id() {
return this._id;
}
get pathId() {
return this._id;
}
selfAssignId() {
this.id = this.moduleIndex.globalIndex.newId(this, 'path');
this.moduleIndex.addToPathMap(this);
}
toJSON() {
var _a, _b;
const containsUncommittedChanges = this.containsUncommittedChanges ? { cucc: true } : {};
return Object.assign({ id: this._id, children: (_a = this.children) === null || _a === void 0 ? void 0 : _a.toJSON(), file: (_b = this.file) === null || _b === void 0 ? void 0 : _b.toJSON() }, containsUncommittedChanges);
}
static fromJSON(json, pathParts, moduleIndex) {
let data;
if (typeof json === 'string') {
data = JSON.parse(json);
}
else {
data = json;
}
let identifier;
if (pathParts[0] === '' || SourceNodeRegex_1.LangInternalPathRegex.test(pathParts[0])) {
identifier = pathParts.join('/');
}
else {
identifier = UnifiedPath_1.UnifiedPath.fromPathParts(pathParts).toString();
}
const result = new PathIndex(identifier, moduleIndex);
result._id = data.id;
result.containsUncommittedChanges = data.cucc === undefined ? false : true;
if (data.children) {
result.children = new ModelMap_1.ModelMap('string');
for (const key of Object.keys(data.children)) {
result.children.set(key, PathIndex.fromJSON(data.children[key], [...pathParts, key], moduleIndex));
}
}
if (data.file) {
result.file = new ModelMap_1.ModelMap('string');
for (const key of Object.keys(data.file)) {
result.file.set(key, SourceNodeIndex_1.SourceNodeIndex.fromJSON(data.file[key], [key], result, data.file[key].id === undefined ?
types_1.SourceNodeIndexType.Intermediate :
types_1.SourceNodeIndexType.SourceNode));
}
}
const id = result._id;
if (id !== undefined) {
moduleIndex.addToPathMap(result);
moduleIndex.globalIndex.setReverseIndex(id, result, 'path');
}
return result;
}
getSourceNodeIndex(indexRequestType, sourceNodeIdentifier) {
const indexFromSourceNodeMap = this.sourceNodeMap.get(sourceNodeIdentifier);
if (indexFromSourceNodeMap !== undefined) {
return indexFromSourceNodeMap;
}
let currentSourceNodeIndex;
let currentSourceNodeMap = this.file;
if (sourceNodeIdentifier[0] && sourceNodeIdentifier[0] === '{') {
// case SourceNodeIdentifier {}.{}...
const sourceNodeIdentifierParts = sourceNodeIdentifier.split('.');
for (let i = 0; i < sourceNodeIdentifierParts.length; i++) {
let sourceNodeIndex = currentSourceNodeMap.get(sourceNodeIdentifierParts[i]);
if (sourceNodeIndex === undefined) {
switch (indexRequestType) {
case 'get':
return undefined;
case 'upsert':
sourceNodeIndex = new SourceNodeIndex_1.SourceNodeIndex(sourceNodeIdentifierParts.slice(0, i + 1).join('.'), this, types_1.SourceNodeIndexType.Intermediate);
currentSourceNodeMap.set(sourceNodeIdentifierParts[i], sourceNodeIndex);
break;
default:
return undefined;
}
}
if (i === sourceNodeIdentifierParts.length - 1) {
if (sourceNodeIndex.id === undefined) {
switch (indexRequestType) {
case 'get':
return undefined;
case 'upsert':
sourceNodeIndex.type = types_1.SourceNodeIndexType.SourceNode;
sourceNodeIndex.selfAssignId();
break;
default:
return undefined;
}
}
currentSourceNodeIndex = sourceNodeIndex;
}
else {
if (sourceNodeIndex.children === undefined) {
switch (indexRequestType) {
case 'get':
return undefined;
case 'upsert':
sourceNodeIndex.children = new ModelMap_1.ModelMap('string');
break;
default:
return undefined;
}
}
currentSourceNodeMap = sourceNodeIndex.children;
}
}
}
else {
// case RegExp:
currentSourceNodeIndex = currentSourceNodeMap.get(sourceNodeIdentifier);
if (currentSourceNodeIndex === undefined) {
let sourceNodeIndex;
switch (indexRequestType) {
case 'get':
return undefined;
case 'upsert':
sourceNodeIndex = new SourceNodeIndex_1.SourceNodeIndex(sourceNodeIdentifier, this, types_1.SourceNodeIndexType.SourceNode);
break;
default:
return undefined;
}
currentSourceNodeIndex = sourceNodeIndex;
currentSourceNodeMap.set(sourceNodeIdentifier, sourceNodeIndex);
}
}
return currentSourceNodeIndex;
}
}
exports.PathIndex = PathIndex;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aEluZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21vZGVsL2luZGV4L1BhdGhJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBbUQ7QUFJbkQsNENBQXdDO0FBQ3hDLDBDQUFzQztBQUV0QywwREFBc0Q7QUFDdEQscUVBQXVFO0FBQ3ZFLFFBQVE7QUFDUix1Q0FTb0I7QUFDcEIsTUFBYSxTQUFVLFNBQVEscUJBQVM7SUFldkMsWUFDQyxVQUF3RCxFQUN4RCxXQUF3QixFQUN4QixFQUFrQjtRQUVsQixLQUFLLEVBQUUsQ0FBQTtRQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFBO1FBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLG1CQUFRLENBRWdCLFFBQVEsQ0FBQyxDQUFBO1FBRTFELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG1CQUFRLENBRVMsUUFBUSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUdELElBQVcsMEJBQTBCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDckUsQ0FBQztJQUVELElBQVcsMEJBQTBCLENBQUMsQ0FBVTtRQUMvQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDakUsQ0FBQztJQUVELGtCQUFrQixDQUFDLFdBQXdCO1FBQzFDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDdkUsT0FBTyxjQUFjLENBQUMsZ0JBQWdCLENB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