From 0f1f3c0f5f34a8203fc1c0b5af1d4a0ce267410e Mon Sep 17 00:00:00 2001 From: Edoardo Prezioso Date: Thu, 26 Jan 2012 22:27:31 +0100 Subject: [PATCH] Tokenizer::removeRedundantCondition: refactoring due to various reasons. 1) Remove the dead code with 'eraseDeadCode', not with 'eraseTokens' because of the possible presence of labels. 2) It's impossible that in tokenizer there is pattern like 'if (true|false) {code;} else if (cond) {code_cond;}' because the function 'Tokenizer::elseif' adds '{' between 'else' and 'if', hence a code path is redundant, so it's removed from code. --- lib/tokenize.cpp | 101 +++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 69 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 57e0be97b..b999c4fa3 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3944,93 +3944,56 @@ bool Tokenizer::removeRedundantConditions() continue; // Find matching else - const Token *elseTag = 0; + Token *elseTag = 0; // Find the closing "}" elseTag = tok->linkAt(4)->next(); - bool boolValue = false; - if (tok->strAt(2) == "true") - boolValue = true; + bool boolValue = (tok->strAt(2) == "true"); // Handle if with else - if (elseTag && elseTag->str() == "else") { - if (Token::simpleMatch(elseTag->next(), "if (")) { - // Handle "else if" - if (boolValue == false) { - // Convert "if( false ) {aaa;} else if() {bbb;}" => "if() {bbb;}" - Token::eraseTokens(tok, elseTag->tokAt(2)); - ret = true; - } else { - // Keep first if, remove every else if and else after it - const Token *lastTagInIf = elseTag->tokAt(2); - while (lastTagInIf) { - if (lastTagInIf->str() == "(") { - lastTagInIf = lastTagInIf->link()->next(); - } + if (Token::simpleMatch(elseTag, "else {")) { + // Handle else + if (boolValue == false) { + // Convert "if( false ) {aaa;} else {bbb;}" => "{bbb;}" or ";{bbb;}" - lastTagInIf = lastTagInIf->link()->next(); - if (!Token::simpleMatch(lastTagInIf, "else")) - break; - - lastTagInIf = lastTagInIf->next(); - if (lastTagInIf->str() == "if") - lastTagInIf = lastTagInIf->next(); - } - - Token::eraseTokens(elseTag->previous(), lastTagInIf); - ret = true; - } + //remove '(false)' + tok->deleteNext(3); + //delete dead code inside scope + eraseDeadCode(tok, elseTag); + //remove 'else' + elseTag->deleteThis(); + //remove 'if' + tok->deleteThis(); } else { - // Handle else - if (boolValue == false) { - // Convert "if( false ) {aaa;} else {bbb;}" => "{bbb;}" or ";{bbb;}" - if (tok->previous()) - tok = tok->previous(); - else - tok->str(";"); + // Convert "if( true ) {aaa;} else {bbb;}" => "{aaa;}" + const Token *end = elseTag->next()->link()->next(); - Token::eraseTokens(tok, elseTag->next()); - } else { - if (elseTag->next()->str() == "{") { - // Convert "if( true ) {aaa;} else {bbb;}" => "{aaa;}" - const Token *end = elseTag->next()->link(); + // Remove "else { bbb; }" + elseTag = elseTag->previous(); + eraseDeadCode(elseTag, end); - // Remove the "else { aaa; }" - Token::eraseTokens(elseTag->previous(), end->next()); - } - - // Remove "if( true )" - if (tok->previous()) - tok = tok->previous(); - else - tok->str(";"); - - tok->deleteNext(4); - } - - ret = true; + // Remove "if( true )" + tok->deleteNext(3); + tok->deleteThis(); } + + ret = true; } // Handle if without else else { if (boolValue == false) { - // Remove if and its content - if (tok->previous()) - tok = tok->previous(); - else - tok->str(";"); - - Token::eraseTokens(tok, elseTag); + //remove '(false)' + tok->deleteNext(3); + //delete dead code inside scope + eraseDeadCode(tok, elseTag); + //remove 'if' + tok->deleteThis(); } else { // convert "if( true ) {aaa;}" => "{aaa;}" - if (tok->previous()) - tok = tok->previous(); - else - tok->str(";"); - - tok->deleteNext(4); + tok->deleteNext(3); + tok->deleteThis(); } ret = true;