Refactoring SymbolDatabase. Reuse Tokenizer::isFunctionHead().

This commit is contained in:
Daniel Marjamäki 2016-01-02 23:49:06 +01:00
parent 0a1d10bf2f
commit 66e047ee7d
2 changed files with 23 additions and 64 deletions

View File

@ -443,17 +443,32 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
function.arg = function.argDef;
// out of line function
if (Token::Match(end, ") const| &|&&| ;")) {
if (_tokenizer->isFunctionHead(end, ";")) {
// find the function implementation later
tok = end->next();
if (tok->str() == "const")
tok = tok->next();
if (tok->str() == "&") {
function.hasLvalRefQualifier(true);
tok = tok->next();
} else if (tok->str() == "&&") {
function.hasRvalRefQualifier(true);
tok = tok->next();
} else if (Token::simpleMatch(tok, "noexcept (")) {
function.isNoExcept(tok->strAt(2) != "false");
tok = tok->linkAt(1)->next();
} else if (Token::simpleMatch(tok, "throw (")) {
function.isThrow(true);
if (tok->strAt(2) != ")")
function.throwArg = end->tokAt(2);
tok = tok->linkAt(1)->next();
}
if (Token::Match(tok, "= 0|default ;")) {
function.isPure(tok->strAt(1) == "0");
tok = tok->tokAt(2);
}
scope->addFunction(function);
@ -491,68 +506,6 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
scope->addFunction(function);
}
// noexcept(...);
// noexcept(...) = 0;
// const noexcept(...);
// const noexcept(...) = 0;
else if (Token::Match(end, ") const| noexcept (") &&
(end->next()->str() == "const" ? Token::Match(end->linkAt(3), ") ;|=") :
Token::Match(end->linkAt(2), ") ;|="))) {
if (end->next()->str() == "const")
tok = end->tokAt(3);
else
tok = end->tokAt(2);
function.isNoExcept(tok->strAt(1) != "false");
if (Token::Match(tok->link()->next(), "= %any% ;")) {
function.isPure(true);
tok = tok->tokAt(2);
}
scope->addFunction(function);
}
// throw();
// throw() = 0;
// const throw();
// const throw() = 0;
else if (Token::Match(end, ") const| throw (") &&
(end->next()->str() == "const" ? Token::Match(end->linkAt(3), ") ;|=") :
Token::Match(end->linkAt(2), ") ;|="))) {
function.isThrow(true);
if (end->next()->str() == "const") {
if (end->strAt(4) != ")")
function.throwArg = end->tokAt(4);
tok = end->linkAt(3)->next();
} else {
if (end->strAt(3) != ")")
function.throwArg = end->tokAt(3);
tok = end->linkAt(2)->next();
}
if (Token::Match(tok, "= %any% ;")) {
function.isPure(true);
tok = tok->tokAt(2);
}
scope->addFunction(function);
}
// pure virtual function
else if (Token::Match(end, ") const| = %any% ;")) {
function.isPure(true);
if (end->next()->str() == "const")
tok = end->tokAt(4);
else
tok = end->tokAt(3);
scope->addFunction(function);
}
// 'const' or unknown macro (#5197)
else if (Token::Match(end, ") %any% ;")) {
tok = end->tokAt(2);

View File

@ -58,10 +58,14 @@ const Token * Tokenizer::isFunctionHead(const Token *tok, const std::string &end
return nullptr;
if (tok->str() == "(")
tok = tok->link();
if (Token::Match(tok, ") const| &|&&| [;:{]")) {
if (Token::Match(tok, ") const| &|&&| [;:{=]")) {
tok = tok->next();
if (tok->isName())
tok = tok->next();
if (Token::Match(tok, "&|&&"))
tok = tok->next();
if (Token::Match(tok, "= 0|default ;"))
tok = tok->tokAt(2);
return (endsWith.find(tok->str()) != std::string::npos) ? tok : nullptr;
}
if (isCPP() && Token::Match(tok, ") const| throw|noexcept (")) {
@ -71,6 +75,8 @@ const Token * Tokenizer::isFunctionHead(const Token *tok, const std::string &end
tok = tok->link()->next();
while (tok && tok->isName())
tok = tok->next();
if (Token::Match(tok, "= 0|default ;"))
tok = tok->tokAt(2);
return (tok && endsWith.find(tok->str()) != std::string::npos) ? tok : nullptr;
}
return nullptr;