From b1abcc06dfd1a0875a44d70a0c07d1f9c3d00b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 27 Jan 2020 13:00:52 +0100 Subject: [PATCH] Clang import; distinguish static variable --- lib/clangimport.cpp | 7 +++++-- lib/symboldatabase.cpp | 4 +++- lib/symboldatabase.h | 2 +- test/testclangimport.cpp | 7 +++++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index ce5d30e25..2ac00bc87 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -1077,7 +1077,7 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList *tokenList) Token *vartok = nullptr; if (!spelling.empty()) vartok = child->addtoken(tokenList, spelling); - scope.function->argumentList.push_back(Variable(vartok, child->getType(), i, AccessControl::Argument, nullptr, &scope)); + scope.function->argumentList.push_back(Variable(vartok, child->getType(), nullptr, i, AccessControl::Argument, nullptr, &scope)); if (vartok) { const std::string addr = child->mExtTokens[0]; mData->varDecl(addr, vartok, &scope.function->argumentList.back()); @@ -1127,6 +1127,9 @@ void clangimport::AstNode::createTokensForCXXRecord(TokenList *tokenList) Token * clangimport::AstNode::createTokensVarDecl(TokenList *tokenList) { const std::string addr = mExtTokens.front(); + const Token *startToken = nullptr; + if (std::find(mExtTokens.cbegin(), mExtTokens.cend(), "static") != mExtTokens.cend()) + startToken = addtoken(tokenList, "static"); int typeIndex = mExtTokens.size() - 1; while (typeIndex > 1 && std::isalpha(mExtTokens[typeIndex][0])) typeIndex--; @@ -1136,7 +1139,7 @@ Token * clangimport::AstNode::createTokensVarDecl(TokenList *tokenList) Token *vartok1 = addtoken(tokenList, name); Scope *scope = const_cast(tokenList->back()->scope()); const AccessControl accessControl = (scope->type == Scope::ScopeType::eGlobal) ? (AccessControl::Global) : (AccessControl::Local); - scope->varlist.push_back(Variable(vartok1, type, 0, accessControl, nullptr, scope)); + scope->varlist.push_back(Variable(vartok1, type, startToken, 0, accessControl, nullptr, scope)); mData->varDecl(addr, vartok1, &scope->varlist.back()); if (mExtTokens.back() == "cinit") { Token *eq = addtoken(tokenList, "="); diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index d566ec7e6..014400a4d 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1723,7 +1723,7 @@ void SymbolDatabase::clangSetVariables(const std::vector &vari mVariableList = variableList; } -Variable::Variable(const Token *name_, const std::string &clangType, +Variable::Variable(const Token *name_, const std::string &clangType, const Token *start, nonneg int index_, AccessControl access_, const Type *type_, const Scope *scope_) : mNameToken(name_), @@ -1736,6 +1736,8 @@ Variable::Variable(const Token *name_, const std::string &clangType, mScope(scope_), mValueType(nullptr) { + if (start && start->str() == "static") + setFlag(fIsStatic, true); std::string::size_type pos = clangType.find("["); if (pos != std::string::npos) { diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 3701ef037..ea316c6d0 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -237,7 +237,7 @@ public: evaluate(settings); } - Variable(const Token *name_, const std::string &clangType, + Variable(const Token *name_, const std::string &clangType, const Token *start, nonneg int index_, AccessControl access_, const Type *type_, const Scope *scope_); diff --git a/test/testclangimport.cpp b/test/testclangimport.cpp index ba994465e..05ba90b1f 100644 --- a/test/testclangimport.cpp +++ b/test/testclangimport.cpp @@ -87,6 +87,7 @@ private: TEST_CASE(vardecl3); TEST_CASE(vardecl4); TEST_CASE(vardecl5); + TEST_CASE(vardecl6); TEST_CASE(whileStmt1); TEST_CASE(whileStmt2); @@ -819,6 +820,12 @@ private: ASSERT_EQUALS("const char *const [] sys_errlist@1 ;", parse(clang)); } + void vardecl6() { + const char clang[] = "`-VarDecl 0x278e170 <1.c:1:1, col:16> col:12 x 'int' static cinit\n" + " `-IntegerLiteral 0x278e220 'int' 3"; + ASSERT_EQUALS("static int x@1 = 3 ;", parse(clang)); + } + void whileStmt1() { const char clang[] = "`-FunctionDecl 0x3d45b18 <1.c:1:1, line:3:1> line:1:6 foo 'void ()'\n" " `-CompoundStmt 0x3d45c48 \n"