import * as babelparser from "@babel/parser"; import traverse from "@babel/traverse"; import * as t from "@babel/types"; import { PairedNodes } from "../matcher/matcher"; export class TreeNode { public parent: TreeNode | null; public element: T; public children: TreeNode[] = []; constructor(parent: TreeNode | null, element: T) { this.parent = parent; this.element = element; if (this.parent) this.parent.children.push(this); } } export const makeTree = ( ast: babelparser.ParseResult ): TreeNode | undefined => { let last: TreeNode | null = null; let first: TreeNode | null = null; traverse(ast, { enter(path: any) { let node: TreeNode = new TreeNode( last, path.node as t.Node ); if (last == null) { first = node; } last = node; }, exit(path: any) { if (last && last?.element?.type != "Program") { last = last.parent; } }, }); if (first != null) { return first; } }; export const showTree = (tree: TreeNode, idents: number = 0) => { console.log(" ".repeat(idents) + tree.element?.type); tree.children.forEach((child) => { showTree(child, idents + 1); }); }; export const showTreePaired = ( tree: TreeNode, idents: number = 0 ) => { console.log( " ".repeat(idents), tree.element.aplToNode.type, tree.element.codeNode.type ); tree.children.forEach((child) => { showTreePaired(child, idents + 1); }); };