- fixed a CppParser issue when parsing templates with default template args (such as Poco::SharedPtr)

This commit is contained in:
Guenter Obiltschnig 2012-11-10 12:01:18 +01:00
parent b402881343
commit 3d0eec828b

View File

@ -1,7 +1,7 @@
// //
// Symbol.cpp // Symbol.cpp
// //
// $Id: //poco/1.4/CppParser/src/Symbol.cpp#1 $ // $Id: //poco/1.4/CppParser/src/Symbol.cpp#2 $
// //
// Library: CppParser // Library: CppParser
// Package: SymbolTable // Package: SymbolTable
@ -160,8 +160,27 @@ std::string Symbol::extractName(const std::string& decl)
if (pos == std::string::npos || (pos > 0 && decl[pos - 1] == '(')) if (pos == std::string::npos || (pos > 0 && decl[pos - 1] == '('))
pos = decl.size(); pos = decl.size();
--pos; --pos;
// check for constant // check for constant; start searching after template
std::string::size_type eqPos = decl.find('='); std::string::size_type eqStart = 0;
if (decl.compare(0, 8, "template") == 0)
{
eqStart = 8;
while (std::isspace(decl[eqStart]) && eqStart < decl.size()) ++eqStart;
if (eqStart < decl.size() && decl[eqStart] == '<')
{
++eqStart;
int tc = 1;
while (tc > 0 && eqStart < decl.size())
{
if (decl[eqStart] == '<')
++tc;
else if (decl[eqStart] == '>')
--tc;
++eqStart;
}
}
}
std::string::size_type eqPos = decl.find('=', eqStart);
if (eqPos != std::string::npos) if (eqPos != std::string::npos)
{ {
// special case: default template parameter // special case: default template parameter