From 5b082aa7996d7432046bb7f78f24529a76aa9e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 11 Oct 2015 10:48:08 +0200 Subject: [PATCH] ValueType: struct member --- lib/symboldatabase.cpp | 34 +++++++++++++++++++++++++++++----- lib/symboldatabase.h | 11 ++++++----- test/testsymboldatabase.cpp | 1 + 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index d58d4ca50..298f67c08 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3650,6 +3650,18 @@ bool SymbolDatabase::isReservedName(const std::string& iName) const return (c_keywords.find(iName) != c_keywords.cend()) || (isCPP() && (cpp_keywords.find(iName) != cpp_keywords.cend())); } +static const Token * parsedecl(const Token *type, ValueType * const valuetype); +static void setValueType(Token *tok, const ValueType &valuetype); + +static void setValueType(Token *tok, const Variable &var) +{ + ValueType valuetype; + valuetype.pointer = var.dimensions().size(); + valuetype.typeScope = var.typeScope(); + if (parsedecl(var.typeStartToken(), &valuetype)) + ::setValueType(tok, valuetype); +} + static void setValueType(Token *tok, const ValueType &valuetype) { tok->setValueType(new ValueType(valuetype)); @@ -3684,6 +3696,22 @@ static void setValueType(Token *tok, const ValueType &valuetype) return; } + if (parent->str() == "." && + valuetype.typeScope && + parent->astOperand2() && parent->astOperand2()->isName() && !parent->astOperand2()->valueType()) { + const std::string &name = parent->astOperand2()->str(); + const Scope *typeScope = parent->astOperand1()->valueType()->typeScope; + if (!typeScope) + return; + for (std::list::const_iterator it = typeScope->varlist.begin(); it != typeScope->varlist.end(); ++it) { + const Variable &var = *it; + if (var.nameToken()->str() == name) { + setValueType(parent, var); + return; + } + } + } + if (parent->astOperand2() && !parent->astOperand2()->valueType()) return; const ValueType *vt1 = parent->astOperand1()->valueType(); @@ -3842,11 +3870,7 @@ void SymbolDatabase::setValueTypeInTokenList(Token *tokens) ::setValueType(tok, valuetype); } } else if (tok->variable()) { - const Variable *var = tok->variable(); - ValueType valuetype; - valuetype.pointer = var->dimensions().size(); - if (parsedecl(var->typeStartToken(), &valuetype)) - ::setValueType(tok, valuetype); + setValueType(tok, *tok->variable()); } } } diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 61332ce66..a524304e8 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -1045,13 +1045,14 @@ public: enum Type {UNKNOWN_TYPE, NONSTD, BOOL, CHAR, SHORT, INT, LONG, LONGLONG, 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; std::string originalTypeName; - ValueType() : sign(UNKNOWN_SIGN), type(UNKNOWN_TYPE), pointer(0U), constness(0U) {} - ValueType(const ValueType &vt) : sign(vt.sign), type(vt.type), pointer(vt.pointer), constness(vt.constness), originalTypeName(vt.originalTypeName) {} - ValueType(enum Sign s, enum Type t, unsigned int p) : sign(s), type(t), pointer(p), constness(0U) {} - ValueType(enum Sign s, enum Type t, unsigned int p, unsigned int c) : sign(s), type(t), pointer(p), constness(c) {} - ValueType(enum Sign s, enum Type t, unsigned int p, unsigned int c, const std::string &otn) : sign(s), type(t), pointer(p), constness(c), originalTypeName(otn) {} + ValueType() : sign(UNKNOWN_SIGN), type(UNKNOWN_TYPE), pointer(0U), constness(0U), typeScope(nullptr) {} + ValueType(const ValueType &vt) : sign(vt.sign), type(vt.type), pointer(vt.pointer), constness(vt.constness), typeScope(vt.typeScope), originalTypeName(vt.originalTypeName) {} + ValueType(enum Sign s, enum Type t, unsigned int p) : sign(s), type(t), pointer(p), constness(0U), typeScope(nullptr) {} + ValueType(enum Sign s, enum Type t, unsigned int p, unsigned int c) : sign(s), type(t), pointer(p), constness(c), typeScope(nullptr) {} + ValueType(enum Sign s, enum Type t, unsigned int p, unsigned int c, const std::string &otn) : sign(s), type(t), pointer(p), constness(c), typeScope(nullptr), originalTypeName(otn) {} bool isIntegral() const { return (type >= ValueType::Type::BOOL && type <= ValueType::Type::LONGLONG); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 3c5ab5817..bf44ebe73 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -2992,6 +2992,7 @@ private: ASSERT_EQUALS("int *", typeOf("int x; a = &x;", "&")); ASSERT_EQUALS("long double", typeOf("long double x; dostuff(x,1);", "x ,")); ASSERT_EQUALS("long double *", typeOf("long double x; dostuff(&x,1);", "& x ,")); + ASSERT_EQUALS("int", typeOf("struct X {int i;}; void f(struct X x) { x.i }", ".")); // array.. ASSERT_EQUALS("int *", typeOf("int x[10]; a = x + 1;", "+"));