Refactoring: Move template code into templatesimplifier: simplifyTemplatesExpandSpecialized()
This commit is contained in:
parent
8084bc80fc
commit
37269d0c28
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "templatesimplifier.h"
|
#include "templatesimplifier.h"
|
||||||
#include "token.h"
|
#include "token.h"
|
||||||
|
#include <sstream>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -272,3 +273,69 @@ void TemplateSimplifier::removeTemplates(Token *tok)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::set<std::string> TemplateSimplifier::simplifyTemplatesExpandSpecialized(Token *tokens)
|
||||||
|
{
|
||||||
|
std::set<std::string> expandedtemplates;
|
||||||
|
|
||||||
|
// Locate specialized templates..
|
||||||
|
for (Token *tok = tokens; tok; tok = tok->next()) {
|
||||||
|
if (tok->str() != "template")
|
||||||
|
continue;
|
||||||
|
if (!Token::simpleMatch(tok->next(), "< >"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// what kind of template is this?
|
||||||
|
Token *tok2 = tok->tokAt(3);
|
||||||
|
while (tok2 && (tok2->isName() || tok2->str() == "*"))
|
||||||
|
tok2 = tok2->next();
|
||||||
|
|
||||||
|
if (!TemplateSimplifier::templateParameters(tok2))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// unknown template.. bail out
|
||||||
|
if (!tok2->previous()->isName())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tok2 = tok2->previous();
|
||||||
|
std::string s;
|
||||||
|
{
|
||||||
|
std::ostringstream ostr;
|
||||||
|
const Token *tok3 = tok2;
|
||||||
|
for (tok3 = tok2; tok3 && tok3->str() != ">"; tok3 = tok3->next()) {
|
||||||
|
if (tok3 != tok2)
|
||||||
|
ostr << " ";
|
||||||
|
ostr << tok3->str();
|
||||||
|
}
|
||||||
|
if (!Token::simpleMatch(tok3, "> ("))
|
||||||
|
continue;
|
||||||
|
s = ostr.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// save search pattern..
|
||||||
|
const std::string pattern(s + " > (");
|
||||||
|
|
||||||
|
// remove spaces to create new name
|
||||||
|
while (s.find(" ") != std::string::npos)
|
||||||
|
s.erase(s.find(" "), 1);
|
||||||
|
const std::string name(s + ">");
|
||||||
|
expandedtemplates.insert(name);
|
||||||
|
|
||||||
|
// Rename template..
|
||||||
|
Token::eraseTokens(tok2, Token::findsimplematch(tok2, "("));
|
||||||
|
tok2->str(name);
|
||||||
|
|
||||||
|
// delete the "template < >"
|
||||||
|
tok->deleteNext(2);
|
||||||
|
tok->deleteThis();
|
||||||
|
|
||||||
|
// Use this special template in the code..
|
||||||
|
while (NULL != (tok2 = const_cast<Token *>(Token::findmatch(tok2, pattern.c_str())))) {
|
||||||
|
Token::eraseTokens(tok2, Token::findsimplematch(tok2, "("));
|
||||||
|
tok2->str(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return expandedtemplates;
|
||||||
|
}
|
||||||
|
|
|
@ -22,7 +22,8 @@
|
||||||
#define templatesimplifierH
|
#define templatesimplifierH
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
class Token;
|
class Token;
|
||||||
|
|
||||||
|
@ -61,6 +62,12 @@ public:
|
||||||
* Remove "template < ..." they can cause false positives because they are not expanded
|
* Remove "template < ..." they can cause false positives because they are not expanded
|
||||||
*/
|
*/
|
||||||
static void removeTemplates(Token *tok);
|
static void removeTemplates(Token *tok);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expand specialized templates : "template<>.."
|
||||||
|
* @return names of expanded templates
|
||||||
|
*/
|
||||||
|
static std::set<std::string> simplifyTemplatesExpandSpecialized(Token *tokens);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
|
@ -2681,71 +2681,6 @@ void Tokenizer::simplifyLabelsCaseDefault()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> Tokenizer::simplifyTemplatesExpandSpecialized()
|
|
||||||
{
|
|
||||||
std::set<std::string> expandedtemplates;
|
|
||||||
|
|
||||||
// Locate specialized templates..
|
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
|
||||||
if (tok->str() != "template")
|
|
||||||
continue;
|
|
||||||
if (!Token::simpleMatch(tok->next(), "< >"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// what kind of template is this?
|
|
||||||
Token *tok2 = tok->tokAt(3);
|
|
||||||
while (tok2 && (tok2->isName() || tok2->str() == "*"))
|
|
||||||
tok2 = tok2->next();
|
|
||||||
|
|
||||||
if (!TemplateSimplifier::templateParameters(tok2))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// unknown template.. bail out
|
|
||||||
if (!tok2->previous()->isName())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tok2 = tok2->previous();
|
|
||||||
std::string s;
|
|
||||||
{
|
|
||||||
std::ostringstream ostr;
|
|
||||||
const Token *tok3 = tok2;
|
|
||||||
for (tok3 = tok2; tok3 && tok3->str() != ">"; tok3 = tok3->next()) {
|
|
||||||
if (tok3 != tok2)
|
|
||||||
ostr << " ";
|
|
||||||
ostr << tok3->str();
|
|
||||||
}
|
|
||||||
if (!Token::simpleMatch(tok3, "> ("))
|
|
||||||
continue;
|
|
||||||
s = ostr.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// save search pattern..
|
|
||||||
const std::string pattern(s + " > (");
|
|
||||||
|
|
||||||
// remove spaces to create new name
|
|
||||||
while (s.find(" ") != std::string::npos)
|
|
||||||
s.erase(s.find(" "), 1);
|
|
||||||
const std::string name(s + ">");
|
|
||||||
expandedtemplates.insert(name);
|
|
||||||
|
|
||||||
// Rename template..
|
|
||||||
Token::eraseTokens(tok2, Token::findsimplematch(tok2, "("));
|
|
||||||
tok2->str(name);
|
|
||||||
|
|
||||||
// delete the "template < >"
|
|
||||||
tok->deleteNext(2);
|
|
||||||
tok->deleteThis();
|
|
||||||
|
|
||||||
// Use this special template in the code..
|
|
||||||
while (NULL != (tok2 = const_cast<Token *>(Token::findmatch(tok2, pattern.c_str())))) {
|
|
||||||
Token::eraseTokens(tok2, Token::findsimplematch(tok2, "("));
|
|
||||||
tok2->str(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return expandedtemplates;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::list<Token *> Tokenizer::simplifyTemplatesGetTemplateDeclarations()
|
std::list<Token *> Tokenizer::simplifyTemplatesGetTemplateDeclarations()
|
||||||
{
|
{
|
||||||
std::list<Token *> templates;
|
std::list<Token *> templates;
|
||||||
|
@ -3280,7 +3215,7 @@ void Tokenizer::simplifyTemplateInstantions(const Token *tok,
|
||||||
|
|
||||||
void Tokenizer::simplifyTemplates()
|
void Tokenizer::simplifyTemplates()
|
||||||
{
|
{
|
||||||
std::set<std::string> expandedtemplates(simplifyTemplatesExpandSpecialized());
|
std::set<std::string> expandedtemplates(TemplateSimplifier::simplifyTemplatesExpandSpecialized(_tokens));
|
||||||
|
|
||||||
// Locate templates..
|
// Locate templates..
|
||||||
std::list<Token *> templates(simplifyTemplatesGetTemplateDeclarations());
|
std::list<Token *> templates(simplifyTemplatesGetTemplateDeclarations());
|
||||||
|
|
|
@ -473,12 +473,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void simplifyTemplates();
|
void simplifyTemplates();
|
||||||
|
|
||||||
/**
|
|
||||||
* Expand specialized templates : "template<>.."
|
|
||||||
* @return names of expanded templates
|
|
||||||
*/
|
|
||||||
std::set<std::string> simplifyTemplatesExpandSpecialized();
|
|
||||||
|
|
||||||
void simplifyDoublePlusAndDoubleMinus();
|
void simplifyDoublePlusAndDoubleMinus();
|
||||||
|
|
||||||
void simplifyRedundantConsecutiveBraces();
|
void simplifyRedundantConsecutiveBraces();
|
||||||
|
|
Loading…
Reference in New Issue