| 11110 | } |
| 11111 | |
| 11112 | void Tokenizer::simplifyNamespaceAliases() |
| 11113 | { |
| 11114 | if (!isCPP()) |
| 11115 | return; |
| 11116 | |
| 11117 | int scope = 0; |
| 11118 | |
| 11119 | for (Token *tok = list.front(); tok; tok = tok->next()) { |
| 11120 | bool isPrev{}; |
| 11121 | if (tok->str() == "{") |
| 11122 | scope++; |
| 11123 | else if (tok->str() == "}") |
| 11124 | scope--; |
| 11125 | else if (Token::Match(tok, "namespace %name% =") || (isPrev = Token::Match(tok->previous(), "namespace %name% ="))) { |
| 11126 | if (isPrev) |
| 11127 | tok = tok->previous(); |
| 11128 | if (tok->tokAt(-1) && !Token::Match(tok->tokAt(-1), "[;{}]")) |
| 11129 | syntaxError(tok->tokAt(-1)); |
| 11130 | const std::string name(tok->strAt(1)); |
| 11131 | Token * tokNameStart = tok->tokAt(3); |
| 11132 | Token * tokNameEnd = tokNameStart; |
| 11133 | |
| 11134 | while (tokNameEnd && tokNameEnd->next() && tokNameEnd->strAt(1) != ";") { |
| 11135 | if (tokNameEnd->str() == "(") { |
| 11136 | if (tokNameEnd->previous()->isName()) |
| 11137 | unknownMacroError(tokNameEnd->previous()); |
| 11138 | else |
| 11139 | syntaxError(tokNameEnd); |
| 11140 | } |
| 11141 | tokNameEnd = tokNameEnd->next(); |
| 11142 | } |
| 11143 | |
| 11144 | if (!tokNameEnd) |
| 11145 | return; // syntax error |
| 11146 | |
| 11147 | int endScope = scope; |
| 11148 | Token * tokLast = tokNameEnd->next(); |
| 11149 | if (!tokLast) |
| 11150 | return; |
| 11151 | Token * tokNext = tokLast->next(); |
| 11152 | Token * tok2 = tokNext; |
| 11153 | |
| 11154 | while (tok2 && endScope >= scope) { |
| 11155 | if (Token::simpleMatch(tok2, "{")) |
| 11156 | endScope++; |
| 11157 | else if (Token::simpleMatch(tok2, "}")) |
| 11158 | endScope--; |
| 11159 | else if (tok2->str() == name) { |
| 11160 | if (Token::Match(tok2->previous(), "namespace %name% =")) { |
| 11161 | // check for possible duplicate aliases |
| 11162 | if (sameTokens(tokNameStart, tokNameEnd, tok2->tokAt(2))) { |
| 11163 | // delete duplicate |
| 11164 | tok2 = deleteAlias(tok2->previous()); |
| 11165 | continue; |
| 11166 | } |
| 11167 | // conflicting declaration (syntax error) |
| 11168 | // cppcheck-suppress duplicateBranch - remove when TODO below is addressed |
| 11169 | if (endScope == scope) { |
nothing calls this directly
no test coverage detected