ASTPrinting.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/StringBuilder.h>
  7. #include <AK/TemporaryChange.h>
  8. #include "AST/AST.h"
  9. #include "Function.h"
  10. namespace JSSpecCompiler {
  11. void Node::format_tree(StringBuilder& builder)
  12. {
  13. static int current_depth = -1;
  14. TemporaryChange<int> depth_change(current_depth, current_depth + 1);
  15. builder.append_repeated(' ', current_depth * 2);
  16. dump_tree(builder);
  17. }
  18. template<typename... Parameters>
  19. void Node::dump_node(StringBuilder& builder, AK::CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
  20. {
  21. AK::VariadicFormatParams<AK::AllowDebugOnlyFormatters::No, Parameters...> variadic_format_params { parameters... };
  22. MUST(AK::vformat(builder, fmtstr.view(), variadic_format_params));
  23. builder.append("\n"sv);
  24. }
  25. void ErrorNode::dump_tree(StringBuilder& builder)
  26. {
  27. dump_node(builder, "Error \"{}\"", m_error);
  28. }
  29. void ControlFlowFunctionReturn::dump_tree(StringBuilder& builder)
  30. {
  31. dump_node(builder, "ControlFlowFunctionReturn");
  32. m_return_value->format_tree(builder);
  33. }
  34. void ControlFlowJump::dump_tree(StringBuilder& builder)
  35. {
  36. dump_node(builder, "ControlFlowJump jump={:p}", m_block);
  37. }
  38. void ControlFlowBranch::dump_tree(StringBuilder& builder)
  39. {
  40. dump_node(builder, "ControlFlowBranch true={:p} false={:p}", m_then, m_else);
  41. m_condition->format_tree(builder);
  42. }
  43. void MathematicalConstant::dump_tree(StringBuilder& builder)
  44. {
  45. dump_node(builder, "MathematicalConstant {}", m_number);
  46. }
  47. void StringLiteral::dump_tree(StringBuilder& builder)
  48. {
  49. dump_node(builder, "StringLiteral {}", m_literal);
  50. }
  51. void BinaryOperation::dump_tree(StringBuilder& builder)
  52. {
  53. dump_node(builder, "BinaryOperation {}", binary_operator_names[to_underlying(m_operation)]);
  54. m_left->format_tree(builder);
  55. m_right->format_tree(builder);
  56. }
  57. void UnaryOperation::dump_tree(StringBuilder& builder)
  58. {
  59. dump_node(builder, "UnaryOperation {}", unary_operator_names[to_underlying(m_operation)]);
  60. m_operand->format_tree(builder);
  61. }
  62. void IsOneOfOperation::dump_tree(StringBuilder& builder)
  63. {
  64. dump_node(builder, "IsOneOf");
  65. m_operand->format_tree(builder);
  66. for (auto const& compare_value : m_compare_values)
  67. compare_value->format_tree(builder);
  68. }
  69. void UnresolvedReference::dump_tree(StringBuilder& builder)
  70. {
  71. dump_node(builder, "UnresolvedReference {}", m_name);
  72. }
  73. void ReturnNode::dump_tree(StringBuilder& builder)
  74. {
  75. dump_node(builder, "ReturnNode");
  76. m_return_value->format_tree(builder);
  77. }
  78. void AssertExpression::dump_tree(StringBuilder& builder)
  79. {
  80. dump_node(builder, "AssertExpression");
  81. m_condition->format_tree(builder);
  82. }
  83. void IfBranch::dump_tree(StringBuilder& builder)
  84. {
  85. dump_node(builder, "IfBranch");
  86. m_condition->format_tree(builder);
  87. m_branch->format_tree(builder);
  88. }
  89. void ElseIfBranch::dump_tree(StringBuilder& builder)
  90. {
  91. dump_node(builder, "ElseIfBranch {}", m_condition ? "ElseIf" : "Else");
  92. if (m_condition)
  93. m_condition->format_tree(builder);
  94. m_branch->format_tree(builder);
  95. }
  96. void IfElseIfChain::dump_tree(StringBuilder& builder)
  97. {
  98. dump_node(builder, "IfElseIfChain");
  99. for (size_t i = 0; i < branches_count(); ++i) {
  100. m_conditions[i]->format_tree(builder);
  101. m_branches[i]->format_tree(builder);
  102. }
  103. if (m_else_branch)
  104. m_else_branch->format_tree(builder);
  105. }
  106. void TreeList::dump_tree(StringBuilder& builder)
  107. {
  108. dump_node(builder, "TreeList");
  109. for (auto const& expression : m_trees)
  110. expression->format_tree(builder);
  111. }
  112. void RecordDirectListInitialization::dump_tree(StringBuilder& builder)
  113. {
  114. dump_node(builder, "RecordDirectListInitialization");
  115. m_type_reference->format_tree(builder);
  116. for (auto const& argument : m_arguments)
  117. builder.appendff("{}{}", argument.name, argument.value);
  118. }
  119. void FunctionCall::dump_tree(StringBuilder& builder)
  120. {
  121. dump_node(builder, "FunctionCall");
  122. m_name->format_tree(builder);
  123. for (auto const& argument : m_arguments)
  124. argument->format_tree(builder);
  125. }
  126. void SlotName::dump_tree(StringBuilder& builder)
  127. {
  128. dump_node(builder, "Slot {}", m_member_name);
  129. }
  130. void Variable::dump_tree(StringBuilder& builder)
  131. {
  132. dump_node(builder, "Var {}", m_variable_declaration->m_name);
  133. }
  134. void FunctionPointer::dump_tree(StringBuilder& builder)
  135. {
  136. m_function.visit(
  137. [&](StringView name) {
  138. dump_node(builder, "Func external \"{}\"", name);
  139. },
  140. [&](FunctionRef function) {
  141. dump_node(builder, "Func local \"{}\"", function->m_name);
  142. });
  143. }
  144. }