ASTPrinting.cpp 4.6 KB

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