UNPKG

@bitloops/bl-transpiler

Version:
71 lines 3.23 kB
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