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