Clang import; Better handling of enums

This commit is contained in:
Daniel Marjamäki 2020-01-25 09:31:47 +01:00
parent b3e192a4e1
commit 569523bbef
3 changed files with 11 additions and 2 deletions

View File

@ -464,10 +464,11 @@ Scope *clangimport::AstNode::createScope(TokenList *tokenList, Scope::ScopeType
{ {
SymbolDatabase *symbolDatabase = mData->mSymbolDatabase; SymbolDatabase *symbolDatabase = mData->mSymbolDatabase;
const Scope *nestedIn = getNestedInScope(tokenList); Scope *nestedIn = const_cast<Scope *>(getNestedInScope(tokenList));
symbolDatabase->scopeList.push_back(Scope(nullptr, nullptr, nestedIn)); symbolDatabase->scopeList.push_back(Scope(nullptr, nullptr, nestedIn));
Scope *scope = &symbolDatabase->scopeList.back(); Scope *scope = &symbolDatabase->scopeList.back();
nestedIn->nestedList.push_back(scope);
scope->type = scopeType; scope->type = scopeType;
scope->classDef = def; scope->classDef = def;
Token *bodyStart = children[0]->addtoken(tokenList, "{"); Token *bodyStart = children[0]->addtoken(tokenList, "{");

View File

@ -5547,6 +5547,11 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
if (container) { if (container) {
valuetype->type = ValueType::Type::CONTAINER; valuetype->type = ValueType::Type::CONTAINER;
valuetype->container = container; valuetype->container = container;
} else {
const Scope *scope = type->scope();
valuetype->typeScope = scope->check->findScope(typeTokens.front(), scope);
if (valuetype->typeScope)
valuetype->type = (scope->type == Scope::ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
} }
} else if (const Library::Container *container = settings->library.detectContainer(type)) { } else if (const Library::Container *container = settings->library.detectContainer(type)) {
valuetype->type = ValueType::Type::CONTAINER; valuetype->type = ValueType::Type::CONTAINER;

View File

@ -99,6 +99,7 @@ private:
std::string parse(const char clang[]) { std::string parse(const char clang[]) {
Settings settings; Settings settings;
settings.clang = true;
Tokenizer tokenizer(&settings, this); Tokenizer tokenizer(&settings, this);
std::istringstream istr(clang); std::istringstream istr(clang);
clangimport::parseClangAstDump(&tokenizer, istr); clangimport::parseClangAstDump(&tokenizer, istr);
@ -793,6 +794,7 @@ private:
#define GET_SYMBOL_DB(clang) \ #define GET_SYMBOL_DB(clang) \
Settings settings; \ Settings settings; \
settings.clang = true; \
settings.platform(cppcheck::Platform::PlatformType::Unix64); \ settings.platform(cppcheck::Platform::PlatformType::Unix64); \
Tokenizer tokenizer(&settings, this); \ Tokenizer tokenizer(&settings, this); \
std::istringstream istr(clang); \ std::istringstream istr(clang); \
@ -829,7 +831,8 @@ private:
const Token *vartok = Token::findsimplematch(tokenizer.tokens(), "x"); const Token *vartok = Token::findsimplematch(tokenizer.tokens(), "x");
ASSERT(vartok); ASSERT(vartok);
ASSERT(vartok->variable()); ASSERT(vartok->variable());
//ASSERT(vartok->variable()->valueType()); ASSERT(vartok->variable()->valueType());
ASSERT_EQUALS(uintptr_t(&enumScope), uintptr_t(vartok->variable()->valueType()->typeScope));
} }
void symbolDatabaseFunction1() { void symbolDatabaseFunction1() {