tokenizer: simplify redundant paranthesis
This commit is contained in:
parent
9fb11bbfcc
commit
ca0f007ca4
|
@ -915,6 +915,7 @@ void Tokenizer::simplifyTokenList()
|
||||||
modified |= simplifyFunctionReturn();
|
modified |= simplifyFunctionReturn();
|
||||||
modified |= simplifyKnownVariables();
|
modified |= simplifyKnownVariables();
|
||||||
modified |= removeReduntantConditions();
|
modified |= removeReduntantConditions();
|
||||||
|
modified |= simplifyRedundantParanthesis();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
@ -1367,6 +1368,39 @@ bool Tokenizer::simplifyKnownVariables()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Tokenizer::simplifyRedundantParanthesis()
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (Token::simpleMatch(tok, "( ("))
|
||||||
|
{
|
||||||
|
int parlevel = 0;
|
||||||
|
for (Token *tok2 = tok; tok2; tok2 = tok2->next())
|
||||||
|
{
|
||||||
|
if (tok2->str() == "(")
|
||||||
|
++parlevel;
|
||||||
|
|
||||||
|
else if (tok2->str() == ")")
|
||||||
|
{
|
||||||
|
--parlevel;
|
||||||
|
if (parlevel == 1)
|
||||||
|
{
|
||||||
|
if (Token::simpleMatch(tok2, ") )"))
|
||||||
|
{
|
||||||
|
tok->deleteNext();
|
||||||
|
tok2->deleteNext();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Helper functions for handling the tokens list
|
// Helper functions for handling the tokens list
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
298
src/tokenize.h
298
src/tokenize.h
|
@ -1,146 +1,152 @@
|
||||||
/*
|
/*
|
||||||
* Cppcheck - A tool for static C/C++ code analysis
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
* Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam,
|
* Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam,
|
||||||
* Leandro Penz, Kimmo Varis
|
* Leandro Penz, Kimmo Varis
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/
|
* along with this program. If not, see <http://www.gnu.org/licenses/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#ifndef tokenizeH
|
#ifndef tokenizeH
|
||||||
#define tokenizeH
|
#define tokenizeH
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "errorlogger.h"
|
#include "errorlogger.h"
|
||||||
#include "token.h"
|
#include "token.h"
|
||||||
|
|
||||||
class Tokenizer
|
class Tokenizer
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// Deallocate lists..
|
// Deallocate lists..
|
||||||
void DeallocateTokens();
|
void DeallocateTokens();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Tokenizer();
|
Tokenizer();
|
||||||
~Tokenizer();
|
~Tokenizer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tokenize code
|
* Tokenize code
|
||||||
* @param code input stream for code
|
* @param code input stream for code
|
||||||
* @param FileName The filename
|
* @param FileName The filename
|
||||||
*/
|
*/
|
||||||
void tokenize(std::istream &code, const char FileName[]);
|
void tokenize(std::istream &code, const char FileName[]);
|
||||||
|
|
||||||
/** Set variable id */
|
/** Set variable id */
|
||||||
void setVarId();
|
void setVarId();
|
||||||
|
|
||||||
/** Simplify tokenlist */
|
/** Simplify tokenlist */
|
||||||
void simplifyTokenList();
|
void simplifyTokenList();
|
||||||
|
|
||||||
|
|
||||||
// Helper functions for handling the tokens list..
|
// Helper functions for handling the tokens list..
|
||||||
|
|
||||||
static void deleteTokens(Token *tok);
|
static void deleteTokens(Token *tok);
|
||||||
static const char *getParameterName(const Token *ftok, int par);
|
static const char *getParameterName(const Token *ftok, int par);
|
||||||
|
|
||||||
static bool SameFileName(const char fname1[], const char fname2[]);
|
static bool SameFileName(const char fname1[], const char fname2[]);
|
||||||
|
|
||||||
|
|
||||||
std::string fileLine(const Token *tok) const;
|
std::string fileLine(const Token *tok) const;
|
||||||
|
|
||||||
// Return size.
|
// Return size.
|
||||||
int SizeOfType(const char type[]) const;
|
int SizeOfType(const char type[]) const;
|
||||||
|
|
||||||
void initTokens();
|
void initTokens();
|
||||||
|
|
||||||
const std::vector<std::string> *getFiles() const;
|
const std::vector<std::string> *getFiles() const;
|
||||||
|
|
||||||
void fillFunctionList();
|
void fillFunctionList();
|
||||||
const Token *GetFunctionTokenByName(const char funcname[]) const;
|
const Token *GetFunctionTokenByName(const char funcname[]) const;
|
||||||
const Token *tokens() const;
|
const Token *tokens() const;
|
||||||
|
|
||||||
|
|
||||||
#ifndef UNIT_TESTING
|
#ifndef UNIT_TESTING
|
||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds matching "end" for "start".
|
* Finds matching "end" for "start".
|
||||||
* @param tok The start tag
|
* @param tok The start tag
|
||||||
* @param start e.g. "{"
|
* @param start e.g. "{"
|
||||||
* @param end e.g. "}"
|
* @param end e.g. "}"
|
||||||
* @return The end tag that matches given parameter or 0 if not found.
|
* @return The end tag that matches given parameter or 0 if not found.
|
||||||
*/
|
*/
|
||||||
static const Token *findClosing(const Token *tok, const char *start, const char *end);
|
static const Token *findClosing(const Token *tok, const char *start, const char *end);
|
||||||
|
|
||||||
void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno);
|
void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno);
|
||||||
|
|
||||||
/** Add braces to an if-block
|
/** Add braces to an if-block
|
||||||
* @return true if something is modified
|
* @return true if something is modified
|
||||||
* false if nothing is done.
|
* false if nothing is done.
|
||||||
*/
|
*/
|
||||||
bool simplifyIfAddBraces();
|
bool simplifyIfAddBraces();
|
||||||
|
|
||||||
/** Simplify conditions
|
/** Simplify conditions
|
||||||
* @return true if something is modified
|
* @return true if something is modified
|
||||||
* false if nothing is done.
|
* false if nothing is done.
|
||||||
*/
|
*/
|
||||||
bool simplifyConditions();
|
bool simplifyConditions();
|
||||||
|
|
||||||
/** Remove reduntant code, e.g. if( false ) { int a; } should be
|
/** Remove reduntant code, e.g. if( false ) { int a; } should be
|
||||||
* removed, because it is never executed.
|
* removed, because it is never executed.
|
||||||
* @return true if something is modified
|
* @return true if something is modified
|
||||||
* false if nothing is done.
|
* false if nothing is done.
|
||||||
*/
|
*/
|
||||||
bool removeReduntantConditions();
|
bool removeReduntantConditions();
|
||||||
|
|
||||||
/** Simplify casts
|
/** Simplify casts
|
||||||
* @return true if something is modified
|
* @return true if something is modified
|
||||||
* false if nothing is done.
|
* false if nothing is done.
|
||||||
*/
|
*/
|
||||||
bool simplifyCasts();
|
bool simplifyCasts();
|
||||||
|
|
||||||
/** Simplify function calls - constant return value
|
/** Simplify function calls - constant return value
|
||||||
* @return true if something is modified
|
* @return true if something is modified
|
||||||
* false if nothing is done.
|
* false if nothing is done.
|
||||||
*/
|
*/
|
||||||
bool simplifyFunctionReturn();
|
bool simplifyFunctionReturn();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simplify function that replaces a variable with its value in cases
|
* A simplify function that replaces a variable with its value in cases
|
||||||
* when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)"
|
* when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)"
|
||||||
*
|
*
|
||||||
* @param token The token list to check and modify.
|
* @return true if modifications to token-list are done.
|
||||||
* @return true if modifications to token-list are done.
|
* false if no modifications are done.
|
||||||
* false if no modifications are done.
|
*/
|
||||||
*/
|
bool simplifyKnownVariables();
|
||||||
bool simplifyKnownVariables();
|
|
||||||
|
/**
|
||||||
void InsertTokens(Token *dest, Token *src, unsigned int n);
|
* Remove redundant paranthesis: "((x))" => "(x)"
|
||||||
|
* @return true if modifications to token-list are done.
|
||||||
Token *_tokensBack;
|
* false if no modifications are done.
|
||||||
std::map<std::string, unsigned int> _typeSize;
|
*/
|
||||||
std::vector<const Token *> _functionList;
|
bool simplifyRedundantParanthesis();
|
||||||
std::vector<std::string> _files;
|
|
||||||
Token *_tokens;
|
void InsertTokens(Token *dest, Token *src, unsigned int n);
|
||||||
};
|
|
||||||
|
Token *_tokensBack;
|
||||||
//---------------------------------------------------------------------------
|
std::map<std::string, unsigned int> _typeSize;
|
||||||
#endif
|
std::vector<const Token *> _functionList;
|
||||||
|
std::vector<std::string> _files;
|
||||||
|
Token *_tokens;
|
||||||
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#endif
|
||||||
|
|
|
@ -75,7 +75,7 @@ private:
|
||||||
|
|
||||||
// TODO TEST_CASE(simplify_function_parameters);
|
// TODO TEST_CASE(simplify_function_parameters);
|
||||||
|
|
||||||
// TODO TEST_CASE(reduce_redundant_paranthesis); // Ticket #61
|
TEST_CASE(reduce_redundant_paranthesis); // Ticket #61
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue