@bitloops/bl-transpiler
Version:
The one and only Bitloops Language transpiler
102 lines • 5.43 kB
JavaScript
import { BitloopsTypesMapping } from '../../../helpers/mappings.js';
import { ReturnOKErrorNodeTransformer } from './node-transformers/ReturnOkErrorNodeTransformer.js';
import { DomainEventHandlerNodeTransformer } from './node-transformers/DomainEventHandlerNodeTransformer.js';
import { IntegrationEventHandlerNodeTransformer } from './node-transformers/IntegrationEventHandlerNodeTransformer.js';
import { IntegrationEventNodeTransformer } from './node-transformers/IntegrationEventNodeTransformer.js';
import { ExecuteNodeTransformer } from './node-transformers/ExecuteNodeTransformer.js';
import { RepoPortNodeTransformer } from './node-transformers/RepoPortNodeTransformer.js';
import { ServicePortNodeTransformer } from './node-transformers/ServicePortNodeTransformer.js';
import { DomainServiceNodeTransformer } from './node-transformers/DomainServiceNodeTransformer.js';
import { IfErrorExpressionNodeTransformer } from './node-transformers/IfErrorExpressionNodeTransformer.js';
export class IntermediateASTToCompletedIntermediateASTTransformer {
complete(intermediateAST) {
const boundedContexts = this.completeCore(intermediateAST.core);
const intermediateASTSetup = intermediateAST.setup;
return {
core: boundedContexts,
setup: intermediateASTSetup,
};
}
completeCore(core) {
let boundedContexts = {};
for (const [boundedContextName, boundedContext] of Object.entries(core)) {
for (const [moduleName, ASTTree] of Object.entries(boundedContext)) {
const treeUpdated = ASTTree.copy(); // TODO implement copy method
const rootNode = treeUpdated.getRootNode();
treeUpdated.traverse(rootNode, (node) => {
const transformer = this.getNodeTransformer({
intermediateASTNode: node,
intermediateASTTree: treeUpdated,
});
if (transformer) {
transformer.run();
}
});
treeUpdated.buildValueRecursiveBottomUp(rootNode);
// Uncomment to validate parent refs and prevent bugs from model-to-model transformations
// treeUpdated.validateParentRefs();
if (!boundedContexts) {
boundedContexts = {
[boundedContextName]: {
[moduleName]: treeUpdated,
},
};
}
else if (!boundedContexts[boundedContextName]) {
boundedContexts[boundedContextName] = {
[moduleName]: treeUpdated,
};
}
else if (!boundedContexts[boundedContextName][moduleName]) {
boundedContexts[boundedContextName][moduleName] = treeUpdated;
}
}
}
return boundedContexts;
}
getNodeTransformer(factoryParams) {
const { intermediateASTNode, intermediateASTTree } = factoryParams;
const type = intermediateASTNode.getNodeType();
switch (type) {
case BitloopsTypesMapping.TIfErrorExpression: {
const ifErrorExpressionNode = intermediateASTNode;
return new IfErrorExpressionNodeTransformer(intermediateASTTree, ifErrorExpressionNode);
}
case BitloopsTypesMapping.TOkErrorReturnType: {
const returnOkErrorNode = intermediateASTNode;
return new ReturnOKErrorNodeTransformer(intermediateASTTree, returnOkErrorNode);
}
case BitloopsTypesMapping.TDomainEventHandler: {
const domainEventHandlerNode = intermediateASTNode;
return new DomainEventHandlerNodeTransformer(intermediateASTTree, domainEventHandlerNode);
}
case BitloopsTypesMapping.TIntegrationEventHandler: {
const integrationEventHandlerNode = intermediateASTNode;
return new IntegrationEventHandlerNodeTransformer(intermediateASTTree, integrationEventHandlerNode);
}
case BitloopsTypesMapping.TIntegrationEvent: {
const integrationEventNode = intermediateASTNode;
return new IntegrationEventNodeTransformer(intermediateASTTree, integrationEventNode);
}
case BitloopsTypesMapping.TExecute: {
const executeNode = intermediateASTNode;
return new ExecuteNodeTransformer(intermediateASTTree, executeNode);
}
case BitloopsTypesMapping.TRepoPort: {
const repoPortNode = intermediateASTNode;
return new RepoPortNodeTransformer(intermediateASTTree, repoPortNode);
}
case BitloopsTypesMapping.TServicePort: {
const servicePortNode = intermediateASTNode;
return new ServicePortNodeTransformer(intermediateASTTree, servicePortNode);
}
case BitloopsTypesMapping.TDomainService: {
const servicePortNode = intermediateASTNode;
return new DomainServiceNodeTransformer(intermediateASTTree, servicePortNode);
}
default:
return null;
}
}
}
//# sourceMappingURL=IntermediateASTToAST.js.map