@bitloops/bl-transpiler
Version:
The one and only Bitloops Language transpiler
71 lines • 3.23 kB
JavaScript
import BitloopsVisitor from './BitloopsVisitor/BitloopsVisitor.js';
import { IntermediateASTToCompletedIntermediateASTTransformer } from './intermediate-ast/IntermediateASTToAST.js';
export class IntermediateASTParser {
intermediateASTTransformer;
constructor() {
this.intermediateASTTransformer = new IntermediateASTToCompletedIntermediateASTTransformer();
}
parse(ast) {
const intermediateAST = this.originalASTToIntermediateASTTree(ast);
return intermediateAST;
}
complete(intermediateAST) {
const completedASTTree = this.completeIntermediateASTTree(intermediateAST);
return completedASTTree;
}
originalASTToIntermediateASTTree(ast) {
const intermediateASTCoreTree = this.originalASTCoreToIntermediateASTTree(ast.core);
if (!ast.setup) {
return {
core: intermediateASTCoreTree,
};
}
const intermediateASTSetupTree = this.originalASTSetupToIntermediateASTTree(ast.setup);
return {
core: intermediateASTCoreTree,
setup: intermediateASTSetupTree,
};
}
originalASTSetupToIntermediateASTTree(astSetup) {
const setupAST = {};
for (const [fileId, ASTData] of Object.entries(astSetup)) {
const bitloopsVisitor = new BitloopsVisitor(fileId);
bitloopsVisitor.visit(ASTData.ASTContext);
const { intermediateASTTree } = bitloopsVisitor;
setupAST[fileId] = intermediateASTTree;
}
return setupAST;
}
originalASTCoreToIntermediateASTTree(astCore) {
const boundedContexts = {};
for (const [boundedContextName, boundedContext] of Object.entries(astCore)) {
for (const [moduleName, module] of Object.entries(boundedContext)) {
for (const [fileId, ASTData] of Object.entries(module)) {
const contextInfo = { boundedContextName, moduleName };
const bitloopsVisitor = new BitloopsVisitor(fileId, contextInfo);
bitloopsVisitor.visit(ASTData.ASTContext);
const { intermediateASTTree } = bitloopsVisitor;
if (boundedContexts[boundedContextName] === undefined) {
boundedContexts[boundedContextName] = {
[moduleName]: intermediateASTTree,
};
}
else if (boundedContexts[boundedContextName][moduleName] === undefined) {
boundedContexts[boundedContextName][moduleName] = intermediateASTTree;
}
else {
// merge trees
const existingTree = boundedContexts[boundedContextName][moduleName];
boundedContexts[boundedContextName][moduleName] =
existingTree.mergeWithTree(intermediateASTTree);
}
}
}
}
return boundedContexts;
}
completeIntermediateASTTree(intermediateAST) {
return this.intermediateASTTransformer.complete(intermediateAST);
}
}
//# sourceMappingURL=index.js.map