ReferenceResolvingPass.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/HashMap.h>
  7. #include "AST/AST.h"
  8. #include "Compiler/ReferenceResolvingPass.h"
  9. #include "Function.h"
  10. namespace JSSpecCompiler {
  11. RecursionDecision ReferenceResolvingPass::on_entry(Tree tree)
  12. {
  13. if (auto binary_operation = as<BinaryOperation>(tree); binary_operation) {
  14. if (binary_operation->m_operation != BinaryOperator::Declaration)
  15. return RecursionDecision::Recurse;
  16. if (auto variable_name = as<UnresolvedReference>(binary_operation->m_left); variable_name) {
  17. auto name = variable_name->m_name;
  18. if (!m_function->m_local_variables.contains(name))
  19. m_function->m_local_variables.set(name, make_ref_counted<VariableDeclaration>(name));
  20. }
  21. }
  22. return RecursionDecision::Recurse;
  23. }
  24. void ReferenceResolvingPass::on_leave(Tree tree)
  25. {
  26. auto& functions = m_function->m_translation_unit->function_index;
  27. if (auto reference = as<UnresolvedReference>(tree); reference) {
  28. auto name = reference->m_name;
  29. if (name.starts_with("[["sv) && name.ends_with("]]"sv)) {
  30. replace_current_node_with(make_ref_counted<SlotName>(name.substring_view(2, name.length() - 4)));
  31. return;
  32. }
  33. if (auto it = m_function->m_local_variables.find(name); it != m_function->m_local_variables.end()) {
  34. replace_current_node_with(make_ref_counted<Variable>(it->value));
  35. return;
  36. }
  37. if (auto it = functions.find(name); it != functions.end()) {
  38. replace_current_node_with(it->value);
  39. return;
  40. }
  41. }
  42. }
  43. }