| 2328 | } |
| 2329 | |
| 2330 | const 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 | } |
nothing calls this directly
no test coverage detected