clang import; fix symbol database for 'struct Fred { int a; }; int b; void f(int c, int d) { int e; }'
This commit is contained in:
parent
372161c89b
commit
64608f4e95
|
@ -22,6 +22,7 @@
|
||||||
#include "tokenize.h"
|
#include "tokenize.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
@ -1158,7 +1159,8 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList *tokenList)
|
||||||
|
|
||||||
void clangimport::AstNode::createTokensForCXXRecord(TokenList *tokenList)
|
void clangimport::AstNode::createTokensForCXXRecord(TokenList *tokenList)
|
||||||
{
|
{
|
||||||
Token *classToken = addtoken(tokenList, "class");
|
bool isStruct = (std::find(mExtTokens.begin(), mExtTokens.end(), "struct") != mExtTokens.end());
|
||||||
|
Token *classToken = addtoken(tokenList, isStruct ? "struct" : "class");
|
||||||
const std::string className = mExtTokens[mExtTokens.size() - 2] + getTemplateParameters();
|
const std::string className = mExtTokens[mExtTokens.size() - 2] + getTemplateParameters();
|
||||||
/*Token *nameToken =*/ addtoken(tokenList, className);
|
/*Token *nameToken =*/ addtoken(tokenList, className);
|
||||||
std::vector<AstNodePtr> children2;
|
std::vector<AstNodePtr> children2;
|
||||||
|
@ -1173,7 +1175,7 @@ void clangimport::AstNode::createTokensForCXXRecord(TokenList *tokenList)
|
||||||
addtoken(tokenList, ";");
|
addtoken(tokenList, ";");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Scope *scope = createScope(tokenList, Scope::ScopeType::eClass, children2, classToken);
|
Scope *scope = createScope(tokenList, isStruct ? Scope::ScopeType::eStruct : Scope::ScopeType::eClass, children2, classToken);
|
||||||
scope->className = className;
|
scope->className = className;
|
||||||
mData->mSymbolDatabase->typeList.push_back(Type(classToken, scope, classToken->scope()));
|
mData->mSymbolDatabase->typeList.push_back(Type(classToken, scope, classToken->scope()));
|
||||||
scope->definedType = &mData->mSymbolDatabase->typeList.back();
|
scope->definedType = &mData->mSymbolDatabase->typeList.back();
|
||||||
|
@ -1198,8 +1200,7 @@ Token * clangimport::AstNode::createTokensVarDecl(TokenList *tokenList)
|
||||||
}
|
}
|
||||||
Token *vartok1 = addtoken(tokenList, name);
|
Token *vartok1 = addtoken(tokenList, name);
|
||||||
Scope *scope = const_cast<Scope *>(tokenList->back()->scope());
|
Scope *scope = const_cast<Scope *>(tokenList->back()->scope());
|
||||||
const AccessControl accessControl = (scope->type == Scope::ScopeType::eGlobal) ? (AccessControl::Global) : (AccessControl::Local);
|
scope->varlist.push_back(Variable(vartok1, type, startToken, 0, scope->defaultAccess(), nullptr, scope));
|
||||||
scope->varlist.push_back(Variable(vartok1, type, startToken, 0, accessControl, nullptr, scope));
|
|
||||||
mData->varDecl(addr, vartok1, &scope->varlist.back());
|
mData->varDecl(addr, vartok1, &scope->varlist.back());
|
||||||
if (mExtTokens.back() == "cinit" && !children.empty()) {
|
if (mExtTokens.back() == "cinit" && !children.empty()) {
|
||||||
Token *eq = addtoken(tokenList, "=");
|
Token *eq = addtoken(tokenList, "=");
|
||||||
|
|
|
@ -1856,7 +1856,12 @@ Variable::Variable(const Token *name_, const std::string &clangType, const Token
|
||||||
mScope(scope_),
|
mScope(scope_),
|
||||||
mValueType(nullptr)
|
mValueType(nullptr)
|
||||||
{
|
{
|
||||||
if (start && start->str() == "static")
|
if (!mTypeStartToken && mTypeEndToken) {
|
||||||
|
mTypeStartToken = mTypeEndToken;
|
||||||
|
while (Token::Match(mTypeStartToken->previous(), "%type%|*|&"))
|
||||||
|
mTypeStartToken = mTypeStartToken->previous();
|
||||||
|
}
|
||||||
|
if (Token::simpleMatch(mTypeStartToken, "static"))
|
||||||
setFlag(fIsStatic, true);
|
setFlag(fIsStatic, true);
|
||||||
|
|
||||||
if (endsWith(clangType, " &", 2))
|
if (endsWith(clangType, " &", 2))
|
||||||
|
|
|
@ -75,13 +75,16 @@ def todo_check_ast(code):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test1():
|
def test_symbol_database_1():
|
||||||
check_symbol_database('int main(){return 0;}')
|
check_symbol_database('int main(){return 0;}')
|
||||||
|
|
||||||
def test2():
|
def test_symbol_database_2():
|
||||||
code = 'struct Foo { void f(); }; void Foo::f() {}'
|
code = 'struct Foo { void f(); }; void Foo::f() {}'
|
||||||
check_symbol_database(code)
|
check_symbol_database(code)
|
||||||
|
|
||||||
|
def test_symbol_database_3():
|
||||||
|
check_symbol_database('struct Fred { int a; }; int b; void f(int c, int d) { int e; }')
|
||||||
|
|
||||||
def test_ast_calculations():
|
def test_ast_calculations():
|
||||||
check_ast('int x = 5; int y = (x + 4) * 2;')
|
check_ast('int x = 5; int y = (x + 4) * 2;')
|
||||||
check_ast('long long dostuff(int x) { return x ? 3 : 5; }')
|
check_ast('long long dostuff(int x) { return x ? 3 : 5; }')
|
||||||
|
|
Loading…
Reference in New Issue