Refactorized switchCaseFallThrough: Removed lots of obsolete code

This commit is contained in:
Philipp Kloke 2014-04-11 10:47:02 +02:00
parent 66329fe8b8
commit 20c3a5baf0
1 changed files with 5 additions and 70 deletions

View File

@ -980,70 +980,35 @@ void CheckOther::checkSwitchCaseFallThrough()
const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase(); const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase();
if (!symbolDatabase)
return;
for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) { for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
if (i->type != Scope::eSwitch || !i->classStart) // Find the beginning of a switch if (i->type != Scope::eSwitch || !i->classStart) // Find the beginning of a switch
continue; continue;
// Check the contents of the switch statement // Check the contents of the switch statement
std::stack<std::pair<Token *, bool> > ifnest; std::stack<std::pair<Token *, bool> > ifnest;
std::stack<Token *> loopnest;
std::stack<Token *> scopenest;
bool justbreak = true; bool justbreak = true;
bool firstcase = true; bool firstcase = true;
for (const Token *tok2 = i->classStart; tok2 != i->classEnd; tok2 = tok2->next()) { for (const Token *tok2 = i->classStart; tok2 != i->classEnd; tok2 = tok2->next()) {
if (Token::simpleMatch(tok2, "if (")) { if (Token::simpleMatch(tok2, "if (")) {
tok2 = tok2->next()->link()->next(); tok2 = tok2->next()->link()->next();
if (tok2->link() == nullptr) {
std::ostringstream errmsg;
errmsg << "unmatched if in switch: " << tok2->linenr();
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
break;
}
ifnest.push(std::make_pair(tok2->link(), false)); ifnest.push(std::make_pair(tok2->link(), false));
justbreak = false; justbreak = false;
} else if (Token::simpleMatch(tok2, "while (")) { } else if (Token::simpleMatch(tok2, "while (")) {
tok2 = tok2->next()->link()->next(); tok2 = tok2->next()->link()->next();
// skip over "do { } while ( ) ;" case if (tok2->link()) // skip over "do { } while ( ) ;" case
if (tok2->str() == "{") { tok2 = tok2->link();
if (tok2->link() == nullptr) {
std::ostringstream errmsg;
errmsg << "unmatched while in switch: " << tok2->linenr();
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
break;
}
loopnest.push(tok2->link());
}
justbreak = false; justbreak = false;
} else if (Token::simpleMatch(tok2, "do {")) { } else if (Token::simpleMatch(tok2, "do {")) {
tok2 = tok2->next(); tok2 = tok2->next()->link();
if (tok2->link() == nullptr) {
std::ostringstream errmsg;
errmsg << "unmatched do in switch: " << tok2->linenr();
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
break;
}
loopnest.push(tok2->link());
justbreak = false; justbreak = false;
} else if (Token::simpleMatch(tok2, "for (")) { } else if (Token::simpleMatch(tok2, "for (")) {
tok2 = tok2->next()->link()->next(); tok2 = tok2->next()->link()->next()->link();
if (tok2->link() == nullptr) {
std::ostringstream errmsg;
errmsg << "unmatched for in switch: " << tok2->linenr();
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
break;
}
loopnest.push(tok2->link());
justbreak = false; justbreak = false;
} else if (Token::simpleMatch(tok2, "switch (")) { } else if (Token::simpleMatch(tok2, "switch (")) {
// skip over nested switch, we'll come to that soon // skip over nested switch, we'll come to that soon
tok2 = tok2->next()->link()->next()->link(); tok2 = tok2->next()->link()->next()->link();
} else if (Token::Match(tok2, "break|continue|return|exit|goto|throw")) { } else if (Token::Match(tok2, "break|continue|return|exit|goto|throw")) {
if (loopnest.empty()) { justbreak = true;
justbreak = true;
}
tok2 = Token::findsimplematch(tok2, ";"); tok2 = Token::findsimplematch(tok2, ";");
} else if (Token::Match(tok2, "case|default")) { } else if (Token::Match(tok2, "case|default")) {
if (!justbreak && !firstcase) { if (!justbreak && !firstcase) {
@ -1052,51 +1017,21 @@ void CheckOther::checkSwitchCaseFallThrough()
tok2 = Token::findsimplematch(tok2, ":"); tok2 = Token::findsimplematch(tok2, ":");
justbreak = true; justbreak = true;
firstcase = false; firstcase = false;
} else if (tok2->str() == "{") {
scopenest.push(tok2->link());
} else if (tok2->str() == "}") { } else if (tok2->str() == "}") {
if (!ifnest.empty() && tok2 == ifnest.top().first) { if (!ifnest.empty() && tok2 == ifnest.top().first) {
if (tok2->next()->str() == "else") { if (tok2->next()->str() == "else") {
tok2 = tok2->tokAt(2); tok2 = tok2->tokAt(2);
ifnest.pop(); ifnest.pop();
if (tok2->link() == nullptr) {
std::ostringstream errmsg;
errmsg << "unmatched if in switch: " << tok2->linenr();
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
break;
}
ifnest.push(std::make_pair(tok2->link(), justbreak)); ifnest.push(std::make_pair(tok2->link(), justbreak));
justbreak = false; justbreak = false;
} else { } else {
justbreak &= ifnest.top().second; justbreak &= ifnest.top().second;
ifnest.pop(); ifnest.pop();
} }
} else if (!loopnest.empty() && tok2 == loopnest.top()) {
loopnest.pop();
} else if (!scopenest.empty() && tok2 == scopenest.top()) {
scopenest.pop();
} else {
if (!ifnest.empty() || !loopnest.empty() || !scopenest.empty()) {
std::ostringstream errmsg;
errmsg << "unexpected end of switch: ";
errmsg << "ifnest=" << ifnest.size();
if (!ifnest.empty())
errmsg << "," << ifnest.top().first->linenr();
errmsg << ", loopnest=" << loopnest.size();
if (!loopnest.empty())
errmsg << "," << loopnest.top()->linenr();
errmsg << ", scopenest=" << scopenest.size();
if (!scopenest.empty())
errmsg << "," << scopenest.top()->linenr();
reportError(_tokenizer->tokens(), Severity::debug, "debug", errmsg.str());
}
// end of switch block
break;
} }
} else if (tok2->str() != ";") { } else if (tok2->str() != ";") {
justbreak = false; justbreak = false;
} }
} }
} }
} }