Fixed #2530 (Tokenizer: Remove redundant 'MyClass::' inside MyClass class declaration)
This commit is contained in:
parent
defeded4b5
commit
8eb92001b3
|
@ -2382,6 +2382,9 @@ bool Tokenizer::tokenize(std::istream &code,
|
||||||
// remove __attribute__((?))
|
// remove __attribute__((?))
|
||||||
simplifyAttribute();
|
simplifyAttribute();
|
||||||
|
|
||||||
|
// remove unnecessary member qualification..
|
||||||
|
removeUnnecessaryQualification();
|
||||||
|
|
||||||
// remove Microsoft MFC..
|
// remove Microsoft MFC..
|
||||||
simplifyMicrosoftMFC();
|
simplifyMicrosoftMFC();
|
||||||
|
|
||||||
|
@ -9325,3 +9328,60 @@ void Tokenizer::simplifyOperatorName()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove unnecessary member qualification..
|
||||||
|
struct ClassInfo
|
||||||
|
{
|
||||||
|
std::string className;
|
||||||
|
Token *end;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Tokenizer::removeUnnecessaryQualification()
|
||||||
|
{
|
||||||
|
std::stack<ClassInfo> classInfo;
|
||||||
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (Token::Match(tok, "class|struct %type% :|{"))
|
||||||
|
{
|
||||||
|
tok = tok->next();
|
||||||
|
ClassInfo info;
|
||||||
|
info.className = tok->str();
|
||||||
|
tok = tok->next();
|
||||||
|
while (tok && tok->str() != "{")
|
||||||
|
tok = tok->next();
|
||||||
|
if (!tok)
|
||||||
|
return;
|
||||||
|
info.end = tok->link();
|
||||||
|
classInfo.push(info);
|
||||||
|
}
|
||||||
|
else if (!classInfo.empty())
|
||||||
|
{
|
||||||
|
if (tok == classInfo.top().end)
|
||||||
|
classInfo.pop();
|
||||||
|
else if (tok->str() == classInfo.top().className &&
|
||||||
|
Token::Match(tok, "%type% :: %type% (") &&
|
||||||
|
Token::Match(tok->tokAt(3)->link(), ") const| {|;"))
|
||||||
|
{
|
||||||
|
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
|
||||||
|
ErrorLogger::ErrorMessage::FileLocation loc;
|
||||||
|
loc.line = tok->linenr();
|
||||||
|
loc.setfile(file(tok));
|
||||||
|
locationList.push_back(loc);
|
||||||
|
|
||||||
|
const ErrorLogger::ErrorMessage errmsg(locationList,
|
||||||
|
Severity::portability,
|
||||||
|
"Extra qualification \'" + tok->str() + "::\' unnecessary and considered an error by many compilers.",
|
||||||
|
"portability");
|
||||||
|
|
||||||
|
if (_errorLogger)
|
||||||
|
_errorLogger->reportErr(errmsg);
|
||||||
|
else
|
||||||
|
Check::reportError(errmsg);
|
||||||
|
|
||||||
|
tok->deleteThis();
|
||||||
|
tok->deleteThis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -519,6 +519,11 @@ public:
|
||||||
*/
|
*/
|
||||||
void simplifyBuiltinExpect();
|
void simplifyBuiltinExpect();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove unnecessary member qualification
|
||||||
|
*/
|
||||||
|
void removeUnnecessaryQualification();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove Microsoft MFC 'DECLARE_MESSAGE_MAP()'
|
* Remove Microsoft MFC 'DECLARE_MESSAGE_MAP()'
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -315,6 +315,8 @@ private:
|
||||||
TEST_CASE(redundant_semicolon);
|
TEST_CASE(redundant_semicolon);
|
||||||
|
|
||||||
TEST_CASE(simplifyFunctionReturn);
|
TEST_CASE(simplifyFunctionReturn);
|
||||||
|
|
||||||
|
TEST_CASE(removeUnnecessaryQualification);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string tok(const char code[], bool simplify = true)
|
std::string tok(const char code[], bool simplify = true)
|
||||||
|
@ -6408,6 +6410,14 @@ private:
|
||||||
"} ;";
|
"} ;";
|
||||||
ASSERT_EQUALS(expected, tok(code, false));
|
ASSERT_EQUALS(expected, tok(code, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeUnnecessaryQualification()
|
||||||
|
{
|
||||||
|
const char code[] = "class Fred { Fred::Fred() {} };";
|
||||||
|
const char expected[] = "class Fred { Fred ( ) { } } ;";
|
||||||
|
ASSERT_EQUALS(expected, tok(code, false));
|
||||||
|
ASSERT_EQUALS("[test.cpp:1]: (portability) Extra qualification 'Fred::' unnecessary and considered an error by many compilers.\n", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestSimplifyTokens)
|
REGISTER_TEST(TestSimplifyTokens)
|
||||||
|
|
Loading…
Reference in New Issue