UNPKG

leds-spark-lib

Version:

Biblioteca de geração de código

65 lines 2.63 kB
import path from "path"; import fs from "fs"; import { isLocalEntity, isModule, isModuleImport, getRef, toString, processRelations } from "../../../../models/model.js"; import { generateModel } from "./model-generator.js"; export function generate(model, target_folder) { const modules = model.abstractElements.filter(isModule); const all_entities = modules.map(module => module.elements.filter(isLocalEntity)).flat(); const relation_maps = processRelations(all_entities); const imported_entities = processImportedEntities(model); for (const mod of modules) { const package_name = `${model.configuration?.name}`; const supertype_classes = processSupertypes(mod); const mod_classes = mod.elements.filter(isLocalEntity); for (const cls of mod_classes) { const class_name = cls.name; const { attributes, relations } = getAttrsAndRelations(cls, relation_maps); attributes; fs.writeFileSync(path.join(target_folder, `${class_name}.cs`), toString(generateModel(cls, supertype_classes.has(cls), relations, package_name, imported_entities))); if (!cls.is_abstract) { } } } } function processImportedEntities(application) { const map = new Map(); for (const moduleImport of application.abstractElements.filter(isModuleImport)) { moduleImport.entities.map(importedEntity => map.set(importedEntity, moduleImport)); } return map; } /** * Dado um módulo, retorna todos as classes dele que são usadas como Superclasses */ function processSupertypes(mod) { const set = new Set(); for (const cls of mod.elements.filter(isLocalEntity)) { const superType = getRef(cls.superType); if (superType && isLocalEntity(superType)) { set.add(superType); } } return set; } /** * Retorna todos os atributos e relações de uma Class, incluindo a de seus supertipos */ function getAttrsAndRelations(cls, relation_map) { // Se tem superclasse, puxa os atributos e relações da superclasse const superType = getRef(cls.superType); if (superType && isLocalEntity(superType)) { const parent = superType; const { attributes, relations } = getAttrsAndRelations(parent, relation_map); return { attributes: attributes.concat(cls.attributes), relations: relations.concat(relation_map.get(cls) ?? []) }; } else { return { attributes: cls.attributes, relations: relation_map.get(cls) ?? [] }; } } //# sourceMappingURL=generate.js.map