GenericASTPass.cpp 1.4 KB

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