@tripsnek/tmf
Version:
TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)
140 lines • 17.6 kB
JavaScript
// 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==