base class lookup

This commit is contained in:
Günter Obiltschnig 2023-07-11 08:54:34 +02:00
parent 0bf69ab832
commit da39e3ce70
5 changed files with 36 additions and 9 deletions

View File

@ -119,6 +119,11 @@ public:
bool isDeleted() const; bool isDeleted() const;
/// Returns true iff the method has been deleted. /// Returns true iff the method has been deleted.
bool isVirtual() const;
/// Returns true if the method is virtual. Also examines base
/// classes to check for a virtual function with the same
/// signature.
bool isStatic() const; bool isStatic() const;
/// Returns true iff the method is static. /// Returns true iff the method is static.
@ -128,11 +133,6 @@ public:
std::string signature() const; std::string signature() const;
/// Returns the signature of the function. /// Returns the signature of the function.
bool isVirtual() const;
/// Returns true if the method is virtual. Also examines base
/// classes to check for a virtual function with the same
/// signature.
Function* getOverridden() const; Function* getOverridden() const;
/// If the function is virtual and overrides a function in a /// If the function is virtual and overrides a function in a
/// base class, the base class function is returned. /// base class, the base class function is returned.

View File

@ -62,7 +62,7 @@ public:
Iterator end() const; Iterator end() const;
/// Returns an iterator for iterating over the NameSpace's Symbol's. /// Returns an iterator for iterating over the NameSpace's Symbol's.
Symbol* lookup(const std::string& name) const; virtual Symbol* lookup(const std::string& name) const;
/// Looks up the given name in the symbol table /// Looks up the given name in the symbol table
/// and returns the corresponding symbol, or null /// and returns the corresponding symbol, or null
/// if no symbol can be found. The name can include /// if no symbol can be found. The name can include

View File

@ -139,6 +139,9 @@ public:
Symbol::Kind kind() const; Symbol::Kind kind() const;
std::string toString() const; std::string toString() const;
// Namespace
Symbol* lookup(const std::string& name) const;
private: private:
std::string _decl; std::string _decl;
BaseClasses _bases; BaseClasses _bases;

View File

@ -99,7 +99,8 @@ Symbol* NameSpace::lookup(const std::string& name, std::set<const NameSpace*>& a
return pSymbol; return pSymbol;
if (alreadyVisited.find(this) != alreadyVisited.end()) if (alreadyVisited.find(this) != alreadyVisited.end())
return pSymbol; return pSymbol;
std::string head; std::string head;
std::string tail; std::string tail;
splitName(name, head, tail); splitName(name, head, tail);
@ -107,7 +108,6 @@ Symbol* NameSpace::lookup(const std::string& name, std::set<const NameSpace*>& a
alreadyVisited.insert(this); alreadyVisited.insert(this);
bool currentNSInserted = true; bool currentNSInserted = true;
if (head.empty()) if (head.empty())
{ {
alreadyVisited.insert(this); alreadyVisited.insert(this);

View File

@ -252,4 +252,28 @@ std::string Struct::toString() const
} }
Symbol* Struct::lookup(const std::string& name) const
{
Symbol* pSymbol = NameSpace::lookup(name);
if (!pSymbol)
{
for (BaseIterator it = baseBegin(); it != baseEnd(); ++it)
{
if (it->access != Symbol::ACC_PRIVATE)
{
if (it->pClass)
{
pSymbol = it->pClass->lookup(name);
if (pSymbol)
{
return pSymbol;
}
}
}
}
}
return pSymbol;
}
} } // namespace Poco::CppParser } } // namespace Poco::CppParser