GenericASTPass.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/TemporaryChange.h>
  7. #include "AST/AST.h"
  8. #include "Compiler/GenericASTPass.h"
  9. #include "Function.h"
  10. namespace JSSpecCompiler {
  11. void RecursiveASTVisitor::run_in_const_subtree(NullableTree nullable_tree)
  12. {
  13. if (nullable_tree) {
  14. auto tree = nullable_tree.release_nonnull();
  15. auto tree_copy = tree;
  16. NodeSubtreePointer pointer { &tree };
  17. recurse(tree, pointer);
  18. VERIFY(tree == tree_copy);
  19. }
  20. }
  21. void RecursiveASTVisitor::run_in_subtree(Tree& tree)
  22. {
  23. NodeSubtreePointer pointer { &tree };
  24. recurse(tree, pointer);
  25. }
  26. void RecursiveASTVisitor::replace_current_node_with(NullableTree tree)
  27. {
  28. m_current_subtree_pointer->replace_subtree({}, move(tree));
  29. }
  30. RecursionDecision RecursiveASTVisitor::recurse(Tree root, NodeSubtreePointer& pointer)
  31. {
  32. TemporaryChange change { m_current_subtree_pointer, &pointer };
  33. RecursionDecision decision = on_entry(root);
  34. root = pointer.get({});
  35. if (decision == RecursionDecision::Recurse) {
  36. for (auto& child : root->subtrees()) {
  37. if (recurse(child.get({}), child) == RecursionDecision::Break)
  38. return RecursionDecision::Break;
  39. }
  40. }
  41. on_leave(root);
  42. return RecursionDecision::Continue;
  43. }
  44. void GenericASTPass::process_function()
  45. {
  46. run_in_subtree(m_function->m_ast);
  47. }
  48. }