From 65070cc067ec035b578810e200981a995bef2225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 24 Mar 2009 18:23:21 +0100 Subject: [PATCH] Simplify if conditions more.. simplifyIfAssign + simplifyIfNot --- src/tokenize.cpp | 40 ++++++++++++++++++++++++++++++++++++- src/tokenize.h | 6 ++++++ test/testsimplifytokens.cpp | 27 +++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 4b3134d75..a2b698547 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -1135,6 +1135,7 @@ void Tokenizer::simplifyTokenList() simplifyFunctionParameters(); elseif(); + simplifyIfNot(); simplifyIfAssign(); for (Token *tok = _tokens; tok; tok = tok->next()) @@ -1812,10 +1813,21 @@ bool Tokenizer::simplifyIfAssign() bool ret = false; for (Token *tok = _tokens; tok; tok = tok->next()) { - if (Token::Match(tok->next(), "if ( (| %var% =")) + if (Token::Match(tok->next(), "if ( (| %var% =") || + Token::Match(tok->next(), "if ( ! ( %var% =")) { + // delete the "if" tok->deleteNext(); + // Remember if there is a "!" or not. And delete it if there are. + bool isNot = false; + if (Token::simpleMatch(tok->tokAt(2), "!")) + { + isNot = true; + tok->next()->deleteNext(); + } + + // Delete paranthesis.. and remember how many there are. int numpar = 0; while (tok->next()->str() == "(") { @@ -1823,6 +1835,7 @@ bool Tokenizer::simplifyIfAssign() tok->deleteNext(); } + // Skip the "%var% = ..." Token *tok2 = tok; int indentlevel = 0; for (tok2 = tok; tok2; tok2 = tok2->next()) @@ -1836,12 +1849,16 @@ bool Tokenizer::simplifyIfAssign() --indentlevel; } } + + // Insert "; if ( .." if (tok2) { tok2 = tok2->previous(); tok2->insertToken(tok->strAt(1)); for (int p = 0; p < numpar; ++p) tok2->insertToken("("); + if (isNot) + tok2->next()->insertToken("!"); tok2->insertToken("if"); tok2->insertToken(";"); ret = true; @@ -1852,6 +1869,27 @@ bool Tokenizer::simplifyIfAssign() } + +bool Tokenizer::simplifyIfNot() +{ + bool ret = false; + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (Token::Match(tok, "if ( 0 == %var% )") || Token::simpleMatch(tok, "if ( 0 == (")) + { + tok = tok->next(); + tok->deleteNext(); + tok->next()->str("!"); + tok = tok->tokAt(3); + ret = true; + } + } + return ret; +} + + + + bool Tokenizer::simplifyKnownVariables() { bool ret = false; diff --git a/src/tokenize.h b/src/tokenize.h index bdd606614..71e54c738 100644 --- a/src/tokenize.h +++ b/src/tokenize.h @@ -101,6 +101,12 @@ public: */ bool simplifyIfAssign(); + /** + * simplify if-not.. + * Example: "if(0==x);" => "if(!x);" + */ + bool simplifyIfNot(); + protected: /** Add braces to an if-block diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index bf71275df..59eca94d1 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -87,6 +87,9 @@ private: // Assignment in condition.. TEST_CASE(ifassign1); + + // "if(0==x)" => "if(!x)" + TEST_CASE(ifnot); } std::string tok(const char code[]) @@ -569,6 +572,30 @@ private: { ASSERT_EQUALS("; a = b ; if ( a ) ;", simplifyIfAssign(";if(a=b);")); ASSERT_EQUALS("; a = b ( ) ; if ( ( a ) ) ;", simplifyIfAssign(";if((a=b()));")); + ASSERT_EQUALS("; a = b ( ) ; if ( ! ( a ) ) ;", simplifyIfAssign(";if(!(a=b()));")); + } + + + std::string simplifyIfNot(const char code[]) + { + // tokenize.. + Tokenizer tokenizer; + std::istringstream istr(code); + tokenizer.tokenize(istr, "test.cpp"); + + tokenizer.simplifyIfNot(); + + std::ostringstream ostr; + for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) + ostr << (tok->previous() ? " " : "") << tok->str(); + + return ostr.str(); + } + + void ifnot() + { + ASSERT_EQUALS("if ( ! x )", simplifyIfNot("if(0==x)")); + ASSERT_EQUALS("if ( ! ( a = b ) )", simplifyIfNot("if(0==(a=b))")); } };