UNPKG

@tripsnek/tmf

Version:

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

134 lines (129 loc) 15.3 kB
import { TGenUtils as DU } from './tgen-utils.js'; import { EClassImpl } from '../metamodel/impl/eclass-impl.js'; /** * Generates *-factory.ts files, which provide static access to * methods for instantiating data objects for a TMF model. */ export class TGeneratorFactory { rootPackage; /** * Single public static method for generating a XXXFactory class. * @param pkg */ generateFactoryContents(pkg) { //build path to root package initializer const pathToRoot = DU.getPathToRoot(pkg); this.rootPackage = pkg; while (this.rootPackage.getESuperPackage()) this.rootPackage = this.rootPackage.getESuperPackage(); const pkgClassName = DU.genPackageClassName(pkg); const factClassName = DU.genFactoryClassName(pkg); return `import { EObject } from '@tripsnek/tmf'; import { EClass } from '@tripsnek/tmf'; import { EFactory } from '@tripsnek/tmf'; import { ${pkgClassName} } from './${DU.genPackageFileName(pkg)}.js'; ${this.genSpecificImports(pkg)} import { PackageRegistry } from '${pathToRoot}package-registry.js'; export class ${factClassName} implements EFactory { ${this.genSingleton(pkg)} ${this.genCreateSwitch(pkg)} ${this.genClassCreators(pkg)} } // Register this factory class with the package registry PackageRegistry.registerFactoryClass('${pkg.getName()}', () => ${factClassName}); `; } //====================================================================== // Private helper methods /** * Generate a specific set of imports for the interfaces and Impl classes in * this model. * @param pkg */ genSpecificImports(pkg) { const pkgClassName = DU.genPackageClassName(pkg); let result = ''; if (!(pkgClassName === 'EcorePackage')) { for (const eClass of pkg.getEClassifiers()) { if (eClass instanceof EClassImpl && !eClass.isAbstract()) { result += ` import { ${eClass.getName()} } from './api/${DU.genClassApiName(eClass)}.js'; import { ${eClass.getName()}Impl } from './impl/${DU.genClassImplName(eClass)}.js';`; } } } return result; } /** * Generate the singleton eINSTANCE for this model's factory class. * @param pkg */ genSingleton(pkg) { const className = DU.genFactoryClassName(pkg); const pkgClassName = DU.genPackageClassName(pkg); return ` /* Singleton */ public static _eINSTANCE: ${className} = ${className}.init(); public static init(): ${className} { if (!${className}._eINSTANCE) { ${className}._eINSTANCE = new ${className}(); } return ${className}._eINSTANCE; } static get eINSTANCE(): ${className} { ${pkgClassName}.eINSTANCE; // Ensure package is initialized ${pkgClassName}.registerFactory(this._eINSTANCE); // Register this factory with the package return this._eINSTANCE; } `; } /** * Generate the generic create() method for this factory that switches on * EClass to call the right specific creator method. * @param pkg */ genCreateSwitch(pkg) { const pkgClassName = DU.genPackageClassName(pkg); let result = ''; if (!(pkgClassName === 'EcorePackage')) { result += ` public create(eClass: EClass): EObject { switch (eClass.getClassifierId()) {`; for (const eClass of pkg.getEClassifiers()) { if (eClass instanceof EClassImpl && !eClass.isAbstract()) { const classCreatorName = 'create' + eClass.getName(); result += ` case ${pkgClassName}.${DU.genClassIdFieldName(eClass)}: return this.${classCreatorName}();`; } } result += ` default: throw new Error( "The class '" + eClass.getName() + "' is not a valid classifier" ); } }`; } return result; } /** * Generate all the class-specific createXXX() methods. * @param pkg */ genClassCreators(pkg) { const pkgClassName = DU.genPackageClassName(pkg); let result = ''; if (!(pkgClassName === 'EcorePackage')) { for (const eClass of pkg.getEClassifiers()) { if (eClass instanceof EClassImpl && !eClass.isAbstract()) { result += ` public create${eClass.getName()}(): ${eClass.getName()} { return new ${eClass.getName()}Impl(); }`; } } } return result; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGdlbmVyYXRvci1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb3VyY2UtZ2VuZXJhdG9ycy90Z2VuZXJhdG9yLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFNBQVMsSUFBSSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixXQUFXLENBQVk7SUFFdkI7OztPQUdHO0lBQ0ksdUJBQXVCLENBQUMsR0FBYTtRQUUxQyx3Q0FBd0M7UUFDeEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUN2QixPQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVsRyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxELE9BQU87OztXQUdBLFlBQVksY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDO0VBQzdELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7bUNBQ0ssVUFBVTs7ZUFFOUIsYUFBYTtFQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztFQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztFQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDOzs7Ozt3Q0FL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QUFNLENBQUMsT0FBTyxFQUFFO2lCQUN2QyxNQUFNLENBQUMsT0FBTyxFQUFFO0lBQzdCLENBQUM7Z0JBQ0csQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVBhY2thZ2UgfSBmcm9tICcuLi9tZXRhbW9kZWwvYXBpL2VwYWNrYWdlLmpzJztcclxuaW1wb3J0IHsgRUNsYXNzIH0gZnJvbSAnLi4vbWV0YW1vZGVsL2FwaS9lY2xhc3MuanMnO1xyXG5pbXBvcnQgeyBUR2VuVXRpbHMgYXMgRFUgfSBmcm9tICcuL3RnZW4tdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBFQ2xhc3NJbXBsIH0gZnJvbSAnLi4vbWV0YW1vZGVsL2ltcGwvZWNsYXNzLWltcGwuanMnO1xyXG5pbXBvcnQgeyBUR2VuZXJhdG9yUGFja2FnZUluaXRpYWxpemVyIH0gZnJvbSAnLi90Z2VuZXJhdG9yLXBhY2thZ2UtaW5pdGlhbGl6ZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyAqLWZhY3RvcnkudHMgZmlsZXMsIHdoaWNoIHByb3ZpZGUgc3RhdGljIGFjY2VzcyB0b1xyXG4gKiBtZXRob2RzIGZvciBpbnN0YW50aWF0aW5nIGRhdGEgb2JqZWN0cyBmb3IgYSBUTUYgbW9kZWwuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVEdlbmVyYXRvckZhY3Rvcnkge1xyXG5cclxuICByb290UGFja2FnZSE6IEVQYWNrYWdlO1xyXG5cclxuICAvKipcclxuICAgKiBTaW5nbGUgcHVibGljIHN0YXRpYyBtZXRob2QgZm9yIGdlbmVyYXRpbmcgYSBYWFhGYWN0b3J5IGNsYXNzLlxyXG4gICAqIEBwYXJhbSBwa2dcclxuICAgKi9cclxuICBwdWJsaWMgZ2VuZXJhdGVGYWN0b3J5Q29udGVudHMocGtnOiBFUGFja2FnZSk6IHN0cmluZyB7XHJcblxyXG4gICAgLy9idWlsZCBwYXRoIHRvIHJvb3QgcGFja2FnZSBpbml0aWFsaXplclxyXG4gICAgY29uc3QgcGF0aFRvUm9vdCA9IERVLmdldFBhdGhUb1Jvb3QocGtnKTtcclxuXHJcbiAgICB0aGlzLnJvb3RQYWNrYWdlID0gcGtnO1xyXG4gICAgd2hpbGUodGhpcy5yb290UGFja2FnZS5nZXRFU3VwZXJQYWNrYWdlKCkpIHRoaXMucm9vdFBhY2thZ2UgPSB0aGlzLnJvb3RQYWNrYWdlLmdldEVTdXBlclBhY2thZ2UoKTtcclxuXHJcbiAgICBjb25zdCBwa2dDbGFzc05hbWUgPSBEVS5nZW5QYWNrYWdlQ2xhc3NOYW1lKHBrZyk7XHJcbiAgICBjb25zdCBmYWN0Q2xhc3NOYW1lID0gRFUuZ2VuRmFjdG9yeUNsYXNzTmFtZShwa2cpO1xyXG5cclxuICAgIHJldHVybiBgaW1wb3J0IHsgRU9iamVjdCB9IGZyb20gJ0B0cmlwc25lay90bWYnO1xyXG5pbXBvcnQgeyBFQ2xhc3MgfSBmcm9tICdAdHJpcHNuZWsvdG1mJztcclxuaW1wb3J0IHsgRUZhY3RvcnkgfSBmcm9tICdAdHJpcHNuZWsvdG1mJztcclxuaW1wb3J0IHsgJHtwa2dDbGFzc05hbWV9IH0gZnJvbSAnLi8ke0RVLmdlblBhY2thZ2VGaWxlTmFtZShwa2cpfS5qcyc7XHJcbiR7dGhpcy5nZW5TcGVjaWZpY0ltcG9ydHMocGtnKX1cclxuaW1wb3J0IHsgUGFja2FnZVJlZ2lzdHJ5IH0gZnJvbSAnJHtwYXRoVG9Sb290fXBhY2thZ2UtcmVnaXN0cnkuanMnO1xyXG5cclxuZXhwb3J0IGNsYXNzICR7ZmFjdENsYXNzTmFtZX0gaW1wbGVtZW50cyBFRmFjdG9yeSB7XHJcbiR7dGhpcy5nZW5TaW5nbGV0b24ocGtnKX1cclxuJHt0aGlzLmdlbkNyZWF0ZVN3aXRjaChwa2cpfVxyXG4ke3RoaXMuZ2VuQ2xhc3NDcmVhdG9ycyhwa2cpfVxyXG59XHJcblxyXG5cclxuLy8gUmVnaXN0ZXIgdGhpcyBmYWN0b3J5IGNsYXNzIHdpdGggdGhlIHBhY2thZ2UgcmVnaXN0cnlcclxuUGFja2FnZVJlZ2lzdHJ5LnJlZ2lzdGVyRmFjdG9yeUNsYXNzKCcke3BrZy5nZXROYW1lKCl9JywgKCkgPT4gJHtmYWN0Q2xhc3NOYW1lfSk7XHJcbmA7XHJcbiAgfVxyXG5cclxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBQcml2YXRlIGhlbHBlciBtZXRob2RzXHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgc3BlY2lmaWMgc2V0IG9mIGltcG9ydHMgZm9yIHRoZSBpbnRlcmZhY2VzIGFuZCBJbXBsIGNsYXNzZXMgaW5cclxuICAgKiB0aGlzIG1vZGVsLlxyXG4gICAqIEBwYXJhbSBwa2dcclxuICAgKi9cclxuICBwcml2YXRlIGdlblNwZWNpZmljSW1wb3J0cyhwa2c6IEVQYWNrYWdlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBrZ0NsYXNzTmFtZSA9IERVLmdlblBhY2thZ2VDbGFzc05hbWUocGtnKTtcclxuICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgIGlmICghKHBrZ0NsYXNzTmFtZSA9PT0gJ0Vjb3JlUGFja2FnZScpKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZUNsYXNzIG9mIHBrZy5nZXRFQ2xhc3NpZmllcnMoKSkge1xyXG4gICAgICAgIGlmIChlQ2xhc3MgaW5zdGFuY2VvZiBFQ2xhc3NJbXBsICYmICFlQ2xhc3MuaXNBYnN0cmFjdCgpKSB7XHJcbiAgICAgICAgICByZXN1bHQgKz0gYFxyXG5pbXBvcnQgeyAke2VDbGFzcy5nZXROYW1lKCl9IH0gZnJvbSAnLi9hcGkvJHtEVS5nZW5DbGFzc0FwaU5hbWUoXHJcbiAgICAgICAgICAgIGVDbGFzc1xyXG4gICAgICAgICAgKX0uanMnO1xyXG5pbXBvcnQgeyAke2VDbGFzcy5nZXROYW1lKCl9SW1wbCB9IGZyb20gJy4vaW1wbC8ke0RVLmdlbkNsYXNzSW1wbE5hbWUoXHJcbiAgICAgICAgICAgIGVDbGFzc1xyXG4gICAgICAgICAgKX0uanMnO2A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgdGhlIHNpbmdsZXRvbiBlSU5TVEFOQ0UgZm9yIHRoaXMgbW9kZWwncyBmYWN0b3J5IGNsYXNzLlxyXG4gICAqIEBwYXJhbSBwa2dcclxuICAgKi9cclxuICBwcml2YXRlIGdlblNpbmdsZXRvbihwa2c6IEVQYWNrYWdlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IERVLmdlbkZhY3RvcnlDbGFzc05hbWUocGtnKTtcclxuICAgIGNvbnN0IHBrZ0NsYXNzTmFtZSA9IERVLmdlblBhY2thZ2VDbGFzc05hbWUocGtnKTtcclxuICAgIHJldHVybiBgICAvKiBTaW5nbGV0b24gKi9cclxuICBwdWJsaWMgc3RhdGljIF9lSU5TVEFOQ0U6ICR7Y2xhc3NOYW1lfSA9ICR7Y2xhc3NOYW1lfS5pbml0KCk7XHJcbiAgcHVibGljIHN0YXRpYyBpbml0KCk6ICR7Y2xhc3NOYW1lfSB7XHJcbiAgICBpZiAoISR7Y2xhc3NOYW1lfS5fZUlOU1RBTkNFKSB7XHJcbiAgICAgICR7Y2xhc3NOYW1lfS5fZUlOU1RBTkNFID0gbmV3ICR7Y2xhc3NOYW1lfSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAke2NsYXNzTmFtZX0uX2VJTlNUQU5DRTtcclxuICB9XHJcbiAgXHJcbiAgc3RhdGljIGdldCBlSU5TVEFOQ0UoKTogJHtjbGFzc05hbWV9IHtcclxuICAgICR7cGtnQ2xhc3NOYW1lfS5lSU5TVEFOQ0U7IC8vIEVuc3VyZSBwYWNrYWdlIGlzIGluaXRpYWxpemVkXHJcbiAgICAke3BrZ0NsYXNzTmFtZX0ucmVnaXN0ZXJGYWN0b3J5KHRoaXMuX2VJTlNUQU5DRSk7IC8vIFJlZ2lzdGVyIHRoaXMgZmFjdG9yeSB3aXRoIHRoZSBwYWNrYWdlXHJcbiAgICByZXR1cm4gdGhpcy5fZUlOU1RBTkNFO1xyXG4gIH1cclxuICBgO1xyXG4gIFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgdGhlIGdlbmVyaWMgY3JlYXRlKCkgbWV0aG9kIGZvciB0aGlzIGZhY3RvcnkgdGhhdCBzd2l0Y2hlcyBvblxyXG4gICAqIEVDbGFzcyB0byBjYWxsIHRoZSByaWdodCBzcGVjaWZpYyBjcmVhdG9yIG1ldGhvZC5cclxuICAgKiBAcGFyYW0gcGtnXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5DcmVhdGVTd2l0Y2gocGtnOiBFUGFja2FnZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwa2dDbGFzc05hbWUgPSBEVS5nZW5QYWNrYWdlQ2xhc3NOYW1lKHBrZyk7XHJcbiAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICBpZiAoIShwa2dDbGFzc05hbWUgPT09ICdFY29yZVBhY2thZ2UnKSkge1xyXG4gICAgICByZXN1bHQgKz0gYFxyXG4gIHB1YmxpYyBjcmVhdGUoZUNsYXNzOiBFQ2xhc3MpOiBFT2JqZWN0IHtcclxuICAgIHN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJZCgpKSB7YDtcclxuICAgICAgZm9yIChjb25zdCBlQ2xhc3Mgb2YgcGtnLmdldEVDbGFzc2lmaWVycygpKSB7XHJcbiAgICAgICAgaWYgKGVDbGFzcyBpbnN0YW5jZW9mIEVDbGFzc0ltcGwgJiYgIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHtcclxuICAgICAgICAgIGNvbnN0IGNsYXNzQ3JlYXRvck5hbWUgPSAnY3JlYXRlJyArIGVDbGFzcy5nZXROYW1lKCk7XHJcbiAgICAgICAgICByZXN1bHQgKz0gYFxyXG4gICAgICBjYXNlICR7cGtnQ2xhc3NOYW1lfS4ke0RVLmdlbkNsYXNzSWRGaWVsZE5hbWUoZUNsYXNzKX06XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJHtjbGFzc0NyZWF0b3JOYW1lfSgpO2A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCArPSBgXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgXCJUaGUgY2xhc3MgJ1wiICsgZUNsYXNzLmdldE5hbWUoKSArIFwiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyXCJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gIH1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGFsbCB0aGUgY2xhc3Mtc3BlY2lmaWMgY3JlYXRlWFhYKCkgbWV0aG9kcy5cclxuICAgKiBAcGFyYW0gcGtnXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5DbGFzc0NyZWF0b3JzKHBrZzogRVBhY2thZ2UpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGtnQ2xhc3NOYW1lID0gRFUuZ2VuUGFja2FnZUNsYXNzTmFtZShwa2cpO1xyXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgaWYgKCEocGtnQ2xhc3NOYW1lID09PSAnRWNvcmVQYWNrYWdlJykpIHtcclxuICAgICAgZm9yIChjb25zdCBlQ2xhc3Mgb2YgcGtnLmdldEVDbGFzc2lmaWVycygpKSB7XHJcbiAgICAgICAgaWYgKGVDbGFzcyBpbnN0YW5jZW9mIEVDbGFzc0ltcGwgJiYgIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHtcclxuICAgICAgICAgIHJlc3VsdCArPSBgXHJcbiAgcHVibGljIGNyZWF0ZSR7ZUNsYXNzLmdldE5hbWUoKX0oKTogJHtlQ2xhc3MuZ2V0TmFtZSgpfSB7XHJcbiAgICByZXR1cm4gbmV3ICR7ZUNsYXNzLmdldE5hbWUoKX1JbXBsKCk7XHJcbiAgfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufSJdfQ==