Refactorized stringification of tokens:

- Function that stringifies one token: Token::stringify()
- Functions that stringify a list of tokens: Token::stringifyList()
-- Single and powerful "base" function, used by several "light" functions
Refactorized
- testtokenize.cpp and testsimplifytokens.cpp: Use improved stringification functions instead of several local implementations
- Avoided redundand creation of std::string when using TestTokenizer::tokenizeAndStringify and in cmdlineparser.cpp
This commit is contained in:
PKEuS 2012-04-16 19:51:07 +02:00
parent 5ad1840120
commit bac8ed7127
7 changed files with 149 additions and 270 deletions

View File

@ -148,7 +148,7 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
std::ifstream f(filename.c_str());
if (!f.is_open()) {
PrintMessage("cppcheck: Couldn't open the file: \"" + std::string(filename) + "\".");
PrintMessage("cppcheck: Couldn't open the file: \"" + filename + "\".");
return false;
}
const std::string errmsg(_settings->nofail.parseFile(f));
@ -164,7 +164,7 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
std::ifstream f(filename.c_str());
if (!f.is_open()) {
std::string message("cppcheck: Couldn't open the file: \"");
message += std::string(filename);
message += filename;
message += "\".";
if (count(filename.begin(), filename.end(), ',') > 0 ||
count(filename.begin(), filename.end(), '.') > 1) {
@ -604,7 +604,7 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
_settings->platform(Settings::Unix64);
else {
std::string message("cppcheck: error: unrecognized platform: \"");
message += argv[i];
message += platform;
message += "\".";
PrintMessage(message);
return false;

View File

@ -2558,7 +2558,7 @@ void CheckOther::checkDuplicateIf()
std::map<std::string, const Token*> expressionMap;
// get the expression from the token stream
std::string expression = tok->tokAt(2)->stringify(tok->next()->link());
std::string expression = tok->tokAt(2)->stringifyList(tok->next()->link());
// save the expression and its location
expressionMap.insert(std::make_pair(expression, tok));
@ -2570,7 +2570,7 @@ void CheckOther::checkDuplicateIf()
while (Token::simpleMatch(tok1, "} else if (") &&
Token::simpleMatch(tok1->linkAt(3), ") {")) {
// get the expression from the token stream
expression = tok1->tokAt(4)->stringify(tok1->linkAt(3));
expression = tok1->tokAt(4)->stringifyList(tok1->linkAt(3));
// try to look up the expression to check for duplicates
std::map<std::string, const Token *>::iterator it = expressionMap.find(expression);
@ -2630,13 +2630,13 @@ void CheckOther::checkDuplicateBranch()
if (tok && tok->next() && Token::simpleMatch(tok->next()->link(), ") {") &&
Token::simpleMatch(tok->next()->link()->next()->link(), "} else {")) {
// save if branch code
std::string branch1 = tok->next()->link()->tokAt(2)->stringify(tok->next()->link()->next()->link());
std::string branch1 = tok->next()->link()->tokAt(2)->stringifyList(tok->next()->link()->next()->link());
// find else branch
const Token *tok1 = tok->next()->link()->next()->link();
// save else branch code
std::string branch2 = tok1->tokAt(3)->stringify(tok1->linkAt(2));
std::string branch2 = tok1->tokAt(3)->stringifyList(tok1->linkAt(2));
// check for duplicates
if (branch1 == branch2)

View File

@ -894,60 +894,44 @@ void Token::createMutualLinks(Token *begin, Token *end)
void Token::printOut(const char *title) const
{
const std::vector<std::string> fileNames;
std::cout << stringifyList(true, title, fileNames) << std::endl;
if (title)
std::cout << "\n### " << title << " ###\n";
std::cout << stringifyList(true, true, true, true, true, 0, 0) << std::endl;
}
void Token::printOut(const char *title, const std::vector<std::string> &fileNames) const
{
std::cout << stringifyList(true, title, fileNames) << std::endl;
if (title)
std::cout << "\n### " << title << " ###\n";
std::cout << stringifyList(true, true, true, true, true, &fileNames, 0) << std::endl;
}
std::string Token::stringify(const Token* end) const
void Token::stringify(std::ostream& os, bool varid, bool attributes) const
{
if (attributes) {
if (isUnsigned())
os << "unsigned ";
else if (isSigned())
os << "signed ";
if (isLong())
os << "long ";
}
os << _str;
if (varid && _varId != 0)
os << '@' << _varId;
}
std::string Token::stringifyList(bool varid, bool attributes, bool linenumbers, bool linebreaks, bool files, const std::vector<std::string>* fileNames, const Token* end) const
{
if (this == end)
return "";
std::ostringstream ret;
if (isUnsigned())
ret << "unsigned ";
else if (isSigned())
ret << "signed ";
if (isLong())
ret << "long ";
ret << str();
for (const Token *tok = this->next(); tok && tok != end; tok = tok->next()) {
if (tok->str().empty())
continue;
if (tok->isUnsigned())
ret << " unsigned";
else if (tok->isSigned())
ret << " signed";
if (tok->isLong())
ret << " long";
ret << ' ' << tok->str();
}
return ret.str();
}
std::string Token::stringifyList(bool varid, const char *title) const
{
const std::vector<std::string> fileNames;
return stringifyList(varid, title, fileNames);
}
std::string Token::stringifyList(bool varid, const char *title, const std::vector<std::string> &fileNames) const
{
std::ostringstream ret;
if (title)
ret << "\n### " << title << " ###\n";
unsigned int lineNumber = 0;
int fileInd = -1;
unsigned int lineNumber = _linenr;
int fileInd = files?-1:_fileIndex;
std::map<int, unsigned int> lineNumbers;
for (const Token *tok = this; tok; tok = tok->next()) {
for (const Token *tok = this; tok != end; tok = tok->next()) {
bool fileChange = false;
if (static_cast<int>(tok->_fileIndex) != fileInd) {
if (fileInd != -1) {
@ -955,29 +939,46 @@ std::string Token::stringifyList(bool varid, const char *title, const std::vecto
}
fileInd = static_cast<int>(tok->_fileIndex);
ret << "\n\n##file ";
if (fileNames.size() > tok->_fileIndex)
ret << fileNames.at(tok->_fileIndex);
else
ret << fileInd;
if (files) {
ret << "\n\n##file ";
if (fileNames && fileNames->size() > tok->_fileIndex)
ret << fileNames->at(tok->_fileIndex);
else
ret << fileInd;
}
lineNumber = lineNumbers[fileInd];
fileChange = true;
}
if (lineNumber != tok->linenr() || fileChange) {
if (linebreaks && (lineNumber != tok->linenr() || fileChange)) {
while (lineNumber < tok->linenr()) {
++lineNumber;
ret << '\n' << lineNumber << ':';
ret << '\n';
if (linenumbers) {
ret << lineNumber << ':';
if (lineNumber == tok->linenr())
ret << ' ';
}
}
lineNumber = tok->linenr();
}
ret << ' ' << tok->str();
if (varid && tok->varId() > 0)
ret << '@' << tok->varId();
tok->stringify(ret, varid, attributes); // print token
if (tok->next() != end && (!linebreaks || (tok->next()->linenr() <= tok->linenr() && tok->next()->fileIndex() == tok->fileIndex())))
ret << ' ';
}
ret << '\n';
if (linebreaks && files)
ret << '\n';
return ret.str();
}
std::string Token::stringifyList(const Token* end, bool attributes) const
{
return stringifyList(false, attributes, false, false, false, 0, end);
}
std::string Token::stringifyList(bool varid) const
{
return stringifyList(varid, false, true, true, true, 0, 0);
}

View File

@ -21,6 +21,7 @@
#include <string>
#include <vector>
#include <ostream>
/// @addtogroup Core
/// @{
@ -333,10 +334,29 @@ public:
*/
static void replace(Token *replaceThis, Token *start, Token *end);
/** Stringify a token list (with or without varId) */
std::string stringify(const Token* end) const;
std::string stringifyList(bool varid = false, const char *title = 0) const;
std::string stringifyList(bool varid, const char *title, const std::vector<std::string> &fileNames) const;
/**
* Stringify a token
* @param os The result is shifted into that output stream
* @param varid Print varids. (Style: "varname@id")
* @param attributes Print attributes of tokens like "unsigned" in front of it.
*/
void stringify(std::ostream& os, bool varid, bool attributes) const;
/**
* Stringify a list of token, from current instance on.
* @param varid Print varids. (Style: "varname@id")
* @param attributes Print attributes of tokens like "unsigned" in front of it.
* @param linenumbers Print line number in front of each line
* @param linebreaks Insert \n into string when line number changes
* @param files print Files as numbers or as names (if fileNames is given)
* @param fileNames Vector of filenames. Used (if given) to print filenames as strings instead of numbers.
* @param title Prints a title on top of output
* @param end Stringification ends before this token is reached. 0 to stringify until end of list.
* @return Stringified token list as a string
*/
std::string stringifyList(bool varid, bool attributes, bool linenumbers, bool linebreaks, bool files, const std::vector<std::string>* fileNames = 0, const Token* end = 0) const;
std::string stringifyList(const Token* end, bool attributes = true) const;
std::string stringifyList(bool varid = false) const;
/**
* Remove the contents for this token from the token list.

View File

@ -2488,7 +2488,7 @@ void Tokenizer::simplifySQL()
while (end && end->str() != ";")
end = end->next();
std::string instruction = tok->stringify(end);
std::string instruction = tok->stringifyList(end);
// delete all tokens until ';'
Token::eraseTokens(tok, end);
@ -8977,7 +8977,7 @@ void Tokenizer::simplifyAsm()
for (Token *tok = _tokens; tok; tok = tok->next()) {
if (Token::Match(tok, "__asm|_asm|asm {") &&
tok->next()->link()->next()) {
instruction = tok->tokAt(2)->stringify(tok->next()->link());
instruction = tok->tokAt(2)->stringifyList(tok->next()->link());
Token::eraseTokens(tok, tok->next()->link()->next());
}
@ -8986,7 +8986,7 @@ void Tokenizer::simplifyAsm()
Token *partok = tok->next();
if (partok->str() != "(")
partok = partok->next();
instruction = partok->next()->stringify(partok->link());
instruction = partok->next()->stringifyList(partok->link());
Token::eraseTokens(tok, partok->link()->next());
}
@ -8995,7 +8995,7 @@ void Tokenizer::simplifyAsm()
while (tok2 && tok2->linenr() == tok->linenr() && (tok2->isNumber() || tok2->isName() || tok2->str() == ","))
tok2 = tok2->next();
if (!tok2 || tok2->str() == ";" || tok2->linenr() != tok->linenr()) {
instruction = tok->next()->stringify(tok2);
instruction = tok->next()->stringifyList(tok2);
Token::eraseTokens(tok, tok2);
if (!tok2 || tok2->str() != ";")
tok->insertToken(";");

View File

@ -426,22 +426,8 @@ private:
tokenizer.simplifyTokenList();
tokenizer.validate();
std::string ret;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next()) {
if (tok1 != tokenizer.tokens())
ret += " ";
if (!simplify) {
if (tok1->isUnsigned())
ret += "unsigned ";
else if (tok1->isSigned())
ret += "signed ";
}
if (tok1->isLong())
ret += "long ";
ret += tok1->str();
}
return ret;
return tokenizer.tokens()->stringifyList(0, !simplify);
}
@ -937,15 +923,7 @@ private:
if (simplify)
tokenizer.simplifyTokenList();
std::ostringstream ostr;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next()) {
if (tok1->previous()) {
ostr << " ";
}
ostr << tok1->str();
}
return ostr.str();
return tokenizer.tokens()->stringifyList(0, false);
}
unsigned int sizeofFromTokenizer(const char type[]) {
@ -2297,18 +2275,8 @@ private:
" x(sizeof typename);\n"
" type = 0;\n"
"}";
errout.str("");
Settings settings;
Tokenizer tokenizer(&settings, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.c", "", false);
std::ostringstream ostr;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next()) {
ostr << tok1->str();
if (Token::Match(tok1, "%var% %var%"))
ostr << " ";
}
ASSERT_EQUALS("void f(){x(sizeof typename);type=0;}", ostr.str());
ASSERT_EQUALS("void f ( ) { x ( sizeof ( typename ) ) ; type = 0 ; }", sizeof_(code));
}
}
@ -2372,11 +2340,7 @@ private:
tokenizer.simplifyIfAssign();
std::ostringstream ostr;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next())
ostr << (tok1->previous() ? " " : "") << tok1->str();
return ostr.str();
return tokenizer.tokens()->stringifyList(0, false);
}
void ifassign1() {
@ -2449,11 +2413,7 @@ private:
tokenizer.simplifyIfNot();
std::ostringstream ostr;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next())
ostr << (tok1->previous() ? " " : "") << tok1->str();
return ostr.str();
return tokenizer.tokens()->stringifyList(0, false);
}
void ifnot() {
@ -2480,11 +2440,7 @@ private:
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
std::ostringstream ostr;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next())
ostr << (tok1->previous() ? " " : "") << tok1->str();
return ostr.str();
return tokenizer.tokens()->stringifyList(0, false);
}
void not1() {
@ -3545,14 +3501,7 @@ private:
tokenizer.createLinks();
tokenizer.simplifyTypedef();
std::string ret;
for (const Token *tok1 = tokenizer.tokens(); tok1; tok1 = tok1->next()) {
if (tok1 != tokenizer.tokens())
ret += " ";
ret += tok1->str();
}
return ret;
return tokenizer.tokens()->stringifyList(0, false);
}

View File

@ -412,18 +412,7 @@ private:
TEST_CASE(platformUnix64);
}
bool cmptok(const char *expected[], const Token *actual) {
unsigned int i = 0;
for (; expected[i] && actual; ++i, actual = actual->next()) {
if (strcmp(expected[i], actual->str().c_str()) != 0)
return false;
}
return (expected[i] == NULL && actual == NULL);
}
std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Unspecified, const std::string &filename="test.cpp") {
std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Unspecified, const char* filename = "test.cpp") {
errout.str("");
Settings settings;
@ -433,36 +422,11 @@ private:
// tokenize..
Tokenizer tokenizer(&settings, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, filename.c_str());
tokenizer.tokenize(istr, filename);
if (simplify)
tokenizer.simplifyTokenList();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
if (expand) {
if (tok->isUnsigned())
ostr << "unsigned ";
else if (tok->isSigned())
ostr << "signed ";
if (tok->isLong())
ostr << "long ";
}
ostr << tok->str();
// Append newlines
if (tok->next()) {
if (tok->linenr() != tok->next()->linenr()) {
for (unsigned int i = tok->linenr(); i < tok->next()->linenr(); ++i)
ostr << "\n";
} else {
ostr << " ";
}
}
}
return ostr.str();
return tokenizer.tokens()->stringifyList(false, expand, false, true, false, 0, 0);
}
@ -729,10 +693,7 @@ private:
tokenizer.simplifyCasts();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << " " << tok->str();
ASSERT_EQUALS(" int * f ( int * ) ;", ostr.str());
ASSERT_EQUALS("int * f ( int * ) ;", tokenizer.tokens()->stringifyList(0, false));
}
// remove static_cast..
@ -750,10 +711,7 @@ private:
tokenizer.simplifyCasts();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << " " << tok->str();
ASSERT_EQUALS(" t = & p ;", ostr.str());
ASSERT_EQUALS("t = & p ;", tokenizer.tokens()->stringifyList(0, false));
}
void removeCast3() {
@ -1150,14 +1108,7 @@ private:
tokenizer.simplifyKnownVariables();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
if (tok->previous())
ostr << " ";
ostr << tok->str();
}
return ostr.str();
return tokenizer.tokens()->stringifyList(0, false);
}
void simplifyKnownVariables1() {
@ -4124,12 +4075,7 @@ private:
std::istringstream istr(code);
tokenizer.tokenize(istr, "");
// Stringify the tokens..
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << tok->str() << " ";
ASSERT_EQUALS("a_b TEST ( var , val ) var_val = val ", ostr.str());
ASSERT_EQUALS("a_b TEST ( var , val ) var_val = val", tokenizer.tokens()->stringifyList(0, false));
}
void macrodoublesharp() {
@ -4144,12 +4090,7 @@ private:
std::istringstream istr(code);
tokenizer.tokenize(istr, "");
// Stringify the tokens..
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << tok->str() << " ";
ASSERT_EQUALS("DBG ( fmt , args . . . ) printf ( fmt , ## args ) ", ostr.str());
ASSERT_EQUALS("DBG ( fmt , args . . . ) printf ( fmt , ## args )", tokenizer.tokens()->stringifyList(0, false));
}
void simplifyFunctionParameters() {
@ -4353,10 +4294,7 @@ private:
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << " " << tok->str();
ASSERT_EQUALS(" void f ( ) { double a ; a = 4.2 ; float b ; b = 4.2f ; double c ; c = 4.2e+10 ; double d ; d = 4.2e-10 ; int e ; e = 4 + 2 ; }", ostr.str());
ASSERT_EQUALS("void f ( ) { double a ; a = 4.2 ; float b ; b = 4.2f ; double c ; c = 4.2e+10 ; double d ; d = 4.2e-10 ; int e ; e = 4 + 2 ; }", tokenizer.tokens()->stringifyList(0, false));
}
void tokenize_strings() {
@ -4380,10 +4318,7 @@ private:
tokenizer.tokenize(istr, "test.cpp");
tokenizer.simplifyTokenList();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << " " << tok->str();
ASSERT_EQUALS(" void f ( ) { const char * a ; a = { \"hello more world\" } ; }", ostr.str());
ASSERT_EQUALS("void f ( ) { const char * a ; a = { \"hello more world\" } ; }", tokenizer.tokens()->stringifyList(0, false));
}
void simplify_constants() {
@ -4410,10 +4345,7 @@ private:
tokenizer.simplifyTokenList();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << " " << tok->str();
ASSERT_EQUALS(" void f ( ) { } void g ( ) { }", ostr.str());
ASSERT_EQUALS("void f ( ) { } void g ( ) { }", tokenizer.tokens()->stringifyList(0, false));
}
void simplify_constants2() {
@ -4436,13 +4368,7 @@ private:
tokenizer.simplifyTokenList();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
ostr << " " << tok->str();
std::ostringstream oss;
oss << " void f ( Foo & foo , Foo * foo2 ) { foo . a = 90 ; foo2 . a = 45 ; }";
ASSERT_EQUALS(oss.str(), ostr.str());
ASSERT_EQUALS("void f ( Foo & foo , Foo * foo2 ) { foo . a = 90 ; foo2 . a = 45 ; }", tokenizer.tokens()->stringifyList(0, false));
}
void simplify_constants3() {
@ -4751,9 +4677,9 @@ private:
"}\n";
ASSERT_EQUALS("void func (\n"
"int in,\n"
"int r,\n"
"int m)\n"
"int in ,\n"
"int r ,\n"
"int m )\n"
"{\n"
"}", tokenizeAndStringify(code));
}
@ -4764,7 +4690,7 @@ private:
"}\n";
ASSERT_EQUALS("void f (\n"
"char * r)\n"
"char * r )\n"
"\n"
"{\n"
"}", tokenizeAndStringify(code));
@ -4785,7 +4711,7 @@ private:
"}\n";
ASSERT_EQUALS("void f (\n"
"char * r)\n"
"char * r )\n"
"\n"
"{\n"
"}", tokenizeAndStringify(code));
@ -4798,9 +4724,9 @@ private:
"}\n";
ASSERT_EQUALS("void f (\n"
"char * r,\n"
"char * r ,\n"
"\n"
"char * s)\n"
"char * s )\n"
"\n"
"\n"
"{\n"
@ -4813,9 +4739,9 @@ private:
"}\n";
ASSERT_EQUALS("void f (\n"
"char * r,\n"
"char * s,\n"
"char * t)\n"
"char * r ,\n"
"char * s ,\n"
"char * t )\n"
"\n"
"{\n"
"}", tokenizeAndStringify(code));
@ -5416,24 +5342,14 @@ private:
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
tokenizer.simplifyFunctionPointers();
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
if (tok->isUnsigned())
ostr << " unsigned";
else if (tok->isSigned())
ostr << " signed";
if (tok->isLong())
ostr << " long";
ostr << (tok->isName() ? " " : "") << tok->str();
}
return ostr.str();
return tokenizer.tokens()->stringifyList(0, true);
}
void functionpointer1() {
ASSERT_EQUALS(" void* f;", simplifyFunctionPointers("void (*f)();"));
ASSERT_EQUALS(" void** f;", simplifyFunctionPointers("void *(*f)();"));
ASSERT_EQUALS(" unsigned int* f;", simplifyFunctionPointers("unsigned int (*f)();"));
ASSERT_EQUALS(" unsigned int** f;", simplifyFunctionPointers("unsigned int * (*f)();"));
ASSERT_EQUALS("void * f ;", simplifyFunctionPointers("void (*f)();"));
ASSERT_EQUALS("void * * f ;", simplifyFunctionPointers("void *(*f)();"));
ASSERT_EQUALS("unsigned int * f ;", simplifyFunctionPointers("unsigned int (*f)();"));
ASSERT_EQUALS("unsigned int * * f ;", simplifyFunctionPointers("unsigned int * (*f)();"));
}
void functionpointer2() {
@ -5441,9 +5357,9 @@ private:
"void f1 ( ) { }"
"PF pf = &f1;"
"PF pfs[] = { &f1, &f1 };";
const char expected[] = " void f1(){} "
"void* pf; pf=& f1; "
"void* pfs[2]={& f1,& f1};";
const char expected[] = "void f1 ( ) { } "
"void * pf ; pf = & f1 ; "
"void * pfs [ 2 ] = { & f1 , & f1 } ;";
ASSERT_EQUALS(expected, simplifyFunctionPointers(code));
}
@ -5452,8 +5368,8 @@ private:
const char code[] = "void f() {\n"
"(void)(xy(*p)(0);)"
"\n}";
const char expected[] = " void f(){"
"( void)( xy(* p)(0);)"
const char expected[] = "void f ( ) { "
"( void ) ( xy ( * p ) ( 0 ) ; ) "
"}";
ASSERT_EQUALS(expected, simplifyFunctionPointers(code));
}
@ -5517,7 +5433,7 @@ private:
"{\n"
" fn2<int>();\n"
"}\n";
ASSERT_EQUALS("int main ( )\n{\nfn2<int> ( ) ;\n}void fn2<int> ( int t = [ ] { return 1 ; } ( ) )\n{ }", tokenizeAndStringify(code));
ASSERT_EQUALS("int main ( )\n{\nfn2<int> ( ) ;\n} void fn2<int> ( int t = [ ] { return 1 ; } ( ) )\n{ }", tokenizeAndStringify(code));
}
void cpp0xtemplate2() {
@ -5589,7 +5505,7 @@ private:
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
if (tok->isName())
if (tok->isName() && tok->previous())
ostr << " ";
ostr << tok->str();
}
@ -5603,7 +5519,7 @@ private:
ASSERT_EQUALS("; foo a[3]={{1,2},{3,4},{5,6}};", arraySize_(";foo a[]={{1,2},{3,4},{5,6}};"));
TODO_ASSERT_EQUALS("; int a[1]={ foo< bar1, bar2>(123,4)};", "; int a[]={ foo< bar1, bar2>(123,4)};", arraySize_(";int a[]={foo<bar1,bar2>(123,4)};"));
ASSERT_EQUALS("; int a[2]={ b> c?1:2,3};", arraySize_(";int a[]={ b>c?1:2,3};"));
TODO_ASSERT_EQUALS(" int main(){ int a[2]={ b< c?1:2,3}}", " int main(){ int a[]={ b< c?1:2,3}}", arraySize_("int main(){int a[]={b<c?1:2,3}}"));
TODO_ASSERT_EQUALS("int main(){ int a[2]={ b< c?1:2,3}}", "int main(){ int a[]={ b< c?1:2,3}}", arraySize_("int main(){int a[]={b<c?1:2,3}}"));
ASSERT_EQUALS("; int a[3]={ ABC,2,3};", arraySize_(";int a[]={ABC,2,3};"));
}
@ -5613,29 +5529,29 @@ private:
}
void labels() {
ASSERT_EQUALS(" void f(){ ab:; a=0;}", labels_("void f() { ab: a=0; }"));
ASSERT_EQUALS("void f(){ ab:; a=0;}", labels_("void f() { ab: a=0; }"));
//ticket #3176
ASSERT_EQUALS(" void f(){ ab:;(* func)();}", labels_("void f() { ab: (*func)(); }"));
ASSERT_EQUALS("void f(){ ab:;(* func)();}", labels_("void f() { ab: (*func)(); }"));
//with '*' operator
ASSERT_EQUALS(" void f(){ ab:;* b=0;}", labels_("void f() { ab: *b=0; }"));
ASSERT_EQUALS(" void f(){ ab:;** b=0;}", labels_("void f() { ab: **b=0; }"));
ASSERT_EQUALS("void f(){ ab:;* b=0;}", labels_("void f() { ab: *b=0; }"));
ASSERT_EQUALS("void f(){ ab:;** b=0;}", labels_("void f() { ab: **b=0; }"));
//with '&' operator
ASSERT_EQUALS(" void f(){ ab:;& b=0;}", labels_("void f() { ab: &b=0; }"));
ASSERT_EQUALS(" void f(){ ab:;&( b. x)=0;}", labels_("void f() { ab: &(b->x)=0; }"));
ASSERT_EQUALS("void f(){ ab:;& b=0;}", labels_("void f() { ab: &b=0; }"));
ASSERT_EQUALS("void f(){ ab:;&( b. x)=0;}", labels_("void f() { ab: &(b->x)=0; }"));
//with '(' parenthesis
ASSERT_EQUALS(" void f(){ ab:;*(* b). x=0;}", labels_("void f() { ab: *(* b)->x=0; }"));
ASSERT_EQUALS(" void f(){ ab:;(** b). x=0;}", labels_("void f() { ab: (** b).x=0; }"));
ASSERT_EQUALS(" void f(){ ab:;&(* b. x)=0;}", labels_("void f() { ab: &(*b.x)=0; }"));
ASSERT_EQUALS("void f(){ ab:;*(* b). x=0;}", labels_("void f() { ab: *(* b)->x=0; }"));
ASSERT_EQUALS("void f(){ ab:;(** b). x=0;}", labels_("void f() { ab: (** b).x=0; }"));
ASSERT_EQUALS("void f(){ ab:;&(* b. x)=0;}", labels_("void f() { ab: &(*b.x)=0; }"));
//with '{' parenthesis
ASSERT_EQUALS(" void f(){ ab:;{ b=0;}}", labels_("void f() { ab: {b=0;} }"));
ASSERT_EQUALS(" void f(){ ab:;{* b=0;}}", labels_("void f() { ab: { *b=0;} }"));
ASSERT_EQUALS(" void f(){ ab:;{& b=0;}}", labels_("void f() { ab: { &b=0;} }"));
ASSERT_EQUALS(" void f(){ ab:;{&(* b. x)=0;}}", labels_("void f() { ab: {&(*b.x)=0;} }"));
ASSERT_EQUALS("void f(){ ab:;{ b=0;}}", labels_("void f() { ab: {b=0;} }"));
ASSERT_EQUALS("void f(){ ab:;{* b=0;}}", labels_("void f() { ab: { *b=0;} }"));
ASSERT_EQUALS("void f(){ ab:;{& b=0;}}", labels_("void f() { ab: { &b=0;} }"));
ASSERT_EQUALS("void f(){ ab:;{&(* b. x)=0;}}", labels_("void f() { ab: {&(*b.x)=0;} }"));
//with unhandled MACRO() code
ASSERT_EQUALS(" void f(){ MACRO( ab: b=0;, foo)}", labels_("void f() { MACRO(ab: b=0;, foo)}"));
ASSERT_EQUALS(" void f(){ MACRO( bar, ab:{&(* b. x)=0;})}", labels_("void f() { MACRO(bar, ab: {&(*b.x)=0;})}"));
ASSERT_EQUALS("void f(){ MACRO( ab: b=0;, foo)}", labels_("void f() { MACRO(ab: b=0;, foo)}"));
ASSERT_EQUALS("void f(){ MACRO( bar, ab:{&(* b. x)=0;})}", labels_("void f() { MACRO(bar, ab: {&(*b.x)=0;})}"));
//don't crash with garbage code
ASSERT_EQUALS(" switch(){ case}", labels_("switch(){case}"));
ASSERT_EQUALS("switch(){ case}", labels_("switch(){case}"));
}
// Check simplifyInitVar
@ -6386,7 +6302,7 @@ private:
bool simplify = false;
bool expand = true;
Settings::PlatformType platform = Settings::Unspecified;
const std::string filename="test.cs";
const char filename[] = "test.cs";
ASSERT_EQUALS("int * x ;", tokenizeAndStringify("int [] x;", simplify, expand, platform, filename));
ASSERT_EQUALS("; int * x , int * y ;", tokenizeAndStringify("; int [] x, int [] y;", simplify, expand, platform, filename));
ASSERT_EQUALS("; int * * x ;", tokenizeAndStringify("; int [][] x;", simplify, expand, platform, filename));
@ -6406,14 +6322,7 @@ private:
std::istringstream istr(javacode);
tokenizer.tokenize(istr, "test.java");
std::ostringstream ostr;
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
ostr << tok->str();
if (tok->next())
ostr << " ";
}
return ostr.str();
return tokenizer.tokens()->stringifyList(0, false);
}