ValueType: struct member
This commit is contained in:
parent
9738cc66eb
commit
5b082aa799
|
@ -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()));
|
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)
|
static void setValueType(Token *tok, const ValueType &valuetype)
|
||||||
{
|
{
|
||||||
tok->setValueType(new ValueType(valuetype));
|
tok->setValueType(new ValueType(valuetype));
|
||||||
|
@ -3684,6 +3696,22 @@ static void setValueType(Token *tok, const ValueType &valuetype)
|
||||||
return;
|
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<Variable>::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())
|
if (parent->astOperand2() && !parent->astOperand2()->valueType())
|
||||||
return;
|
return;
|
||||||
const ValueType *vt1 = parent->astOperand1()->valueType();
|
const ValueType *vt1 = parent->astOperand1()->valueType();
|
||||||
|
@ -3842,11 +3870,7 @@ void SymbolDatabase::setValueTypeInTokenList(Token *tokens)
|
||||||
::setValueType(tok, valuetype);
|
::setValueType(tok, valuetype);
|
||||||
}
|
}
|
||||||
} else if (tok->variable()) {
|
} else if (tok->variable()) {
|
||||||
const Variable *var = tok->variable();
|
setValueType(tok, *tok->variable());
|
||||||
ValueType valuetype;
|
|
||||||
valuetype.pointer = var->dimensions().size();
|
|
||||||
if (parsedecl(var->typeStartToken(), &valuetype))
|
|
||||||
::setValueType(tok, valuetype);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1045,13 +1045,14 @@ public:
|
||||||
enum Type {UNKNOWN_TYPE, NONSTD, BOOL, CHAR, SHORT, INT, LONG, LONGLONG, FLOAT, DOUBLE, LONGDOUBLE} type;
|
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 pointer; // 0=>not pointer, 1=>*, 2=>**, 3=>***, etc
|
||||||
unsigned int constness; // bit 0=data, bit 1=*, bit 2=**
|
unsigned int constness; // bit 0=data, bit 1=*, bit 2=**
|
||||||
|
const Scope *typeScope;
|
||||||
std::string originalTypeName;
|
std::string originalTypeName;
|
||||||
|
|
||||||
ValueType() : sign(UNKNOWN_SIGN), type(UNKNOWN_TYPE), pointer(0U), constness(0U) {}
|
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), originalTypeName(vt.originalTypeName) {}
|
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) {}
|
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) {}
|
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), originalTypeName(otn) {}
|
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 {
|
bool isIntegral() const {
|
||||||
return (type >= ValueType::Type::BOOL && type <= ValueType::Type::LONGLONG);
|
return (type >= ValueType::Type::BOOL && type <= ValueType::Type::LONGLONG);
|
||||||
|
|
|
@ -2992,6 +2992,7 @@ private:
|
||||||
ASSERT_EQUALS("int *", typeOf("int x; a = &x;", "&"));
|
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("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..
|
// array..
|
||||||
ASSERT_EQUALS("int *", typeOf("int x[10]; a = x + 1;", "+"));
|
ASSERT_EQUALS("int *", typeOf("int x[10]; a = x + 1;", "+"));
|
||||||
|
|
Loading…
Reference in New Issue