12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- /*
- * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <AK/TemporaryChange.h>
- #include "AST/AST.h"
- #include "Compiler/GenericASTPass.h"
- #include "Function.h"
- namespace JSSpecCompiler {
- void RecursiveASTVisitor::run_in_const_subtree(NullableTree nullable_tree)
- {
- if (nullable_tree) {
- auto tree = nullable_tree.release_nonnull();
- auto tree_copy = tree;
- NodeSubtreePointer pointer { &tree };
- recurse(tree, pointer);
- VERIFY(tree == tree_copy);
- }
- }
- void RecursiveASTVisitor::run_in_subtree(Tree& tree)
- {
- NodeSubtreePointer pointer { &tree };
- recurse(tree, pointer);
- }
- void RecursiveASTVisitor::replace_current_node_with(NullableTree tree)
- {
- m_current_subtree_pointer->replace_subtree({}, move(tree));
- }
- RecursionDecision RecursiveASTVisitor::recurse(Tree root, NodeSubtreePointer& pointer)
- {
- TemporaryChange change { m_current_subtree_pointer, &pointer };
- RecursionDecision decision = on_entry(root);
- root = pointer.get({});
- if (decision == RecursionDecision::Recurse) {
- for (auto& child : root->subtrees()) {
- if (recurse(child.get({}), child) == RecursionDecision::Break)
- return RecursionDecision::Break;
- }
- }
- on_leave(root);
- return RecursionDecision::Continue;
- }
- void GenericASTPass::process_function()
- {
- run_in_subtree(m_function->m_ast);
- }
- }
|