mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 18:28:12 +00:00
JSSpecCompiler: Add infrastructure to run compiler passes on AST
This commit is contained in:
parent
cd8f4aaa7d
commit
198591cc20
6 changed files with 243 additions and 0 deletions
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue