AST.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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> IfElseIfChain::subtrees()
  63. {
  64. Vector<NodeSubtreePointer> result;
  65. for (size_t i = 0; i < branches_count(); ++i) {
  66. result.append({ &m_conditions[i] });
  67. result.append({ &m_branches[i] });
  68. }
  69. if (m_else_branch)
  70. result.append({ &m_else_branch });
  71. return result;
  72. }
  73. Vector<NodeSubtreePointer> TreeList::subtrees()
  74. {
  75. Vector<NodeSubtreePointer> result;
  76. for (auto& expression : m_expressions)
  77. result.append({ &expression });
  78. return result;
  79. }
  80. Vector<NodeSubtreePointer> RecordDirectListInitialization::subtrees()
  81. {
  82. Vector<NodeSubtreePointer> result { &m_type_reference };
  83. for (auto& argument : m_arguments) {
  84. result.append({ &argument.name });
  85. result.append({ &argument.value });
  86. }
  87. return result;
  88. }
  89. Vector<NodeSubtreePointer> FunctionCall::subtrees()
  90. {
  91. Vector<NodeSubtreePointer> result = { { &m_name } };
  92. for (auto& child : m_arguments)
  93. result.append({ &child });
  94. return result;
  95. }
  96. }