ValueType: set ValueType for method that returns iterator

This commit is contained in:
Daniel Marjamäki 2017-03-05 14:53:32 +01:00
parent 339f861804
commit ab7cf5d215
2 changed files with 30 additions and 9 deletions

View File

@ -4638,7 +4638,7 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
} else
valuetype->type = ValueType::Type::INT;
} else
valuetype->type = ValueType::Type::NONSTD;
valuetype->type = ValueType::Type::RECORD;
while (Token::Match(type, "%name%|*|&|::") && !type->variable()) {
if (type->isSigned())
valuetype->sign = ValueType::Sign::SIGNED;
@ -4649,7 +4649,7 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
else if (Token::Match(type, "%name% :: %name%")) {
const Library::Container *container = settings->library.detectContainer(type);
if (container) {
valuetype->type = ValueType::Type::NONSTD;
valuetype->type = ValueType::Type::CONTAINER;
valuetype->container = container;
} else {
std::string typestr;
@ -4677,9 +4677,9 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
type = type->next();
break;
} else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum"))
valuetype->type = ValueType::Type::NONSTD;
valuetype->type = type->str() == "struct" ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
else if (!valuetype->typeScope && type->type() && type->type()->classScope) {
valuetype->type = ValueType::Type::NONSTD;
valuetype->type = ValueType::Type::RECORD;
valuetype->typeScope = type->type()->classScope;
} else if (type->isName() && valuetype->sign != ValueType::Sign::UNKNOWN_SIGN && valuetype->pointer == 0U)
return nullptr;
@ -4843,8 +4843,27 @@ void SymbolDatabase::setValueTypeInTokenList(Token *tokens, bool cpp, const Sett
// library function
else if (tok->previous()) {
const std::string& typestr(settings->library.returnValueType(tok->previous()));
if (typestr.empty() || typestr == "iterator")
if (typestr.empty() || typestr == "iterator") {
if (Token::simpleMatch(tok->astOperand1(), ".") &&
tok->astOperand1()->astOperand1() &&
tok->astOperand1()->astOperand2() &&
tok->astOperand1()->astOperand1()->valueType() &&
tok->astOperand1()->astOperand1()->valueType()->container) {
const Library::Container *cont = tok->astOperand1()->astOperand1()->valueType()->container;
std::map<std::string, Library::Container::Function>::const_iterator it = cont->functions.find(tok->astOperand1()->astOperand2()->str());
if (it != cont->functions.end()) {
if (it->second.yield == Library::Container::Yield::START_ITERATOR ||
it->second.yield == Library::Container::Yield::END_ITERATOR ||
it->second.yield == Library::Container::Yield::ITERATOR) {
ValueType vt;
vt.type = ValueType::Type::ITERATOR;
vt.container = cont;
setValueType(tok, vt, cpp, defsign, settings);
}
}
}
continue;
}
TokenList tokenList(settings);
std::istringstream istr(typestr+";");
if (tokenList.createTokens(istr)) {
@ -4873,7 +4892,7 @@ void SymbolDatabase::setValueTypeInTokenList(Token *tokens, bool cpp, const Sett
ValueType vt;
vt.pointer = 1;
if (typeTok->type() && typeTok->type()->classScope) {
vt.type = ValueType::Type::NONSTD;
vt.type = ValueType::Type::RECORD;
vt.typeScope = typeTok->type()->classScope;
} else {
vt.type = ValueType::typeFromString(typestr, typeTok->isLong());
@ -4999,7 +5018,7 @@ std::string ValueType::str() const
ret += " double";
else if (type == LONGDOUBLE)
ret += " long double";
else if (type == NONSTD && typeScope) {
else if ((type == ValueType::Type::NONSTD || type == ValueType::Type::RECORD) && typeScope) {
std::string className(typeScope->className);
const Scope *scope = typeScope->nestedIn;
while (scope && scope->type != Scope::eGlobal) {
@ -5008,8 +5027,10 @@ std::string ValueType::str() const
scope = scope->nestedIn;
}
ret += ' ' + className;
} else if (type == NONSTD && container) {
} else if (type == ValueType::Type::CONTAINER && container) {
ret += " container(" + container->startPattern + ')';
} else if (type == ValueType::Type::ITERATOR && container) {
ret += " iterator(" + container->startPattern + ')';
}
for (unsigned int p = 0; p < pointer; p++) {
ret += " *";

View File

@ -1159,7 +1159,7 @@ private:
class CPPCHECKLIB ValueType {
public:
enum Sign {UNKNOWN_SIGN, SIGNED, UNSIGNED} sign;
enum Type {UNKNOWN_TYPE, NONSTD, VOID, BOOL, CHAR, SHORT, INT, LONG, LONGLONG, UNKNOWN_INT, FLOAT, DOUBLE, LONGDOUBLE} type;
enum Type {UNKNOWN_TYPE, NONSTD, RECORD, CONTAINER, ITERATOR, VOID, BOOL, CHAR, SHORT, INT, LONG, LONGLONG, UNKNOWN_INT, FLOAT, DOUBLE, LONGDOUBLE} type;
unsigned int pointer; // 0=>not pointer, 1=>*, 2=>**, 3=>***, etc
unsigned int constness; // bit 0=data, bit 1=*, bit 2=**
const Scope *typeScope;