diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp index a012cca8ad8c450f3af939a71f2608b7357daaa4..82d3e5c0165e047ef1ccc0f70a350c8b69d28195 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 c5cc484f108179e1f956213dfd031daae064703c..12c48222416e3cf43ff46b32715ee19e08a59a5a 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