/* * Copyright (c) 2023, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #include "AST/AST.h" namespace JSSpecCompiler { Tree NodeSubtreePointer::get(Badge) { return m_tree_ptr.visit( [&](NullableTree* nullable_tree) -> Tree { NullableTree copy = *nullable_tree; return copy.release_nonnull(); }, [&](Tree* tree) -> Tree { return *tree; }); } void NodeSubtreePointer::replace_subtree(Badge, NullableTree replacement) { m_tree_ptr.visit( [&](NullableTree* nullable_tree) { *nullable_tree = replacement; }, [&](Tree* tree) { *tree = replacement.release_nonnull(); }); } Vector BinaryOperation::subtrees() { return { { &m_left }, { &m_right } }; } Vector UnaryOperation::subtrees() { return { { &m_operand } }; } Vector IsOneOfOperation::subtrees() { Vector result = { { &m_operand } }; for (auto& child : m_compare_values) result.append({ &child }); return result; } Vector ReturnExpression::subtrees() { return { { &m_return_value } }; } Vector AssertExpression::subtrees() { return { { &m_condition } }; } Vector IfBranch::subtrees() { return { { &m_condition }, { &m_branch } }; } Vector ElseIfBranch::subtrees() { if (m_condition) return { { &m_condition }, { &m_branch } }; return { { &m_branch } }; } Vector TreeList::subtrees() { Vector result; for (auto& expression : m_expressions) result.append({ &expression }); return result; } Vector RecordDirectListInitialization::subtrees() { Vector result { &m_type_reference }; for (auto& argument : m_arguments) { result.append({ &argument.name }); result.append({ &argument.value }); } return result; } Vector FunctionCall::subtrees() { Vector result = { { &m_name } }; for (auto& child : m_arguments) result.append({ &child }); return result; } }