From 70bfa890a80dd090b4f04b4354b1d5878a633c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 13 Jun 2010 08:00:46 +0200 Subject: [PATCH] Fixed #1718 (Tokenizer add close braces to for loop at wrong place when if-else presents inside) --- lib/tokenize.cpp | 46 +++++++++++++++++++------------------------ test/testtokenize.cpp | 42 +++++++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 4682777aa..c548e16f4 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3864,6 +3864,12 @@ void Tokenizer::simplifyIfAddBraces() { for (Token *tok = _tokens; tok; tok = tok ? tok->next() : NULL) { + if (tok->str() == "(") + { + tok = tok->link(); + continue; + } + if (tok->previous() && !Token::Match(tok->previous(), ";|{|}|else|)|:")) continue; @@ -3920,42 +3926,30 @@ void Tokenizer::simplifyIfAddBraces() // * if (cond) for (;;) break; // * if (cond1) if (cond2) { } // * if (cond1) if (cond2) ; else ; - int parlevel = 0; - int indentlevel = 0; while ((tempToken = tempToken->next()) != NULL) { if (tempToken->str() == "{") - ++indentlevel; - - else if (tempToken->str() == "}") { - --indentlevel; - if (indentlevel == 0 && parlevel == 0) + tempToken = tempToken->link(); + if (tempToken->next()->isName() && tempToken->next()->str() != "else") break; - - else if (indentlevel < 0 && parlevel == 0) - { - // insert closing brace before this - tempToken = tempToken->previous(); - break; - } + continue; } - else if (tempToken->str() == "(") - ++parlevel; - - else if (tempToken->str() == ")") + if (tempToken->str() == "(") { - if (parlevel == 0) - { - tok->deleteThis(); - tempToken = 0; - break; - } - --parlevel; + tempToken = tempToken->link(); + continue; } - else if (indentlevel == 0 && parlevel == 0 && tempToken->str() == ";") + if (tempToken->str() == "}") + { + // insert closing brace before this token + tempToken = tempToken->previous(); + break; + } + + if (tempToken->str() == ";") { if (!innerIf) break; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 25f9e28d0..a800665df 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -76,6 +76,8 @@ private: TEST_CASE(whileAddBraces); TEST_CASE(doWhileAddBraces); + TEST_CASE(forAddBraces); + TEST_CASE(pointers_condition); TEST_CASE(simplifyKnownVariables1); @@ -656,10 +658,8 @@ private: void whileAddBraces() { - { - const char code[] = ";while(a);"; - ASSERT_EQUALS("; while ( a ) { ; }", tokenizeAndStringify(code, true)); - } + const char code[] = ";while(a);"; + ASSERT_EQUALS("; while ( a ) { ; }", tokenizeAndStringify(code, true)); } void doWhileAddBraces() @@ -722,6 +722,40 @@ private: } } + void forAddBraces() + { + { + const char code[] = "void f() {\n" + " for(;;)\n" + " if (a) { }\n" + " else { }\n" + "}"; + const char expected[] = "void f ( ) {\n" + "for ( ; ; ) {\n" + "if ( a ) { }\n" + "else { } }\n" + "}"; + ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); + } + + { + const char code[] = "void f() {\n" + " for(;;)\n" + " if (a) { }\n" + " else if (b) { }\n" + " else { }\n" + "}"; + const char expected[] = "void f ( ) {\n" + "for ( ; ; ) {\n" + "if ( a ) { }\n" + "else { if ( b ) { }\n" + "else { } } }\n" + "}"; + ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); + } + } + + std::string simplifyKnownVariables(const char code[]) { Tokenizer tokenizer;