/* * Copyright (c) 2023, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #include #include "AST/AST.h" #include "Compiler/Passes/ReferenceResolvingPass.h" #include "Function.h" namespace JSSpecCompiler { void ReferenceResolvingPass::process_function() { for (auto argument : m_function->m_arguments) m_function->m_local_variables.set(argument.name, make_ref_counted(argument.name)); GenericASTPass::process_function(); } RecursionDecision ReferenceResolvingPass::on_entry(Tree tree) { if (auto binary_operation = as(tree); binary_operation) { if (binary_operation->m_operation != BinaryOperator::Declaration) return RecursionDecision::Recurse; binary_operation->m_operation = BinaryOperator::Assignment; if (auto variable_name = as(binary_operation->m_left); variable_name) { auto name = variable_name->m_name; if (!m_function->m_local_variables.contains(name)) m_function->m_local_variables.set(name, make_ref_counted(name)); } } return RecursionDecision::Recurse; } void ReferenceResolvingPass::on_leave(Tree tree) { if (auto reference = as(tree); reference) { auto name = reference->m_name; if (name.starts_with("[["sv) && name.ends_with("]]"sv)) { replace_current_node_with(make_ref_counted(name.substring_view(2, name.length() - 4))); return; } if (auto it = m_function->m_local_variables.find(name); it != m_function->m_local_variables.end()) { replace_current_node_with(make_ref_counted(it->value)); return; } if (auto function = m_translation_unit->find_declaration_by_name(name)) { replace_current_node_with(make_ref_counted(function)); return; } } } }