Refactoring: Check if type is class/struct through symbol database
This commit is contained in:
parent
e6a1efa13b
commit
93d1313186
|
@ -21,6 +21,7 @@
|
|||
//---------------------------------------------------------------------------
|
||||
|
||||
#include "checkautovariables.h"
|
||||
#include "symboldatabase.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
|
@ -140,6 +141,8 @@ void CheckAutoVariables::autoVariables()
|
|||
// Which variables have an unknown type?
|
||||
std::set<unsigned int> unknown_type;
|
||||
|
||||
const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase();
|
||||
|
||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||
{
|
||||
|
||||
|
@ -192,7 +195,7 @@ void CheckAutoVariables::autoVariables()
|
|||
{
|
||||
addVD(tok->next()->varId());
|
||||
if (!tok->isStandardType() &&
|
||||
NULL == Token::findmatch(_tokenizer->tokens(), ("struct|class " + tok->str()).c_str()))
|
||||
!symbolDatabase->isClassOrStruct(tok->str()))
|
||||
{
|
||||
unknown_type.insert(tok->next()->varId());
|
||||
}
|
||||
|
|
|
@ -2100,6 +2100,8 @@ void CheckOther::checkConstantFunctionParameter()
|
|||
if (!_settings->_checkCodingStyle)
|
||||
return;
|
||||
|
||||
const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase();
|
||||
|
||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||
{
|
||||
if (Token::Match(tok, "[,(] const std :: %type% %var% [,)]"))
|
||||
|
@ -2140,8 +2142,7 @@ void CheckOther::checkConstantFunctionParameter()
|
|||
else if (Token::Match(tok, "[,(] const %type% %var% [,)]"))
|
||||
{
|
||||
// Check if type is a struct or class.
|
||||
const std::string pattern(std::string("class|struct ") + tok->strAt(2));
|
||||
if (Token::findmatch(_tokenizer->tokens(), pattern.c_str()))
|
||||
if (symbolDatabase->isClassOrStruct(tok->strAt(2)))
|
||||
{
|
||||
passedByValueError(tok, tok->strAt(3));
|
||||
}
|
||||
|
@ -2529,18 +2530,10 @@ void CheckOther::checkMisusedScopedObject()
|
|||
return;
|
||||
}
|
||||
|
||||
const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase();
|
||||
const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase();
|
||||
|
||||
std::list<SymbolDatabase::SpaceInfo *>::const_iterator i;
|
||||
|
||||
// list of classes / structs
|
||||
std::set<std::string> identifiers;
|
||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||
{
|
||||
if (Token::Match(tok, "class|struct %var% [:{;]"))
|
||||
identifiers.insert(tok->next()->str());
|
||||
}
|
||||
|
||||
for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i)
|
||||
{
|
||||
const SymbolDatabase::SpaceInfo *info = *i;
|
||||
|
@ -2566,7 +2559,7 @@ void CheckOther::checkMisusedScopedObject()
|
|||
|
||||
if (Token::Match(tok, "[;{}] %var% (")
|
||||
&& Token::Match(tok->tokAt(2)->link(), ") ;")
|
||||
&& identifiers.find(tok->next()->str()) != identifiers.end()
|
||||
&& symbolDatabase->isClassOrStruct(tok->next()->str())
|
||||
)
|
||||
{
|
||||
tok = tok->next();
|
||||
|
|
|
@ -38,6 +38,13 @@
|
|||
SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
|
||||
: _tokenizer(tokenizer), _settings(settings), _errorLogger(errorLogger)
|
||||
{
|
||||
// fill the classAndStructTypes set..
|
||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
|
||||
{
|
||||
if (Token::Match(tok, "class|struct %var% [:{;]"))
|
||||
classAndStructTypes.insert(tok->next()->str());
|
||||
}
|
||||
|
||||
// find all namespaces (class,struct and namespace)
|
||||
SpaceInfo *info = new SpaceInfo(this, NULL, NULL);
|
||||
spaceInfoList.push_back(info);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <string>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
||||
class Token;
|
||||
class Tokenizer;
|
||||
|
@ -223,6 +224,11 @@ public:
|
|||
|
||||
bool argsMatch(const SpaceInfo *info, const Token *first, const Token *second, const std::string &path, unsigned int depth) const;
|
||||
|
||||
bool isClassOrStruct(const std::string &type) const
|
||||
{
|
||||
return bool(classAndStructTypes.find(type) != classAndStructTypes.end());
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// Needed by Borland C++:
|
||||
|
@ -233,6 +239,9 @@ private:
|
|||
const Token *initBaseInfo(SpaceInfo *info, const Token *tok);
|
||||
bool isFunction(const Token *tok, const Token **funcStart, const Token **argStart) const;
|
||||
|
||||
/** class/struct types */
|
||||
std::set<std::string> classAndStructTypes;
|
||||
|
||||
const Tokenizer *_tokenizer;
|
||||
const Settings *_settings;
|
||||
ErrorLogger *_errorLogger;
|
||||
|
|
Loading…
Reference in New Issue