UNPKG

@tripsnek/tmf

Version:

TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)

140 lines 17.6 kB
// import { EcorePackage } from './ecorepackage.js'; export class EObjectImpl { // private _eClass: EClass; _eContainer; _eContainingFeature; _eIsProxy = false; constructor() { // this._eClass = eClass!; } eClass() { return undefined; } // public setEClass(eClass: EClass) { // this._eClass = eClass; // } eContainer() { return this._eContainer; } eInverseRemove(otherEnd, featureId) { const feature = this.eClass().getEStructuralFeature(featureId); if (feature) { if (feature?.isMany()) { this.eGet(feature).remove(otherEnd); } else { this.eSet(feature, null); } } } eInverseAdd(otherEnd, featureId) { const feature = this.eClass().getEStructuralFeature(featureId); if (feature) { if (feature.isMany()) { this.eGet(feature).add(otherEnd); } else { this.eSet(feature, otherEnd); } } } // TODO: Protected is probably not right // This method is probably to be invoked by setting a containment field // This should really only be invoked by generated code! setEContainer(eContainer, containingFeatureId) { //remove from old container, if it is different const oldContainer = this.eContainer(); if (oldContainer && eContainer) { if (oldContainer !== eContainer || containingFeatureId !== this._eContainingFeature) { if (!oldContainer.eClass().getEStructuralFeature(this._eContainingFeature)?.isMany()) { if (oldContainer.eGet(this._eContainingFeature)) { oldContainer.eSet(this._eContainingFeature, null); } } else { oldContainer.eGet(this._eContainingFeature).remove(this); } } } this.eBasicSetContainer(eContainer, containingFeatureId); } eBasicSetContainer(eContainer, containingFeatureId) { this._eContainer = eContainer; this._eContainingFeature = containingFeatureId; } //================================================================================ // Serializable Id strategy fullId() { //TODO: support encoding of multiple ID attributes //if the ID attribute does not exist or is not set, return null - do not pretend there is a unique ID if (!this.eClass().getEIDAttribute()) return ''; if (!this.eClass().getEIDAttribute()) return ''; if (!this.eGet(this.eClass().getEIDAttribute())) return ''; //TODO: use full path to type rather than just class name //TODO: Can't use the one in TUtils because it creates circular import - put it somewhere else? return (this.eClass().getName() + '_' + this.eGet(this.eClass().getEIDAttribute())); } //================================================================================ // Reflection eContainingFeature() { const containerEClass = this._eContainer?.eClass(); if (containerEClass) { const containingFeature = containerEClass.getEStructuralFeature(this._eContainingFeature); return containingFeature; } return undefined; } // //TODO: What does this even mean? // public eContainmentFeature() : EStructuralFeature | undefined{ // return undefined; // } eContents() { const contents = new Array(); const containments = this.eClass().getEAllContainments(); for (let i = 0; i < containments.size(); i++) { const cref = containments.get(i); if (cref.isMany()) { const containedList = this.eGet(cref); for (let j = 0; j < containedList.size(); j++) { contents.push(containedList.get(j)); } } else if (this.eGet(cref)) contents.push(this.eGet(cref)); } return contents; } eAllContents() { let all = new Array(); all.push(this); for (const contained of this.eContents()) { all = all.concat(contained.eAllContents()); } return all; } eIsProxy() { return this._eIsProxy; } eSetProxy(proxy) { this._eIsProxy = proxy; } //================================================================================ // Generic getting/setting eGet(feature) { return undefined; } eSet(feature, value) { //do nothing } eIsSet(feature) { throw false; } eUnset(feature) { //do nothing } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW9iamVjdGltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21ldGFtb2RlbC9pbXBsL2VvYmplY3RpbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLG9EQUFvRDtBQUVwRCxNQUFNLE9BQWdCLFdBQVc7SUFDL0IsMkJBQTJCO0lBQ25CLFdBQVcsQ0FBVztJQUN0QixtQkFBbUIsQ0FBVTtJQUU3QixTQUFTLEdBQVksS0FBSyxDQUFDO0lBRW5DO1FBQ0UsMEJBQTBCO0lBQzVCLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTyxTQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELHFDQUFxQztJQUNyQywyQkFBMkI7SUFDM0IsSUFBSTtJQUVHLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxRQUFpQixFQUFFLFNBQWlCO1FBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxJQUFHLE9BQU8sRUFBQyxDQUFDO1lBQ1osSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO0lBQ0QsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFpQixFQUFFLFNBQWlCO1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxJQUFHLE9BQU8sRUFBQyxDQUFDO1lBQ1osSUFBSSxPQUFPLENBQUMsTUFB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Q2IsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVNLFNBQVMsQ0FBQyxLQUFjO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrRkFBa0Y7SUFDbEYsMEJBQTBCO0lBRW5CLElBQUksQ0FBQyxPQUFvQztRQUM5QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU0sSUFBSSxDQUFDLE9BQW9DLEVBQUUsS0FBVTtRQUMxRCxZQUFZO0lBQ2QsQ0FBQztJQUVNLE1BQU0sQ0FBQyxPQUFvQztRQUNoRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBb0M7UUFDaEQsWUFBWTtJQUNkLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVDbGFzcyB9IGZyb20gJy4uL2FwaS9lY2xhc3MuanMnO1xyXG5pbXBvcnQgeyBFU3RydWN0dXJhbEZlYXR1cmUgfSBmcm9tICcuLi9hcGkvZXN0cnVjdHVyYWwtZmVhdHVyZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBFT2JqZWN0IH0gZnJvbSAnLi4vYXBpL2VvYmplY3QuanMnO1xyXG5pbXBvcnQgeyBFQXR0cmlidXRlIH0gZnJvbSAnLi4vYXBpL2VhdHRyaWJ1dGUuanMnO1xyXG4vLyBpbXBvcnQgeyBFY29yZVBhY2thZ2UgfSBmcm9tICcuL2Vjb3JlcGFja2FnZS5qcyc7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFT2JqZWN0IHtcclxuICAvLyBwcml2YXRlIF9lQ2xhc3M6IEVDbGFzcztcclxuICBwcml2YXRlIF9lQ29udGFpbmVyITogRU9iamVjdDtcclxuICBwcml2YXRlIF9lQ29udGFpbmluZ0ZlYXR1cmUhOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2VJc1Byb3h5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIHRoaXMuX2VDbGFzcyA9IGVDbGFzcyE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZUNsYXNzKCk6IEVDbGFzcyB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkITtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBzZXRFQ2xhc3MoZUNsYXNzOiBFQ2xhc3MpIHtcclxuICAvLyAgIHRoaXMuX2VDbGFzcyA9IGVDbGFzcztcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBlQ29udGFpbmVyKCk6IEVPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VDb250YWluZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZUludmVyc2VSZW1vdmUob3RoZXJFbmQ6IEVPYmplY3QsIGZlYXR1cmVJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZUlkKTtcclxuICAgIGlmKGZlYXR1cmUpe1xyXG4gICAgaWYgKGZlYXR1cmU/LmlzTWFueSgpKSB7XHJcbiAgICAgIHRoaXMuZUdldChmZWF0dXJlKS5yZW1vdmUob3RoZXJFbmQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lU2V0KGZlYXR1cmUsIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBlSW52ZXJzZUFkZChvdGhlckVuZDogRU9iamVjdCwgZmVhdHVyZUlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlSWQpO1xyXG4gICAgaWYoZmVhdHVyZSl7XHJcbiAgICBpZiAoZmVhdHVyZS5pc01hbnkoKSkge1xyXG4gICAgICB0aGlzLmVHZXQoZmVhdHVyZSkuYWRkKG90aGVyRW5kKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZVNldChmZWF0dXJlLCBvdGhlckVuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogUHJvdGVjdGVkIGlzIHByb2JhYmx5IG5vdCByaWdodFxyXG4gIC8vIFRoaXMgbWV0aG9kIGlzIHByb2JhYmx5IHRvIGJlIGludm9rZWQgYnkgc2V0dGluZyBhIGNvbnRhaW5tZW50IGZpZWxkXHJcbiAgLy8gVGhpcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaW52b2tlZCBieSBnZW5lcmF0ZWQgY29kZSFcclxuICBwdWJsaWMgc2V0RUNvbnRhaW5lcihlQ29udGFpbmVyOiBFT2JqZWN0LCBjb250YWluaW5nRmVhdHVyZUlkOiBudW1iZXIpIHtcclxuICAgIC8vcmVtb3ZlIGZyb20gb2xkIGNvbnRhaW5lciwgaWYgaXQgaXMgZGlmZmVyZW50XHJcbiAgICBjb25zdCBvbGRDb250YWluZXIgPSB0aGlzLmVDb250YWluZXIoKTtcclxuICAgIGlmIChvbGRDb250YWluZXIgJiYgZUNvbnRhaW5lcikge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgb2xkQ29udGFpbmVyICE9PSBlQ29udGFpbmVyIHx8XHJcbiAgICAgICAgY29udGFpbmluZ0ZlYXR1cmVJZCAhPT0gdGhpcy5fZUNvbnRhaW5pbmdGZWF0dXJlXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFvbGRDb250YWluZXIuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKHRoaXMuX2VDb250YWluaW5nRmVhdHVyZSk/LmlzTWFueSgpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAob2xkQ29udGFpbmVyLmVHZXQodGhpcy5fZUNvbnRhaW5pbmdGZWF0dXJlKSkge1xyXG4gICAgICAgICAgICBvbGRDb250YWluZXIuZVNldCh0aGlzLl9lQ29udGFpbmluZ0ZlYXR1cmUsIG51bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvbGRDb250YWluZXIuZUdldCh0aGlzLl9lQ29udGFpbmluZ0ZlYXR1cmUpLnJlbW92ZSh0aGlzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZUJhc2ljU2V0Q29udGFpbmVyKGVDb250YWluZXIsIGNvbnRhaW5pbmdGZWF0dXJlSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVCYXNpY1NldENvbnRhaW5lcihcclxuICAgIGVDb250YWluZXI6IEVPYmplY3QsXHJcbiAgICBjb250YWluaW5nRmVhdHVyZUlkOiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMuX2VDb250YWluZXIgPSBlQ29udGFpbmVyO1xyXG4gICAgdGhpcy5fZUNvbnRhaW5pbmdGZWF0dXJlID0gY29udGFpbmluZ0ZlYXR1cmVJZDtcclxuICB9XHJcblxyXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBTZXJpYWxpemFibGUgSWQgc3RyYXRlZ3lcclxuXHJcbiAgZnVsbElkKCk6IHN0cmluZyB7XHJcbiAgICAvL1RPRE86IHN1cHBvcnQgZW5jb2Rpbmcgb2YgbXVsdGlwbGUgSUQgYXR0cmlidXRlc1xyXG4gICAgLy9pZiB0aGUgSUQgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBzZXQsIHJldHVybiBudWxsIC0gZG8gbm90IHByZXRlbmQgdGhlcmUgaXMgYSB1bmlxdWUgSURcclxuICAgIGlmICghdGhpcy5lQ2xhc3MoKS5nZXRFSURBdHRyaWJ1dGUoKSkgcmV0dXJuICcnO1xyXG4gICAgaWYoIXRoaXMuZUNsYXNzKCkuZ2V0RUlEQXR0cmlidXRlKCkpIHJldHVybiAnJztcclxuICAgIGlmICghdGhpcy5lR2V0KHRoaXMuZUNsYXNzKCkuZ2V0RUlEQXR0cmlidXRlKCkgYXMgRUF0dHJpYnV0ZSkpIHJldHVybiAnJztcclxuICAgIC8vVE9ETzogdXNlIGZ1bGwgcGF0aCB0byB0eXBlIHJhdGhlciB0aGFuIGp1c3QgY2xhc3MgbmFtZVxyXG4gICAgLy9UT0RPOiBDYW4ndCB1c2UgdGhlIG9uZSBpbiBUVXRpbHMgYmVjYXVzZSBpdCBjcmVhdGVzIGNpcmN1bGFyIGltcG9ydCAtIHB1dCBpdCBzb21ld2hlcmUgZWxzZT9cclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZUNsYXNzKCkuZ2V0TmFtZSgpICsgJ18nICsgdGhpcy5lR2V0KHRoaXMuZUNsYXNzKCkuZ2V0RUlEQXR0cmlidXRlKCkgYXMgRUF0dHJpYnV0ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gUmVmbGVjdGlvblxyXG5cclxuICBwdWJsaWMgZUNvbnRhaW5pbmdGZWF0dXJlKCkgOiBFU3RydWN0dXJhbEZlYXR1cmUgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyRUNsYXNzID0gdGhpcy5fZUNvbnRhaW5lcj8uZUNsYXNzKCk7XHJcbiAgICBpZihjb250YWluZXJFQ2xhc3Mpe1xyXG4gICAgICBjb25zdCBjb250YWluaW5nRmVhdHVyZSA9IGNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUodGhpcy5fZUNvbnRhaW5pbmdGZWF0dXJlKTtcclxuICAgICAgcmV0dXJuIGNvbnRhaW5pbmdGZWF0dXJlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vICAgLy9UT0RPOiBXaGF0IGRvZXMgdGhpcyBldmVuIG1lYW4/XHJcbiAgLy8gcHVibGljIGVDb250YWlubWVudEZlYXR1cmUoKSA6IEVTdHJ1Y3R1cmFsRmVhdHVyZSB8IHVuZGVmaW5lZHtcclxuICAvLyAgIHJldHVybiAgdW5kZWZpbmVkO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGVDb250ZW50cygpOiBFT2JqZWN0W10ge1xyXG4gICAgY29uc3QgY29udGVudHMgPSBuZXcgQXJyYXk8RU9iamVjdD4oKTtcclxuICAgIGNvbnN0IGNvbnRhaW5tZW50cyA9IHRoaXMuZUNsYXNzKCkuZ2V0RUFsbENvbnRhaW5tZW50cygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250YWlubWVudHMuc2l6ZSgpOyBpKyspIHtcclxuICAgICAgY29uc3QgY3JlZiA9IGNvbnRhaW5tZW50cy5nZXQoaSk7XHJcbiAgICAgIGlmIChjcmVmLmlzTWFueSgpKSB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVkTGlzdCA9IHRoaXMuZUdldChjcmVmKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lZExpc3Quc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICAgIGNvbnRlbnRzLnB1c2goY29udGFpbmVkTGlzdC5nZXQoaikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmVHZXQoY3JlZikpIGNvbnRlbnRzLnB1c2godGhpcy5lR2V0KGNyZWYpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb250ZW50cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlQWxsQ29udGVudHMoKTogRU9iamVjdFtdIHtcclxuICAgIGxldCBhbGwgPSBuZXcgQXJyYXk8RU9iamVjdD4oKTtcclxuICAgIGFsbC5wdXNoKHRoaXMpO1xyXG4gICAgZm9yIChjb25zdCBjb250YWluZWQgb2YgdGhpcy5lQ29udGVudHMoKSkge1xyXG4gICAgICBhbGwgPSBhbGwuY29uY2F0KGNvbnRhaW5lZC5lQWxsQ29udGVudHMoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVJc1Byb3h5KCk6IGJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5fZUlzUHJveHk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZVNldFByb3h5KHByb3h5OiBib29sZWFuKXtcclxuICAgIHRoaXMuX2VJc1Byb3h5ID0gcHJveHk7XHJcbiAgfVxyXG5cclxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gR2VuZXJpYyBnZXR0aW5nL3NldHRpbmdcclxuXHJcbiAgcHVibGljIGVHZXQoZmVhdHVyZTogRVN0cnVjdHVyYWxGZWF0dXJlIHwgbnVtYmVyKTogYW55IHtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZVNldChmZWF0dXJlOiBFU3RydWN0dXJhbEZlYXR1cmUgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vZG8gbm90aGluZ1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVJc1NldChmZWF0dXJlOiBFU3RydWN0dXJhbEZlYXR1cmUgfCBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRocm93IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVVbnNldChmZWF0dXJlOiBFU3RydWN0dXJhbEZlYXR1cmUgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vZG8gbm90aGluZ1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==