@itwin/ecschema-metadata
Version:
ECObjects core concepts in typescript
74 lines • 3.06 kB
JavaScript
/**
* The class hierarchy is a helper class that maintains the relationships between ECClasses and their base classes
* within a SchemaContext. It allows for efficient retrieval of base and derived classes based on their schema item
* keys to support lazy loaded classes properly.
* @internal
*/
export class ECClassHierarchy {
_hierarchy = new Map();
addClassEntry(classKey) {
const classEntry = { baseClasses: [], derivedClasses: [] };
this._hierarchy.set(classKey.fullName, classEntry);
return classEntry;
}
addBaseClass(classKey, baseClassKey, isMixin = false) {
const classEntry = this._hierarchy.get(classKey.fullName) ?? this.addClassEntry(classKey);
if (!classEntry.baseClasses.find((entry) => entry.baseClassKey.matches(baseClassKey))) {
classEntry.baseClasses.push({ baseClassKey, isMixin });
}
if (!isMixin) {
this.addDerivedClass(baseClassKey, classKey);
}
}
addDerivedClass(baseClassKey, classKey) {
const baseClassEntry = this._hierarchy.get(baseClassKey.fullName) ?? this.addClassEntry(baseClassKey);
if (!baseClassEntry.derivedClasses.find((derivedKey) => derivedKey.matches(classKey))) {
baseClassEntry.derivedClasses.push(classKey);
}
}
removeBaseClass(classKey, baseClassKey) {
const classEntry = this._hierarchy.get(classKey.fullName);
if (!classEntry) {
return;
}
const index = classEntry.baseClasses.findIndex((entry) => entry.baseClassKey.matches(baseClassKey));
if (index !== -1) {
classEntry.baseClasses.splice(index, 1);
}
this.removedDerivedClass(baseClassKey, classKey);
}
removedDerivedClass(baseClassKey, classKey) {
const baseClassEntry = this._hierarchy.get(baseClassKey.fullName);
if (!baseClassEntry) {
return;
}
const derivedIndex = baseClassEntry.derivedClasses.findIndex((derivedKey) => derivedKey.matches(classKey));
if (derivedIndex !== -1) {
baseClassEntry.derivedClasses.splice(derivedIndex, 1);
}
}
getBaseClassKeys(classKey) {
const classEntry = this._hierarchy.get(classKey.fullName);
if (!classEntry) {
return [];
}
const baseClassKeys = [];
for (const entry of classEntry.baseClasses) {
baseClassKeys.push(entry.baseClassKey);
baseClassKeys.push(...this.getBaseClassKeys(entry.baseClassKey));
}
return baseClassKeys;
}
getDerivedClassKeys(classKey) {
const classEntry = this._hierarchy.get(classKey.fullName);
if (!classEntry) {
return [];
}
const derivedClassKeys = [...classEntry.derivedClasses];
for (const derivedClassKey of classEntry.derivedClasses) {
derivedClassKeys.push(...this.getDerivedClassKeys(derivedClassKey));
}
return derivedClassKeys;
}
}
//# sourceMappingURL=ECClassHierarchy.js.map