1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 22:44:58 +00:00
serenity/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Compiler/GenericASTPass.cpp
Dan Klishch 1c4cd34320 JSSpecCompiler: Restrict usage of NodeSubtreePointer
This class stores a non-owning raw pointer to a member of `Node`, so
extra care is needed to ensure that referenced `Node`s will be alive
by the time `NodeSubtreePointer` is used. Since we only need to use this
class while traversing AST in `RecursiveASTVisitor`, access to class
methods can be restricted using `Badge<RecursiveASTVisitor>`.
2023-09-09 11:20:43 -06:00

49 lines
1.1 KiB
C++

/*
* Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "Compiler/GenericASTPass.h"
#include "AST/AST.h"
#include "Function.h"
namespace JSSpecCompiler {
void RecursiveASTVisitor::run_in_subtree(Tree& tree)
{
NodeSubtreePointer pointer { &tree };
recurse(tree, pointer);
}
void RecursiveASTVisitor::replace_current_node_with(Tree tree)
{
m_current_subtree_pointer->replace_subtree({}, move(tree));
}
RecursionDecision RecursiveASTVisitor::recurse(Tree root, NodeSubtreePointer& pointer)
{
RecursionDecision decision;
m_current_subtree_pointer = &pointer;
decision = on_entry(root);
if (decision == RecursionDecision::Recurse) {
for (auto& child : root->subtrees()) {
if (recurse(child.get({}), child) == RecursionDecision::Break)
return RecursionDecision::Break;
}
}
m_current_subtree_pointer = &pointer;
on_leave(root);
return RecursionDecision::Continue;
}
void GenericASTPass::run()
{
run_in_subtree(m_function->m_ast);
}
}