Clang import; CXXStaticCast

This commit is contained in:
Daniel Marjamäki 2020-01-09 20:53:06 +01:00
parent bf62138237
commit b8aa71bc87
2 changed files with 27 additions and 2 deletions

View File

@ -41,6 +41,7 @@ static const std::string CXXMemberCallExpr = "CXXMemberCallExpr";
static const std::string CXXMethodDecl = "CXXMethodDecl";
static const std::string CXXOperatorCallExpr = "CXXOperatorCallExpr";
static const std::string CXXRecordDecl = "CXXRecordDecl";
static const std::string CXXStaticCastExpr = "CXXStaticCastExpr";
static const std::string CXXThisExpr = "CXXThisExpr";
static const std::string DeclRefExpr = "DeclRefExpr";
static const std::string DeclStmt = "DeclStmt";
@ -322,7 +323,9 @@ const Scope *clangastdump::AstNode::getNestedInScope(TokenList *tokenList)
void clangastdump::AstNode::setValueType(Token *tok)
{
int typeIndex = -1;
if (nodeType == UnaryExprOrTypeTraitExpr)
if (nodeType == CXXStaticCastExpr)
typeIndex = mExtTokens.size() - 3;
else if (nodeType == UnaryExprOrTypeTraitExpr)
typeIndex = mExtTokens.size() - 3;
else
return;
@ -330,7 +333,9 @@ void clangastdump::AstNode::setValueType(Token *tok)
TokenList decl(nullptr);
addTypeTokens(&decl, mExtTokens[typeIndex]);
if (Token::simpleMatch(decl.front(), "unsigned long"))
if (Token::simpleMatch(decl.front(), "int"))
tok->setValueType(new ValueType(ValueType::Sign::SIGNED, ValueType::Type::INT, 0));
else if (Token::simpleMatch(decl.front(), "unsigned long"))
tok->setValueType(new ValueType(ValueType::Sign::UNSIGNED, ValueType::Type::LONG, 0));
}
@ -456,6 +461,18 @@ Token *clangastdump::AstNode::createTokens(TokenList *tokenList)
createTokensForCXXRecord(tokenList);
return nullptr;
}
if (nodeType == CXXStaticCastExpr) {
Token *cast = addtoken(tokenList, getSpelling());
Token *par1 = addtoken(tokenList, "(");
Token *expr = children[0]->createTokens(tokenList);
Token *par2 = addtoken(tokenList, ")");
par1->link(par2);
par2->link(par1);
par1->astOperand1(cast);
par1->astOperand2(expr);
setValueType(par1);
return par1;
}
if (nodeType == CXXThisExpr)
return addtoken(tokenList, "this");
if (nodeType == DeclStmt)

View File

@ -39,6 +39,7 @@ private:
TEST_CASE(cxxConstructorDecl);
TEST_CASE(cxxMemberCall);
TEST_CASE(cxxOperatorCallExpr);
TEST_CASE(cxxStaticCastExpr);
TEST_CASE(forStmt);
TEST_CASE(funcdecl1);
TEST_CASE(funcdecl2);
@ -216,6 +217,13 @@ private:
ASSERT_EQUALS("void foo ( ) { C c@1 ; c@1 . operator= ( 4 ) ; }", parse(clang));
}
void cxxStaticCastExpr() {
const char clang[] = "`-VarDecl 0x2e0e650 <a.cpp:2:1, col:27> col:5 a 'int' cinit\n"
" `-CXXStaticCastExpr 0x2e0e728 <col:9, col:27> 'int' static_cast<int> <NoOp>\n"
" `-IntegerLiteral 0x2e0e6f0 <col:26> 'int' 0";
ASSERT_EQUALS("int a@1 = static_cast<int> ( 0 ) ;", parse(clang));
}
void forStmt() {
const char clang[] = "`-FunctionDecl 0x2f93ae0 <1.c:1:1, col:56> col:5 main 'int ()'\n"
" `-CompoundStmt 0x2f93dc0 <col:12, col:56>\n"