ASTPrinting.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 <AK/StringBuilder.h>
  8. #include <AK/TemporaryChange.h>
  9. #include "AST/AST.h"
  10. #include "Compiler/ControlFlowGraph.h"
  11. #include "Function.h"
  12. namespace JSSpecCompiler {
  13. void Node::format_tree(StringBuilder& builder)
  14. {
  15. static int current_depth = -1;
  16. TemporaryChange<int> depth_change(current_depth, current_depth + 1);
  17. builder.append_repeated(' ', current_depth * 2);
  18. dump_tree(builder);
  19. }
  20. template<typename... Parameters>
  21. void Node::dump_node(StringBuilder& builder, AK::CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
  22. {
  23. AK::VariadicFormatParams<AK::AllowDebugOnlyFormatters::No, Parameters...> variadic_format_params { parameters... };
  24. MUST(AK::vformat(builder, fmtstr.view(), variadic_format_params));
  25. builder.append("\n"sv);
  26. }
  27. void ErrorNode::dump_tree(StringBuilder& builder)
  28. {
  29. dump_node(builder, "Error \"{}\"", m_error);
  30. }
  31. void WellKnownNode::dump_tree(StringBuilder& builder)
  32. {
  33. static constexpr StringView type_to_name[] = {
  34. "False"sv,
  35. "NewTarget"sv,
  36. "Null"sv,
  37. "This"sv,
  38. "True"sv,
  39. "Undefined"sv,
  40. };
  41. dump_node(builder, "WellKnownNode {}", type_to_name[m_type]);
  42. }
  43. void ControlFlowFunctionReturn::dump_tree(StringBuilder& builder)
  44. {
  45. dump_node(builder, "ControlFlowFunctionReturn");
  46. m_return_value->format_tree(builder);
  47. }
  48. void ControlFlowJump::dump_tree(StringBuilder& builder)
  49. {
  50. dump_node(builder, "ControlFlowJump jump={}", m_block->m_index);
  51. }
  52. void ControlFlowBranch::dump_tree(StringBuilder& builder)
  53. {
  54. dump_node(builder, "ControlFlowBranch true={} false={}", m_then->m_index, m_else->m_index);
  55. m_condition->format_tree(builder);
  56. }
  57. void MathematicalConstant::dump_tree(StringBuilder& builder)
  58. {
  59. String representation;
  60. if (Crypto::UnsignedBigInteger { 1000 }.divided_by(m_number.denominator()).remainder == 0)
  61. representation = MUST(String::from_byte_string(m_number.to_byte_string(3)));
  62. else
  63. representation = MUST(String::formatted("{}/{}", MUST(m_number.numerator().to_base(10)), MUST(m_number.denominator().to_base(10))));
  64. dump_node(builder, "MathematicalConstant {}", representation);
  65. }
  66. void StringLiteral::dump_tree(StringBuilder& builder)
  67. {
  68. dump_node(builder, "StringLiteral {}", m_literal);
  69. }
  70. void BinaryOperation::dump_tree(StringBuilder& builder)
  71. {
  72. dump_node(builder, "BinaryOperation {}", binary_operator_names[to_underlying(m_operation)]);
  73. m_left->format_tree(builder);
  74. m_right->format_tree(builder);
  75. }
  76. void UnaryOperation::dump_tree(StringBuilder& builder)
  77. {
  78. dump_node(builder, "UnaryOperation {}", unary_operator_names[to_underlying(m_operation)]);
  79. m_operand->format_tree(builder);
  80. }
  81. void IsOneOfOperation::dump_tree(StringBuilder& builder)
  82. {
  83. dump_node(builder, "IsOneOf");
  84. m_operand->format_tree(builder);
  85. for (auto const& compare_value : m_compare_values)
  86. compare_value->format_tree(builder);
  87. }
  88. void UnresolvedReference::dump_tree(StringBuilder& builder)
  89. {
  90. dump_node(builder, "UnresolvedReference {}", m_name);
  91. }
  92. void ReturnNode::dump_tree(StringBuilder& builder)
  93. {
  94. dump_node(builder, "ReturnNode");
  95. m_return_value->format_tree(builder);
  96. }
  97. void AssertExpression::dump_tree(StringBuilder& builder)
  98. {
  99. dump_node(builder, "AssertExpression");
  100. m_condition->format_tree(builder);
  101. }
  102. void IfBranch::dump_tree(StringBuilder& builder)
  103. {
  104. dump_node(builder, "IfBranch");
  105. m_condition->format_tree(builder);
  106. m_branch->format_tree(builder);
  107. }
  108. void ElseIfBranch::dump_tree(StringBuilder& builder)
  109. {
  110. dump_node(builder, "ElseIfBranch {}", m_condition ? "ElseIf" : "Else");
  111. if (m_condition)
  112. m_condition->format_tree(builder);
  113. m_branch->format_tree(builder);
  114. }
  115. void IfElseIfChain::dump_tree(StringBuilder& builder)
  116. {
  117. dump_node(builder, "IfElseIfChain");
  118. for (size_t i = 0; i < branches_count(); ++i) {
  119. m_conditions[i]->format_tree(builder);
  120. m_branches[i]->format_tree(builder);
  121. }
  122. if (m_else_branch)
  123. m_else_branch->format_tree(builder);
  124. }
  125. void TreeList::dump_tree(StringBuilder& builder)
  126. {
  127. dump_node(builder, "TreeList");
  128. for (auto const& expression : m_trees)
  129. expression->format_tree(builder);
  130. }
  131. void RecordDirectListInitialization::dump_tree(StringBuilder& builder)
  132. {
  133. dump_node(builder, "RecordDirectListInitialization");
  134. m_type_reference->format_tree(builder);
  135. for (auto const& argument : m_arguments)
  136. builder.appendff("{}{}", argument.name, argument.value);
  137. }
  138. void FunctionCall::dump_tree(StringBuilder& builder)
  139. {
  140. dump_node(builder, "FunctionCall");
  141. m_name->format_tree(builder);
  142. for (auto const& argument : m_arguments)
  143. argument->format_tree(builder);
  144. }
  145. void SlotName::dump_tree(StringBuilder& builder)
  146. {
  147. dump_node(builder, "Slot {}", m_member_name);
  148. }
  149. void Variable::dump_tree(StringBuilder& builder)
  150. {
  151. dump_node(builder, "Var {}", name());
  152. }
  153. void Enumerator::dump_tree(StringBuilder& builder)
  154. {
  155. dump_node(builder, "Enumerator {}", m_value);
  156. }
  157. void FunctionPointer::dump_tree(StringBuilder& builder)
  158. {
  159. dump_node(builder, "Func \"{}\"", m_declaration->name());
  160. }
  161. void List::dump_tree(StringBuilder& builder)
  162. {
  163. dump_node(builder, "List");
  164. for (auto const& element : m_elements)
  165. element->format_tree(builder);
  166. }
  167. }