UNPKG

@itwin/ecschema-metadata

Version:

ECObjects core concepts in typescript

74 lines 3.06 kB
/** * 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