From 3c645799476e526b04e13f648cd30643c1f39112 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Sat, 19 Apr 2025 14:23:53 +0000
Subject: [PATCH] fix function call in function
---
src/Symbols/SymbolContainer.hpp | 56 ++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 44 insertions(+), 12 deletions(-)
diff --git a/src/Symbols/SymbolContainer.hpp b/src/Symbols/SymbolContainer.hpp
index 99f79b3..4805a82 100644
--- a/src/Symbols/SymbolContainer.hpp
+++ b/src/Symbols/SymbolContainer.hpp
@@ -5,6 +5,7 @@
#include <memory>
#include <stdexcept>
#include <unordered_map>
+#include <vector>
#include "SymbolTable.hpp"
@@ -14,8 +15,8 @@
class SymbolContainer {
std::unordered_map<std::string, std::shared_ptr<SymbolTable>> scopes_;
- std::string currentScope_ = "global";
- std::string previousScope_ = "global";
+ // Stack of active scope names (supports nested scope entry)
+ std::vector<std::string> scopeStack_;
public:
static SymbolContainer * instance() {
@@ -27,25 +28,42 @@
// --- Scope management ---
+ /**
+ * @brief Create a new scope and enter it.
+ * @param name Name of the new scope.
+ */
void create(const std::string & name) {
- scopes_[name] = std::make_shared<SymbolTable>();
- previousScope_ = currentScope_;
- currentScope_ = name;
+ scopes_[name] = std::make_shared<SymbolTable>();
+ scopeStack_.push_back(name);
}
+ /**
+ * @brief Enter an existing scope.
+ * @param name Name of the scope to enter.
+ */
void enter(const std::string & name) {
auto it = scopes_.find(name);
if (it != scopes_.end()) {
- previousScope_ = currentScope_;
- currentScope_ = name;
+ scopeStack_.push_back(name);
} else {
throw std::runtime_error("Scope does not exist: " + name);
}
}
- void enterPreviousScope() { currentScope_ = previousScope_; }
+ /**
+ * @brief Exit the current scope, returning to the previous one.
+ */
+ void enterPreviousScope() {
+ if (scopeStack_.size() > 1) {
+ scopeStack_.pop_back();
+ }
+ }
- [[nodiscard]] std::string currentScopeName() const { return currentScope_; }
+ /**
+ * @brief Get the name of the current scope.
+ * @return Current scope name.
+ */
+ [[nodiscard]] std::string currentScopeName() const { return scopeStack_.empty() ? std::string() : scopeStack_.back(); }
std::vector<std::string> getScopeNames() const {
std::vector<std::string> result;
@@ -58,9 +76,14 @@
// --- Symbol operations ---
+ /**
+ * @brief Add a symbol to the current scope.
+ * @param symbol Symbol to add.
+ * @return Namespace under which the symbol was defined.
+ */
std::string add(const SymbolPtr & symbol) {
const std::string ns = getNamespaceForSymbol(symbol);
- scopes_[currentScope_]->define(ns, symbol);
+ scopes_[currentScopeName()]->define(ns, symbol);
return ns;
}
@@ -82,9 +105,15 @@
return result;
}
+ /**
+ * @brief Check if a symbol exists in the given namespace (or current scope if none provided).
+ * @param name Symbol name.
+ * @param fullNamespace Namespace to search within (defaults to current scope).
+ * @return True if the symbol exists, false otherwise.
+ */
bool exists(const std::string & name, std::string fullNamespace = "") const {
if (fullNamespace.empty()) {
- fullNamespace = currentScope_;
+ fullNamespace = currentScopeName();
}
for (const auto & [_, table] : scopes_) {
@@ -122,8 +151,11 @@
}
private:
+ /**
+ * @brief Compute the namespace string for a symbol based on its kind and context.
+ */
std::string getNamespaceForSymbol(const SymbolPtr & symbol) const {
- std::string base = symbol->context().empty() ? currentScope_ : symbol->context();
+ std::string base = symbol->context().empty() ? currentScopeName() : symbol->context();
switch (symbol->getKind()) {
case Symbols::Kind::Variable:
--
Gitblit v1.9.3