ASTPrinting.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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 ControlFlowFunctionReturn::dump_tree(StringBuilder& builder)
  32. {
  33. dump_node(builder, "ControlFlowFunctionReturn");
  34. m_return_value->format_tree(builder);
  35. }
  36. void ControlFlowJump::dump_tree(StringBuilder& builder)
  37. {
  38. dump_node(builder, "ControlFlowJump jump={}", m_block->m_index);
  39. }
  40. void ControlFlowBranch::dump_tree(StringBuilder& builder)
  41. {
  42. dump_node(builder, "ControlFlowBranch true={} false={}", m_then->m_index, m_else->m_index);
  43. m_condition->format_tree(builder);
  44. }
  45. void MathematicalConstant::dump_tree(StringBuilder& builder)
  46. {
  47. dump_node(builder, "MathematicalConstant {}", m_number);
  48. }
  49. void StringLiteral::dump_tree(StringBuilder& builder)
  50. {
  51. dump_node(builder, "StringLiteral {}", m_literal);
  52. }
  53. void BinaryOperation::dump_tree(StringBuilder& builder)
  54. {
  55. dump_node(builder, "BinaryOperation {}", binary_operator_names[to_underlying(m_operation)]);
  56. m_left->format_tree(builder);
  57. m_right->format_tree(builder);
  58. }
  59. void UnaryOperation::dump_tree(StringBuilder& builder)
  60. {
  61. dump_node(builder, "UnaryOperation {}", unary_operator_names[to_underlying(m_operation)]);
  62. m_operand->format_tree(builder);
  63. }
  64. void IsOneOfOperation::dump_tree(StringBuilder& builder)
  65. {
  66. dump_node(builder, "IsOneOf");
  67. m_operand->format_tree(builder);
  68. for (auto const& compare_value : m_compare_values)
  69. compare_value->format_tree(builder);
  70. }
  71. void UnresolvedReference::dump_tree(StringBuilder& builder)
  72. {
  73. dump_node(builder, "UnresolvedReference {}", m_name);
  74. }
  75. void ReturnNode::dump_tree(StringBuilder& builder)
  76. {
  77. dump_node(builder, "ReturnNode");
  78. m_return_value->format_tree(builder);
  79. }
  80. void AssertExpression::dump_tree(StringBuilder& builder)
  81. {
  82. dump_node(builder, "AssertExpression");
  83. m_condition->format_tree(builder);
  84. }
  85. void IfBranch::dump_tree(StringBuilder& builder)
  86. {
  87. dump_node(builder, "IfBranch");
  88. m_condition->format_tree(builder);
  89. m_branch->format_tree(builder);
  90. }
  91. void ElseIfBranch::dump_tree(StringBuilder& builder)
  92. {
  93. dump_node(builder, "ElseIfBranch {}", m_condition ? "ElseIf" : "Else");
  94. if (m_condition)
  95. m_condition->format_tree(builder);
  96. m_branch->format_tree(builder);
  97. }
  98. void IfElseIfChain::dump_tree(StringBuilder& builder)
  99. {
  100. dump_node(builder, "IfElseIfChain");
  101. for (size_t i = 0; i < branches_count(); ++i) {
  102. m_conditions[i]->format_tree(builder);
  103. m_branches[i]->format_tree(builder);
  104. }
  105. if (m_else_branch)
  106. m_else_branch->format_tree(builder);
  107. }
  108. void TreeList::dump_tree(StringBuilder& builder)
  109. {
  110. dump_node(builder, "TreeList");
  111. for (auto const& expression : m_trees)
  112. expression->format_tree(builder);
  113. }
  114. void RecordDirectListInitialization::dump_tree(StringBuilder& builder)
  115. {
  116. dump_node(builder, "RecordDirectListInitialization");
  117. m_type_reference->format_tree(builder);
  118. for (auto const& argument : m_arguments)
  119. builder.appendff("{}{}", argument.name, argument.value);
  120. }
  121. void FunctionCall::dump_tree(StringBuilder& builder)
  122. {
  123. dump_node(builder, "FunctionCall");
  124. m_name->format_tree(builder);
  125. for (auto const& argument : m_arguments)
  126. argument->format_tree(builder);
  127. }
  128. void SlotName::dump_tree(StringBuilder& builder)
  129. {
  130. dump_node(builder, "Slot {}", m_member_name);
  131. }
  132. void Variable::dump_tree(StringBuilder& builder)
  133. {
  134. dump_node(builder, "Var {}", name());
  135. }
  136. void FunctionPointer::dump_tree(StringBuilder& builder)
  137. {
  138. dump_node(builder, "Func \"{}\"", m_declaration->m_name);
  139. }
  140. }