Doxygen
Loading...
Searching...
No Matches
namespacedef.cpp File Reference
#include "namespacedef.h"
#include "outputlist.h"
#include "util.h"
#include "language.h"
#include "classdef.h"
#include "classlist.h"
#include "memberlist.h"
#include "doxygen.h"
#include "message.h"
#include "docparser.h"
#include "searchindex.h"
#include "vhdldocgen.h"
#include "layout.h"
#include "membergroup.h"
#include "config.h"
#include "definitionimpl.h"
#include "membername.h"
#include "conceptdef.h"
Include dependency graph for namespacedef.cpp:

Go to the source code of this file.

Classes

class  NamespaceDefImpl
class  NamespaceDefAliasImpl

Functions

static QCString makeDisplayName (const NamespaceDef *nd, bool includeScope)
std::unique_ptr< NamespaceDefcreateNamespaceDef (const QCString &defFileName, int defLine, int defColumn, const QCString &name, const QCString &ref, const QCString &refFile, const QCString &type, bool isPublished)
 Factory method to create new NamespaceDef instance.
std::unique_ptr< NamespaceDefcreateNamespaceDefAlias (const Definition *newScope, const NamespaceDef *nd)
 Factory method to create an alias of an existing namespace.
static bool hasNonReferenceNestedNamespaceRec (const NamespaceDef *nd, int level)
NamespaceDeftoNamespaceDef (Definition *d)
NamespaceDeftoNamespaceDef (DefinitionMutable *md)
const NamespaceDeftoNamespaceDef (const Definition *d)
NamespaceDefMutabletoNamespaceDefMutable (Definition *d)
static NamespaceDefgetResolvedNamespaceRec (StringSet &namespacesTried, const NamespaceAliasInfo &aliasInfo)
static QCString replaceNamespaceAliasesRec (StringSet &namespacesTried, const QCString &name)
void replaceNamespaceAliases (QCString &name)
NamespaceDefgetResolvedNamespace (const QCString &name)
bool namespaceHasNestedNamespace (const NamespaceDef *nd)
bool namespaceHasNestedConcept (const NamespaceDef *nd)
bool namespaceHasNestedClass (const NamespaceDef *nd, bool filterClasses, ClassDef::CompoundType ct)

Function Documentation

◆ createNamespaceDef()

std::unique_ptr< NamespaceDef > createNamespaceDef ( const QCString & defFileName,
int defLine,
int defColumn,
const QCString & name,
const QCString & ref,
const QCString & refFile,
const QCString & type,
bool isPublished )

Factory method to create new NamespaceDef instance.

Definition at line 172 of file namespacedef.cpp.

176{
177 //printf("createNamespaceDef(%s)\n",qPrint(name));
178 return std::make_unique<NamespaceDefImpl>(defFileName,defLine,defColumn,name,ref,refFile,type,isPublished);
179}

Referenced by adjustConfiguration(), buildNamespaceList(), buildScopeFromQualifiedName(), findUsingDirectives(), and NamespaceDefMutable::setInline().

◆ createNamespaceDefAlias()

std::unique_ptr< NamespaceDef > createNamespaceDefAlias ( const Definition * newScope,
const NamespaceDef * nd )

Factory method to create an alias of an existing namespace.

Used for inline namespaces.

Definition at line 260 of file namespacedef.cpp.

261{
262 auto alnd = std::make_unique<NamespaceDefAliasImpl>(newScope,nd);
263 //printf("alnd name=%s localName=%s qualifiedName=%s displayName()=%s\n",
264 // qPrint(alnd->name()),qPrint(alnd->localName()),qPrint(alnd->qualifiedName()),
265 // qPrint(alnd->displayName()));
266 return alnd;
267}

Referenced by buildNamespaceList(), and NamespaceDefMutable::setInline().

◆ getResolvedNamespace()

NamespaceDef * getResolvedNamespace ( const QCString & name)

Definition at line 1817 of file namespacedef.cpp.

1818{
1819 //printf("> getResolvedNamespace(%s)\n",qPrint(name));
1820 if (name.isEmpty()) return nullptr;
1821 StringSet namespacesTried;
1822 auto ns = getResolvedNamespaceRec(namespacesTried,NamespaceAliasInfo(name.str()));
1823 //printf("< getResolvedNamespace(%s)=%s\n",qPrint(name),ns?qPrint(ns->qualifiedName()):"nullptr");
1824 return ns;
1825}
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
const std::string & str() const
Definition qcstring.h:552
std::set< std::string > StringSet
Definition containers.h:31
static NamespaceDef * getResolvedNamespaceRec(StringSet &namespacesTried, const NamespaceAliasInfo &aliasInfo)

References getResolvedNamespaceRec(), QCString::isEmpty(), and QCString::str().

Referenced by addMemberFunction(), buildFunctionList(), buildTypedefList(), extractNamespaceName(), findUsedNamespace(), findUsingDeclImports(), findUsingDirectives(), generateClassOrGlobalLink(), generateClassOrGlobalLink(), getResolvedNamespaceMutable(), CCodeParser::parseCode(), setCallContextForVar(), NamespaceDefMutable::setInline(), and writeAlphabeticalClassList().

◆ getResolvedNamespaceRec()

NamespaceDef * getResolvedNamespaceRec ( StringSet & namespacesTried,
const NamespaceAliasInfo & aliasInfo )
static

Definition at line 1768 of file namespacedef.cpp.

1769{
1770 size_t j = aliasInfo.context.length();
1771 for (;;)
1772 {
1773 if (j>0)
1774 {
1775 //printf("candidate %s|::%s\n",qPrint(aliasInfo.context.substr(0,j)),qPrint(aliasInfo.alias));
1776 auto candidate = replaceNamespaceAliasesRec(namespacesTried,aliasInfo.context.substr(0,j)+"::"+aliasInfo.alias);
1777 auto nd = Doxygen::namespaceLinkedMap->find(candidate);
1778 if (nd)
1779 {
1780 return nd;
1781 }
1782 }
1783 if (j>0) // strip one level from context, i.e. given N1::N2::N3
1784 // j==10 -> j==6 (N1::N2::N3->N1::N2), and then
1785 // j==6 -> j==2 (N1::N2->N1), and then
1786 // j==2 -> j==std::string::npos (N1->"")
1787 {
1788 j = aliasInfo.context.rfind("::",j-1);
1789 }
1790 else
1791 {
1792 j = std::string::npos;
1793 }
1794 if (j==std::string::npos)
1795 {
1796 //printf("candidate %s\n",qPrint(aliasInfo.alias));
1797 auto candidate = replaceNamespaceAliasesRec(namespacesTried,aliasInfo.alias);
1798 auto nd = Doxygen::namespaceLinkedMap->find(candidate);
1799 if (nd)
1800 {
1801 return nd;
1802 }
1803 break;
1804 }
1805 }
1806 return nullptr;
1807}
static NamespaceLinkedMap * namespaceLinkedMap
Definition doxygen.h:115
static QCString replaceNamespaceAliasesRec(StringSet &namespacesTried, const QCString &name)
std::string context
Definition doxygen.h:78
std::string alias
Definition doxygen.h:77

References NamespaceAliasInfo::alias, NamespaceAliasInfo::context, Doxygen::namespaceLinkedMap, and replaceNamespaceAliasesRec().

Referenced by getResolvedNamespace(), and replaceNamespaceAliasesRec().

◆ hasNonReferenceNestedNamespaceRec()

bool hasNonReferenceNestedNamespaceRec ( const NamespaceDef * nd,
int level )
static

Definition at line 1529 of file namespacedef.cpp.

1530{
1531 if (level>30)
1532 {
1533 err("Possible recursive namespace relation while inside {}\n",nd->name());
1534 return false;
1535 }
1536 bool found=nd->isLinkableInProject();
1537 if (found)
1538 {
1539 return true;
1540 }
1541 else
1542 {
1543 for (const auto &ind : nd->getNamespaces())
1544 {
1545 found = found || hasNonReferenceNestedNamespaceRec(ind,level+1);
1546 if (found) break;
1547 }
1548 }
1549 return found;
1550}
virtual bool isLinkableInProject() const =0
virtual const QCString & name() const =0
virtual NamespaceLinkedRefMap getNamespaces() const =0
#define err(fmt,...)
Definition message.h:127
static bool hasNonReferenceNestedNamespaceRec(const NamespaceDef *nd, int level)

References err, NamespaceDef::getNamespaces(), hasNonReferenceNestedNamespaceRec(), Definition::isLinkableInProject(), and Definition::name().

Referenced by hasNonReferenceNestedNamespaceRec(), and NamespaceDefImpl::isVisibleInHierarchy().

◆ makeDisplayName()

QCString makeDisplayName ( const NamespaceDef * nd,
bool includeScope )
static

Definition at line 36 of file namespacedef.cpp.

37{
38 QCString result=includeScope ? nd->name() : nd->localName();
39 SrcLangExt lang = nd->getLanguage();
41 if (sep!="::")
42 {
43 result = substitute(result,"::",sep);
44 }
45 if (nd->isAnonymous())
46 {
47 result = removeAnonymousScopes(result);
48 }
49 //printf("makeDisplayName() %s->%s lang=%d\n",qPrint(name()),qPrint(result),lang);
50 return result;
51}
virtual const QCString & localName() const =0
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual bool isAnonymous() const =0
This is an alternative implementation of QCString.
Definition qcstring.h:101
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition qcstring.cpp:482
SrcLangExt
Definition types.h:207
QCString removeAnonymousScopes(const QCString &str)
Definition util.cpp:170
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Returns the scope separator to use given the programming language lang.
Definition util.cpp:5809

References Definition::getLanguage(), getLanguageSpecificSeparator(), Definition::isAnonymous(), Definition::localName(), Definition::name(), removeAnonymousScopes(), and substitute().

Referenced by NamespaceDefAliasImpl::displayName(), and NamespaceDefImpl::displayName().

◆ namespaceHasNestedClass()

bool namespaceHasNestedClass ( const NamespaceDef * nd,
bool filterClasses,
ClassDef::CompoundType ct )

Definition at line 1865 of file namespacedef.cpp.

1866{
1867 //printf(">namespaceHasNestedClass(%s,filterClasses=%d)\n",qPrint(nd->name()),filterClasses);
1868 for (const auto &cnd : nd->getNamespaces())
1869 {
1870 if (namespaceHasNestedClass(cnd,filterClasses,ct))
1871 {
1872 //printf("<namespaceHasNestedClass(%s,filterClasses=%d): case1\n",qPrint(nd->name()),filterClasses);
1873 return true;
1874 }
1875 }
1876
1877 ClassLinkedRefMap list = nd->getClasses();
1878 if (filterClasses)
1879 {
1880 switch (ct)
1881 {
1883 list = nd->getInterfaces();
1884 break;
1885 case ClassDef::Struct:
1886 list = nd->getStructs();
1887 break;
1889 list = nd->getExceptions();
1890 break;
1891 default:
1892 break;
1893 }
1894 }
1895
1896 for (const auto &cd : list)
1897 {
1898 //printf("candidate %s isLinkableInProject()=%d\n",qPrint(cd->name()),cd->isLinkableInProject());
1899 if (cd->isLinkableInProject())
1900 {
1901 //printf("<namespaceHasNestedClass(%s,filterClasses=%d): case2\n",qPrint(nd->name()),filterClasses);
1902 return true;
1903 }
1904 }
1905 //printf("<namespaceHasNestedClass(%s,filterClasses=%d): case3\n",qPrint(nd->name()),filterClasses);
1906 return false;
1907}
@ Interface
Definition classdef.h:112
@ Exception
Definition classdef.h:115
virtual ClassLinkedRefMap getStructs() const =0
virtual ClassLinkedRefMap getExceptions() const =0
virtual ClassLinkedRefMap getClasses() const =0
virtual ClassLinkedRefMap getInterfaces() const =0
bool namespaceHasNestedClass(const NamespaceDef *nd, bool filterClasses, ClassDef::CompoundType ct)

References ClassDef::Exception, NamespaceDef::getClasses(), NamespaceDef::getExceptions(), NamespaceDef::getInterfaces(), NamespaceDef::getNamespaces(), NamespaceDef::getStructs(), ClassDef::Interface, namespaceHasNestedClass(), and ClassDef::Struct.

Referenced by namespaceHasNestedClass(), writeClassTreeInsideNamespaceElement(), and writeNamespaceTreeElement().

◆ namespaceHasNestedConcept()

bool namespaceHasNestedConcept ( const NamespaceDef * nd)

Definition at line 1841 of file namespacedef.cpp.

1842{
1843 //printf(">namespaceHasNestedConcept(%s)\n",qPrint(nd->name()));
1844 for (const auto &cnd : nd->getNamespaces())
1845 {
1847 {
1848 //printf("<namespaceHasNestedConcept(%s): case1\n",qPrint(nd->name()));
1849 return true;
1850 }
1851 }
1852 for (const auto &cnd : nd->getConcepts())
1853 {
1854 //printf("candidate %s isLinkableInProject()=%d\n",qPrint(cnd->name()),cnd->isLinkableInProject());
1855 if (cnd->isLinkableInProject())
1856 {
1857 //printf("<namespaceHasNestedConcept(%s): case2\n",qPrint(nd->name()));
1858 return true;
1859 }
1860 }
1861 //printf("<namespaceHasNestedConcept(%s): case3\n",qPrint(nd->name()));
1862 return false;
1863}
virtual ConceptLinkedRefMap getConcepts() const =0
bool namespaceHasNestedConcept(const NamespaceDef *nd)

References NamespaceDef::getConcepts(), NamespaceDef::getNamespaces(), and namespaceHasNestedConcept().

Referenced by namespaceHasNestedConcept(), writeConceptTreeInsideNamespaceElement(), and writeNamespaceTreeElement().

◆ namespaceHasNestedNamespace()

bool namespaceHasNestedNamespace ( const NamespaceDef * nd)

Definition at line 1829 of file namespacedef.cpp.

1830{
1831 for (const auto &cnd : nd->getNamespaces())
1832 {
1833 if (cnd->isLinkableInProject() && !cnd->isAnonymous())
1834 {
1835 return true;
1836 }
1837 }
1838 return false;
1839}

References NamespaceDef::getNamespaces().

Referenced by writeNamespaceTreeElement().

◆ replaceNamespaceAliases()

void replaceNamespaceAliases ( QCString & name)

Definition at line 1809 of file namespacedef.cpp.

1810{
1811 //printf("> replaceNamespaceAliases(%s)\n",qPrint(name));
1812 StringSet namespacesTried;
1813 name = replaceNamespaceAliasesRec(namespacesTried,name);
1814 //printf("< replaceNamespaceAliases: result=%s\n",qPrint(name));
1815}

References replaceNamespaceAliasesRec().

Referenced by findClassRelation(), findUsedClassesForClass(), getMemberFromSymbol(), SymbolResolver::Private::getResolvedSymbolRec(), SymbolResolver::Private::getResolvedTypeRec(), and NamespaceDefMutable::setInline().

◆ replaceNamespaceAliasesRec()

QCString replaceNamespaceAliasesRec ( StringSet & namespacesTried,
const QCString & name )
static

Definition at line 1722 of file namespacedef.cpp.

1723{
1724 QCString result = name;
1725 //printf("> replaceNamespaceAliasesRec(%s)\n",qPrint(name));
1726 if (namespacesTried.find(name.str())==namespacesTried.end())
1727 {
1728 namespacesTried.insert(name.str());
1729 size_t p = 0;
1730 for (;;)
1731 {
1732 size_t i = name.str().find("::",p);
1733 if (i==std::string::npos)
1734 {
1735 auto it = Doxygen::namespaceAliasMap.find(name.str());
1736 if (it != Doxygen::namespaceAliasMap.end())
1737 {
1738 //printf("found map %s->%s\n",qPrint(name),qPrint(it->second.alias));
1739 auto ns = getResolvedNamespaceRec(namespacesTried,it->second);
1740 if (ns)
1741 {
1742 result = replaceNamespaceAliasesRec(namespacesTried,ns->qualifiedName());
1743 }
1744 }
1745 break;
1746 }
1747 else
1748 {
1749 auto it = Doxygen::namespaceAliasMap.find(name.left(i).str());
1750 if (it != Doxygen::namespaceAliasMap.end())
1751 {
1752 //printf("found map %s|%s->%s\n",qPrint(name.left(i)),qPrint(name.mid(i)),qPrint(it->second.alias));
1753 auto ns = getResolvedNamespaceRec(namespacesTried,it->second);
1754 if (ns)
1755 {
1756 result = replaceNamespaceAliasesRec(namespacesTried,ns->qualifiedName()+name.mid(i));
1757 break;
1758 }
1759 }
1760 }
1761 p = i+2;
1762 }
1763 }
1764 //printf("< replaceNamespaceAliasesRec(%s)=%s\n",qPrint(name),qPrint(result));
1765 return result;
1766}
static NamespaceAliasInfoMap namespaceAliasMap
Definition doxygen.h:113
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
Definition qcstring.h:241
QCString left(size_t len) const
Definition qcstring.h:229
DirIterator end(const DirIterator &) noexcept
Definition dir.cpp:175

References end(), getResolvedNamespaceRec(), QCString::left(), QCString::mid(), Doxygen::namespaceAliasMap, replaceNamespaceAliasesRec(), and QCString::str().

Referenced by getResolvedNamespaceRec(), replaceNamespaceAliases(), and replaceNamespaceAliasesRec().

◆ toNamespaceDef() [1/3]

const NamespaceDef * toNamespaceDef ( const Definition * d)

Definition at line 1694 of file namespacedef.cpp.

1695{
1696 if (d && (typeid(*d)==typeid(NamespaceDefImpl) || typeid(*d)==typeid(NamespaceDefAliasImpl)))
1697 {
1698 return static_cast<const NamespaceDef*>(d);
1699 }
1700 else
1701 {
1702 return nullptr;
1703 }
1704}
An abstract interface of a namespace symbol.

◆ toNamespaceDef() [2/3]

◆ toNamespaceDef() [3/3]

NamespaceDef * toNamespaceDef ( DefinitionMutable * md)

Definition at line 1680 of file namespacedef.cpp.

1681{
1682 Definition *d = toDefinition(md);
1683 if (d && typeid(*d)==typeid(NamespaceDefImpl))
1684 {
1685 return static_cast<NamespaceDef*>(d);
1686 }
1687 else
1688 {
1689 return nullptr;
1690 }
1691}
The common base class of all entity definitions found in the sources.
Definition definition.h:76
Definition * toDefinition(DefinitionMutable *dm)

References toDefinition().

◆ toNamespaceDefMutable()