AST.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/String.h>
  7. #include "AST/AST.h"
  8. namespace JSSpecCompiler {
  9. Tree NodeSubtreePointer::get(Badge<RecursiveASTVisitor>)
  10. {
  11. return m_tree_ptr.visit(
  12. [&](NullableTree* nullable_tree) -> Tree {
  13. NullableTree copy = *nullable_tree;
  14. return copy.release_nonnull();
  15. },
  16. [&](Tree* tree) -> Tree {
  17. return *tree;
  18. },
  19. [&](VariableRef* tree) -> Tree {
  20. return *tree;
  21. });
  22. }
  23. void NodeSubtreePointer::replace_subtree(Badge<RecursiveASTVisitor>, NullableTree replacement)
  24. {
  25. m_tree_ptr.visit(
  26. [&](NullableTree* nullable_tree) {
  27. *nullable_tree = replacement;
  28. },
  29. [&](Tree* tree) {
  30. *tree = replacement.release_nonnull();
  31. },
  32. [&](VariableRef*) {
  33. VERIFY_NOT_REACHED();
  34. });
  35. }
  36. Vector<BasicBlockRef*> ControlFlowJump::references()
  37. {
  38. return { &m_block };
  39. }
  40. Vector<BasicBlockRef*> ControlFlowBranch::references()
  41. {
  42. return { &m_then, &m_else };
  43. }
  44. Vector<NodeSubtreePointer> BinaryOperation::subtrees()
  45. {
  46. return { { &m_left }, { &m_right } };
  47. }
  48. Vector<NodeSubtreePointer> UnaryOperation::subtrees()
  49. {
  50. return { { &m_operand } };
  51. }
  52. Vector<NodeSubtreePointer> IsOneOfOperation::subtrees()
  53. {
  54. Vector<NodeSubtreePointer> result = { { &m_operand } };
  55. for (auto& child : m_compare_values)
  56. result.append({ &child });
  57. return result;
  58. }
  59. Vector<NodeSubtreePointer> ReturnNode::subtrees()
  60. {
  61. return { { &m_return_value } };
  62. }
  63. Vector<NodeSubtreePointer> AssertExpression::subtrees()
  64. {
  65. return { { &m_condition } };
  66. }
  67. Vector<NodeSubtreePointer> IfBranch::subtrees()
  68. {
  69. return { { &m_condition }, { &m_branch } };
  70. }
  71. Vector<NodeSubtreePointer> ElseIfBranch::subtrees()
  72. {
  73. if (m_condition)
  74. return { { &m_condition }, { &m_branch } };
  75. return { { &m_branch } };
  76. }
  77. Vector<NodeSubtreePointer> IfElseIfChain::subtrees()
  78. {
  79. Vector<NodeSubtreePointer> result;
  80. for (size_t i = 0; i < branches_count(); ++i) {
  81. result.append({ &m_conditions[i] });
  82. result.append({ &m_branches[i] });
  83. }
  84. if (m_else_branch)
  85. result.append({ &m_else_branch });
  86. return result;
  87. }
  88. TreeList::TreeList(Vector<Tree>&& trees)
  89. {
  90. for (auto const& tree : trees) {
  91. if (tree->is_list()) {
  92. for (auto const& nested_tree : as<TreeList>(tree)->m_trees)
  93. m_trees.append(nested_tree);
  94. } else {
  95. m_trees.append(tree);
  96. }
  97. }
  98. }
  99. Vector<NodeSubtreePointer> TreeList::subtrees()
  100. {
  101. Vector<NodeSubtreePointer> result;
  102. for (auto& expression : m_trees)
  103. result.append({ &expression });
  104. return result;
  105. }
  106. Vector<NodeSubtreePointer> RecordDirectListInitialization::subtrees()
  107. {
  108. Vector<NodeSubtreePointer> result { &m_type_reference };
  109. for (auto& argument : m_arguments) {
  110. result.append({ &argument.name });
  111. result.append({ &argument.value });
  112. }
  113. return result;
  114. }
  115. Vector<NodeSubtreePointer> FunctionCall::subtrees()
  116. {
  117. Vector<NodeSubtreePointer> result = { { &m_name } };
  118. for (auto& child : m_arguments)
  119. result.append({ &child });
  120. return result;
  121. }
  122. String Variable::name() const
  123. {
  124. if (m_ssa)
  125. return MUST(String::formatted("{}@{}", m_name->m_name, m_ssa->m_version));
  126. return MUST(String::from_utf8(m_name->m_name));
  127. }
  128. }