Tokenizer: simple simplification of array sizes
This commit is contained in:
parent
e4cc8cf1a0
commit
7a72932078
|
@ -1062,6 +1062,8 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[], const std::s
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arraySize();
|
||||||
|
|
||||||
simplifyDoWhileAddBraces();
|
simplifyDoWhileAddBraces();
|
||||||
simplifyIfAddBraces();
|
simplifyIfAddBraces();
|
||||||
|
|
||||||
|
@ -1223,6 +1225,29 @@ bool Tokenizer::tokenize(std::istream &code, const char FileName[], const std::s
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/** Specify array size if it hasn't been given.. */
|
||||||
|
|
||||||
|
void Tokenizer::arraySize()
|
||||||
|
{
|
||||||
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (Token::Match(tok, "%var% [ ] = {"))
|
||||||
|
{
|
||||||
|
unsigned int sz = 1;
|
||||||
|
const Token *tok2 = tok->tokAt(5);
|
||||||
|
while (Token::Match(tok2, "%any% ,"))
|
||||||
|
{
|
||||||
|
sz++;
|
||||||
|
tok2 = tok2->tokAt(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Token::Match(tok2, "%any% } ;"))
|
||||||
|
tok->next()->insertToken(MathLib::toString<long>(sz));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* is the token pointing at a template parameters block..
|
* is the token pointing at a template parameters block..
|
||||||
* < int , 3 > => yes
|
* < int , 3 > => yes
|
||||||
|
@ -3145,6 +3170,7 @@ bool Tokenizer::removeReduntantConditions()
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Tokenizer::simplifyIfAddBraces()
|
void Tokenizer::simplifyIfAddBraces()
|
||||||
{
|
{
|
||||||
for (Token *tok = _tokens; tok; tok = tok ? tok->next() : NULL)
|
for (Token *tok = _tokens; tok; tok = tok ? tok->next() : NULL)
|
||||||
|
|
|
@ -139,6 +139,9 @@ public:
|
||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/** Insert array size where it isn't given */
|
||||||
|
void arraySize();
|
||||||
|
|
||||||
/** Remove redundant assignment */
|
/** Remove redundant assignment */
|
||||||
void removeRedundantAssignment();
|
void removeRedundantAssignment();
|
||||||
|
|
||||||
|
|
|
@ -196,6 +196,8 @@ private:
|
||||||
|
|
||||||
TEST_CASE(removedeclspec);
|
TEST_CASE(removedeclspec);
|
||||||
TEST_CASE(cpp0xtemplate);
|
TEST_CASE(cpp0xtemplate);
|
||||||
|
|
||||||
|
TEST_CASE(arraySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3050,6 +3052,29 @@ private:
|
||||||
"}\n";
|
"}\n";
|
||||||
ASSERT_EQUALS(";\n\n\nint main ( )\n{\nfn2<int> ( ) ;\n}void fn2<int> ( int t = [ ] { return 1 ; } ( ) )\n{ }", tokenizeAndStringify(code));
|
ASSERT_EQUALS(";\n\n\nint main ( )\n{\nfn2<int> ( ) ;\n}void fn2<int> ( int t = [ ] { return 1 ; } ( ) )\n{ }", tokenizeAndStringify(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string arraySize_(const std::string &code)
|
||||||
|
{
|
||||||
|
// tokenize..
|
||||||
|
Tokenizer tokenizer;
|
||||||
|
std::istringstream istr(code.c_str());
|
||||||
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
|
std::ostringstream ostr;
|
||||||
|
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (tok->isName())
|
||||||
|
ostr << " ";
|
||||||
|
ostr << tok->str();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ostr.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void arraySize()
|
||||||
|
{
|
||||||
|
ASSERT_EQUALS("; int a[3]={1,2,3};", arraySize_(";int a[]={1,2,3};"));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestTokenizer)
|
REGISTER_TEST(TestTokenizer)
|
||||||
|
|
Loading…
Reference in New Issue