From 19dd2b814fcd37b106048d202339d63d6232728e Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Wed, 3 Jun 2009 14:15:49 +0200
Subject: [PATCH] Added Symbol::enclosingNamespaceScope(),
 Symbol::enclosingClassScope(), and so on...

---
 src/shared/cplusplus/Symbol.cpp | 56 +++++++++++++++++++++++++++++++++
 src/shared/cplusplus/Symbol.h   | 15 +++++++++
 2 files changed, 71 insertions(+)

diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index a012cca8ad8..82d3e5c0165 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -55,6 +55,7 @@
 #include "MemoryPool.h"
 #include "SymbolVisitor.h"
 #include "NameVisitor.h"
+#include "Scope.h"
 #include <cstddef>
 #include <cassert>
 
@@ -313,6 +314,61 @@ void Symbol::setScope(Scope *scope)
     _scope = scope;
 }
 
+Scope *Symbol::enclosingNamespaceScope() const
+{
+    if (! _scope)
+        return 0;
+
+    else if (_scope->isNamespaceScope())
+        return _scope;
+
+    return _scope->enclosingNamespaceScope();
+}
+
+Scope *Symbol::enclosingClassScope() const
+{
+    if (! _scope)
+        return 0;
+
+    else if (_scope->isNamespaceScope())
+        return _scope;
+
+    return _scope->enclosingNamespaceScope();
+}
+
+Scope *Symbol::enclosingEnumScope() const
+{
+    if (! _scope)
+        return 0;
+
+    else if (_scope->isEnumScope())
+        return _scope;
+
+    return _scope->enclosingEnumScope();
+}
+
+Scope *Symbol::enclosingFunctionScope() const
+{
+    if (! _scope)
+        return 0;
+
+    else if (_scope->isFunctionScope())
+        return _scope;
+
+    return _scope->enclosingFunctionScope();
+}
+
+Scope *Symbol::enclosingBlockScope() const
+{
+    if (! _scope)
+        return 0;
+
+    else if (_scope->isBlockScope())
+        return _scope;
+
+    return _scope->enclosingBlockScope();
+}
+
 unsigned Symbol::index() const
 { return _index; }
 
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index c5cc484f108..12c48222416 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -248,6 +248,21 @@ public:
 
     bool isGenerated() const;
 
+    /// Returns the eclosing namespace scope.
+    Scope *enclosingNamespaceScope() const;
+
+    /// Returns the enclosing class scope.
+    Scope *enclosingClassScope() const;
+
+    /// Returns the enclosing enum scope.
+    Scope *enclosingEnumScope() const;
+
+    /// Returns the enclosing function scope.
+    Scope *enclosingFunctionScope() const;
+
+    /// Returns the enclosing Block scope.
+    Scope *enclosingBlockScope() const;
+
     void setScope(Scope *scope); // ### make me private
     void setSourceLocation(unsigned sourceLocation); // ### make me private
 
-- 
GitLab