MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / isFunctionHead

Method isFunctionHead

lib/tokenlist.cpp:2330–2385  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2328}
2329
2330const Token * TokenList::isFunctionHead(const Token *tok, const std::string &suffix)
2331{
2332 if (!tok)
2333 return nullptr;
2334 if (tok->str() == "(")
2335 tok = tok->link();
2336 if (tok->str() != ")")
2337 return nullptr;
2338 if (!tok->isCpp() && !Token::Match(tok->link()->previous(), "%name%|(|)"))
2339 return nullptr;
2340 if (Token::Match(tok, ") ;|{|[")) {
2341 tok = tok->next();
2342 while (tok && tok->str() == "[" && tok->link()) {
2343 if (suffix.find(tok->str()) != std::string::npos)
2344 return tok;
2345 tok = tok->link()->next();
2346 }
2347 return (tok && suffix.find(tok->str()) != std::string::npos) ? tok : nullptr;
2348 }
2349 if (tok->isCpp() && tok->str() == ")") {
2350 tok = tok->next();
2351 while (Token::Match(tok, "const|noexcept|override|final|volatile|mutable|&|&& !!(") ||
2352 (Token::Match(tok, "%name% !!(") && tok->isUpperCaseName()))
2353 tok = tok->next();
2354 if (tok && tok->str() == ")")
2355 tok = tok->next();
2356 while (tok && tok->str() == "[")
2357 tok = tok->link()->next();
2358 if (Token::Match(tok, "throw|noexcept ("))
2359 tok = tok->linkAt(1)->next();
2360 if (Token::Match(tok, "%name% (") && tok->isUpperCaseName())
2361 tok = tok->linkAt(1)->next();
2362 if (tok && tok->originalName() == "->") { // trailing return type
2363 for (tok = tok->next(); tok && !Token::Match(tok, ";|{|override|final|}|)|]"); tok = tok->next())
2364 if (tok->link() && Token::Match(tok, "<|[|("))
2365 tok = tok->link();
2366 }
2367 while (Token::Match(tok, "override|final !!(") ||
2368 (Token::Match(tok, "%name% !!(") && tok->isUpperCaseName()))
2369 tok = tok->next();
2370 if (Token::Match(tok, "= 0|default|delete ;"))
2371 tok = tok->tokAt(2);
2372 if (Token::simpleMatch(tok, "requires")) {
2373 for (tok = tok->next(); tok && !Token::Match(tok, ";|{|}|)|]"); tok = tok->next()) {
2374 if (tok->link() && Token::Match(tok, "<|[|("))
2375 tok = tok->link();
2376 if (Token::simpleMatch(tok, "bool {"))
2377 tok = tok->linkAt(1);
2378 }
2379 }
2380 if (tok && tok->str() == ":" && !Token::Match(tok->next(), "%name%|::"))
2381 return nullptr;
2382 return (tok && suffix.find(tok->str()) != std::string::npos) ? tok : nullptr;
2383 }
2384 return nullptr;
2385}

Callers

nothing calls this directly

Calls 7

nextMethod · 0.80
isUpperCaseNameMethod · 0.80
linkAtMethod · 0.80
simpleMatchFunction · 0.70
strMethod · 0.45
findMethod · 0.45
tokAtMethod · 0.45

Tested by

no test coverage detected