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

Method removeMacrosInGlobalScope

lib/tokenize.cpp:6673–6748  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6671}
6672
6673void Tokenizer::removeMacrosInGlobalScope()
6674{
6675 for (Token *tok = list.front(); tok; tok = tok->next()) {
6676 if (tok->str() == "(") {
6677 tok = tok->link();
6678 if (Token::Match(tok, ") %type% {") &&
6679 !tok->next()->isStandardType() &&
6680 !tok->next()->isKeyword() &&
6681 !Token::Match(tok->next(), "override|final") &&
6682 tok->next()->isUpperCaseName())
6683 tok->deleteNext();
6684 }
6685
6686 if (Token::Match(tok, "%type%") && tok->isUpperCaseName() &&
6687 (!tok->previous() || Token::Match(tok->previous(), "[;{}]") || (tok->previous()->isName() && endsWith(tok->strAt(-1), ':')))) {
6688 const Token *tok2 = tok->next();
6689 if (tok2 && tok2->str() == "(")
6690 tok2 = tok2->link()->next();
6691
6692 // Several unknown macros...
6693 while (Token::Match(tok2, "%type% (") && tok2->isUpperCaseName())
6694 tok2 = tok2->linkAt(1)->next();
6695
6696 if (Token::Match(tok, "%name% (") && Token::Match(tok2, "%name% *|&|::|<| %name%") &&
6697 !Token::Match(tok2, "requires|namespace|class|struct|union|private:|protected:|public:"))
6698 unknownMacroError(tok);
6699
6700 if (Token::Match(tok, "%type% (") && Token::Match(tok2, "%type% (") && !Token::Match(tok2, "noexcept|throw") && TokenList::isFunctionHead(tok2->next(), ":;{"))
6701 unknownMacroError(tok);
6702
6703 // remove unknown macros before namespace|class|struct|union
6704 if (Token::Match(tok2, "namespace|class|struct|union")) {
6705 // is there a "{" for?
6706 const Token *tok3 = tok2;
6707 while (tok3 && !Token::Match(tok3,"[;{}()]"))
6708 tok3 = tok3->next();
6709 if (tok3 && tok3->str() == "{") {
6710 Token::eraseTokens(tok, tok2);
6711 tok->deleteThis();
6712 }
6713 continue;
6714 }
6715
6716 // replace unknown macros before foo(
6717 /*
6718 if (Token::Match(tok2, "%type% (") && TokenList::isFunctionHead(tok2->next(), "{")) {
6719 std::string typeName;
6720 for (const Token* tok3 = tok; tok3 != tok2; tok3 = tok3->next())
6721 typeName += tok3->str();
6722 Token::eraseTokens(tok, tok2);
6723 tok->str(typeName);
6724 }
6725 */
6726 // remove unknown macros before foo::foo(
6727 if (Token::Match(tok2, "%type% :: %type%")) {
6728 const Token *tok3 = tok2;
6729 while (Token::Match(tok3, "%type% :: %type% ::"))
6730 tok3 = tok3->tokAt(2);

Callers

nothing calls this directly

Calls 11

frontMethod · 0.80
nextMethod · 0.80
isUpperCaseNameMethod · 0.80
deleteNextMethod · 0.80
linkAtMethod · 0.80
deleteThisMethod · 0.80
endsWithFunction · 0.70
strMethod · 0.45
isStandardTypeMethod · 0.45
isKeywordMethod · 0.45
tokAtMethod · 0.45

Tested by

no test coverage detected