AST.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "AST/AST.h"
  7. namespace JSSpecCompiler {
  8. Tree NodeSubtreePointer::get(Badge<RecursiveASTVisitor>)
  9. {
  10. return m_tree_ptr.visit(
  11. [&](NullableTree* nullable_tree) -> Tree {
  12. NullableTree copy = *nullable_tree;
  13. return copy.release_nonnull();
  14. },
  15. [&](Tree* tree) -> Tree {
  16. return *tree;
  17. });
  18. }
  19. void NodeSubtreePointer::replace_subtree(Badge<RecursiveASTVisitor>, NullableTree replacement)
  20. {
  21. m_tree_ptr.visit(
  22. [&](NullableTree* nullable_tree) {
  23. *nullable_tree = replacement;
  24. },
  25. [&](Tree* tree) {
  26. *tree = replacement.release_nonnull();
  27. });
  28. }
  29. Vector<NodeSubtreePointer> BinaryOperation::subtrees()
  30. {
  31. return { { &m_left }, { &m_right } };
  32. }
  33. Vector<NodeSubtreePointer> UnaryOperation::subtrees()
  34. {
  35. return { { &m_operand } };
  36. }
  37. Vector<NodeSubtreePointer> IsOneOfOperation::subtrees()
  38. {
  39. Vector<NodeSubtreePointer> result = { { &m_operand } };
  40. for (auto& child : m_compare_values)
  41. result.append({ &child });
  42. return result;
  43. }
  44. Vector<NodeSubtreePointer> ReturnExpression::subtrees()
  45. {
  46. return { { &m_return_value } };
  47. }
  48. Vector<NodeSubtreePointer> AssertExpression::subtrees()
  49. {
  50. return { { &m_condition } };
  51. }
  52. Vector<NodeSubtreePointer> IfBranch::subtrees()
  53. {
  54. return { { &m_condition }, { &m_branch } };
  55. }
  56. Vector<NodeSubtreePointer> ElseIfBranch::subtrees()
  57. {
  58. if (m_condition)
  59. return { { &m_condition }, { &m_branch } };
  60. return { { &m_branch } };
  61. }
  62. Vector<NodeSubtreePointer> TreeList::subtrees()
  63. {
  64. Vector<NodeSubtreePointer> result;
  65. for (auto& expression : m_expressions)
  66. result.append({ &expression });
  67. return result;
  68. }
  69. Vector<NodeSubtreePointer> RecordDirectListInitialization::subtrees()
  70. {
  71. Vector<NodeSubtreePointer> result { &m_type_reference };
  72. for (auto& argument : m_arguments) {
  73. result.append({ &argument.name });
  74. result.append({ &argument.value });
  75. }
  76. return result;
  77. }
  78. Vector<NodeSubtreePointer> FunctionCall::subtrees()
  79. {
  80. Vector<NodeSubtreePointer> result = { { &m_name } };
  81. for (auto& child : m_arguments)
  82. result.append({ &child });
  83. return result;
  84. }
  85. }