@@ -1675,31 +1675,111 @@ NamespaceDefMutable *toNamespaceDefMutable(Definition *d)
16751675
16761676// --- Helpers
16771677
1678+ static NamespaceDef *getResolvedNamespaceRec (StringSet &namespacesTried,const NamespaceAliasInfo &aliasInfo);
16781679
1679- NamespaceDef * getResolvedNamespace ( const QCString &name)
1680+ static QCString replaceNamespaceAliasesRec (StringSet &namespacesTried, const QCString &name)
16801681{
1681- if (name. isEmpty ()) return nullptr ;
1682- auto it = Doxygen::namespaceAliasMap. find (name. str ( ));
1683- if (it!=Doxygen::namespaceAliasMap .end ())
1682+ QCString result = name ;
1683+ // printf("> replaceNamespaceAliasesRec(%s)\n",qPrint(name ));
1684+ if (namespacesTried. find (name. str ())==namespacesTried .end ())
16841685 {
1685- int count=0 ; // recursion detection guard
1686- StringUnorderedMap::iterator it2;
1687- while ((it2=Doxygen::namespaceAliasMap.find (it->second ))!=Doxygen::namespaceAliasMap.end () &&
1688- count<10 )
1689- {
1690- it=it2;
1691- count++;
1692- }
1693- if (count==10 )
1686+ namespacesTried.insert (name.str ());
1687+ size_t p = 0 ;
1688+ for (;;)
16941689 {
1695- warn_uncond (" possible recursive namespace alias detected for %s!\n " ,qPrint (name));
1690+ size_t i = name.str ().find (" ::" ,p);
1691+ if (i==std::string::npos)
1692+ {
1693+ auto it = Doxygen::namespaceAliasMap.find (name.str ());
1694+ if (it != Doxygen::namespaceAliasMap.end ())
1695+ {
1696+ // printf("found map %s->%s\n",qPrint(name),qPrint(it->second.alias));
1697+ auto ns = getResolvedNamespaceRec (namespacesTried,it->second );
1698+ if (ns)
1699+ {
1700+ result = replaceNamespaceAliasesRec (namespacesTried,ns->qualifiedName ());
1701+ }
1702+ }
1703+ break ;
1704+ }
1705+ else
1706+ {
1707+ auto it = Doxygen::namespaceAliasMap.find (name.left (i).str ());
1708+ if (it != Doxygen::namespaceAliasMap.end ())
1709+ {
1710+ // printf("found map %s|%s->%s\n",qPrint(name.left(i)),qPrint(name.mid(i)),qPrint(it->second.alias));
1711+ auto ns = getResolvedNamespaceRec (namespacesTried,it->second );
1712+ if (ns)
1713+ {
1714+ result = replaceNamespaceAliasesRec (namespacesTried,ns->qualifiedName ()+name.mid (i));
1715+ break ;
1716+ }
1717+ }
1718+ }
1719+ p = i+2 ;
16961720 }
1697- return Doxygen::namespaceLinkedMap->find (it->second );
16981721 }
1699- else
1722+ // printf("< replaceNamespaceAliasesRec(%s)=%s\n",qPrint(name),qPrint(result));
1723+ return result;
1724+ }
1725+
1726+ static NamespaceDef *getResolvedNamespaceRec (StringSet &namespacesTried,const NamespaceAliasInfo &aliasInfo)
1727+ {
1728+ size_t j = aliasInfo.context .length ();
1729+ for (;;)
17001730 {
1701- return Doxygen::namespaceLinkedMap->find (name);
1731+ if (j>0 )
1732+ {
1733+ // printf("candidate %s|::%s\n",qPrint(aliasInfo.context.substr(0,j)),qPrint(aliasInfo.alias));
1734+ auto candidate = replaceNamespaceAliasesRec (namespacesTried,aliasInfo.context .substr (0 ,j)+" ::" +aliasInfo.alias );
1735+ auto nd = Doxygen::namespaceLinkedMap->find (candidate);
1736+ if (nd)
1737+ {
1738+ return nd;
1739+ }
1740+ }
1741+ if (j>0 ) // strip one level from context, i.e. given N1::N2::N3
1742+ // j==10 -> j==6 (N1::N2::N3->N1::N2), and then
1743+ // j==6 -> j==2 (N1::N2->N1), and then
1744+ // j==2 -> j==std::string::npos (N1->"")
1745+ {
1746+ j = aliasInfo.context .rfind (" ::" ,j-1 );
1747+ }
1748+ else
1749+ {
1750+ j = std::string::npos;
1751+ }
1752+ if (j==std::string::npos)
1753+ {
1754+ // printf("candidate %s\n",qPrint(aliasInfo.alias));
1755+ auto candidate = replaceNamespaceAliasesRec (namespacesTried,QCString (aliasInfo.alias ));
1756+ auto nd = Doxygen::namespaceLinkedMap->find (candidate);
1757+ if (nd)
1758+ {
1759+ return nd;
1760+ }
1761+ break ;
1762+ }
17021763 }
1764+ return nullptr ;
1765+ }
1766+
1767+ void replaceNamespaceAliases (QCString &name)
1768+ {
1769+ // printf("> replaceNamespaceAliases(%s)\n",qPrint(name));
1770+ StringSet namespacesTried;
1771+ name = replaceNamespaceAliasesRec (namespacesTried,name);
1772+ // printf("< replaceNamespaceAliases: result=%s\n",qPrint(name));
1773+ }
1774+
1775+ NamespaceDef *getResolvedNamespace (const QCString &name)
1776+ {
1777+ // printf("> getResolvedNamespace(%s)\n",qPrint(name));
1778+ if (name.isEmpty ()) return nullptr ;
1779+ StringSet namespacesTried;
1780+ auto ns = getResolvedNamespaceRec (namespacesTried,NamespaceAliasInfo (name.str ()));
1781+ // printf("< getResolvedNamespace(%s)=%s\n",qPrint(name),ns?qPrint(ns->qualifiedName()):"nullptr");
1782+ return ns;
17031783}
17041784
17051785// --------------------------------------------------------------------------------------
0 commit comments