#pragma once #include "Entity/Scope.h" #include "Sema/ASTVisitor.h" /// 引用消解器 class ReferenceResolver final : public ASTVisitorWithScope { public: void visit(const SharedPtr &module) override; void visit(const SharedPtr &varDecl) override; void visit(const SharedPtr ¶mVarDecl) override; void visit(const SharedPtr &funcDecl) override; void visit(const SharedPtr &varExpr) override; void visit(const SharedPtr &callExpr) override; void visit(const SharedPtr &compStmt) override; void visit(const SharedPtr &forStmt) override; void visit(const SharedPtr &continueStmt) override; void visit(const SharedPtr &breakStmt) override; void visit(const SharedPtr &returnStmt) override; private: /** * @brief 查找变量 * @details 沿着当前作用域递归向上查找变量 * * @param name 变量名 * @return 变量定义节点 */ inline SharedPtr resolveVariable(const String &name) { return getCurrentScope()->resolveVariable(name); } /** * @brief 查找函数 * @details 在顶级作用域中查找函数 * * @param name 函数名 * @return 函数定义节点 */ inline SharedPtr resolveFunction(const String &name) { return getCurrentScope()->getTopLevel()->resolveFunction(name); } static SharedPtr resolveRefIterationStmt(const SharedPtr &node); };