Clang import; CXXConstructExpr

This commit is contained in:
Daniel Marjamäki 2020-01-10 18:54:28 +01:00
parent c23d33fc0a
commit 7a3bedb583
2 changed files with 19 additions and 23 deletions

View File

@ -38,6 +38,7 @@ static const std::string ContinueStmt = "ContinueStmt";
static const std::string CStyleCastExpr = "CStyleCastExpr"; static const std::string CStyleCastExpr = "CStyleCastExpr";
static const std::string CXXBoolLiteralExpr = "CXXBoolLiteralExpr"; static const std::string CXXBoolLiteralExpr = "CXXBoolLiteralExpr";
static const std::string CXXConstructorDecl = "CXXConstructorDecl"; static const std::string CXXConstructorDecl = "CXXConstructorDecl";
static const std::string CXXConstructExpr = "CXXConstructExpr";
static const std::string CXXMemberCallExpr = "CXXMemberCallExpr"; static const std::string CXXMemberCallExpr = "CXXMemberCallExpr";
static const std::string CXXMethodDecl = "CXXMethodDecl"; static const std::string CXXMethodDecl = "CXXMethodDecl";
static const std::string CXXOperatorCallExpr = "CXXOperatorCallExpr"; static const std::string CXXOperatorCallExpr = "CXXOperatorCallExpr";
@ -251,29 +252,10 @@ std::string clangimport::AstNode::getSpelling() const
std::string clangimport::AstNode::getType() const std::string clangimport::AstNode::getType() const
{ {
if (nodeType == BinaryOperator) int typeIndex = mExtTokens.size() - 1;
return unquote(mExtTokens[mExtTokens.size() - 2]); while (typeIndex >= 0 && mExtTokens[typeIndex][0] != '\'')
if (nodeType == CStyleCastExpr) typeIndex--;
return unquote((mExtTokens.back() == "<NoOp>") ? return typeIndex == -1 ? "" : unquote(mExtTokens[typeIndex]);
mExtTokens[mExtTokens.size() - 2] :
mExtTokens.back());
if (nodeType == CXXStaticCastExpr)
return unquote(mExtTokens[mExtTokens.size() - 3]);
if (nodeType == DeclRefExpr)
return unquote(mExtTokens.back());
if (nodeType == FunctionDecl) {
int retTypeIndex = mExtTokens.size() - 1;
while (mExtTokens[retTypeIndex][0] != '\'')
retTypeIndex--;
return unquote(mExtTokens[retTypeIndex]);
}
if (nodeType == IntegerLiteral)
return unquote(mExtTokens[mExtTokens.size() - 2]);
if (nodeType == TypedefDecl)
return unquote(mExtTokens.back());
if (nodeType == UnaryExprOrTypeTraitExpr)
return unquote(mExtTokens[mExtTokens.size() - 3]);
return "";
} }
std::string clangimport::AstNode::getTemplateParameters() const std::string clangimport::AstNode::getTemplateParameters() const
@ -524,6 +506,8 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList)
tokenList->back()->setValueType(new ValueType(ValueType::Sign::UNKNOWN_SIGN, ValueType::Type::BOOL, 0)); tokenList->back()->setValueType(new ValueType(ValueType::Sign::UNKNOWN_SIGN, ValueType::Type::BOOL, 0));
return tokenList->back(); return tokenList->back();
} }
if (nodeType == CXXConstructExpr)
return children[0]->createTokens(tokenList);
if (nodeType == CXXMethodDecl) { if (nodeType == CXXMethodDecl) {
createTokensFunctionDecl(tokenList); createTokensFunctionDecl(tokenList);
return nullptr; return nullptr;

View File

@ -38,6 +38,7 @@ private:
TEST_CASE(cstyleCastExpr); TEST_CASE(cstyleCastExpr);
TEST_CASE(cxxBoolLiteralExpr); TEST_CASE(cxxBoolLiteralExpr);
TEST_CASE(cxxConstructorDecl); TEST_CASE(cxxConstructorDecl);
TEST_CASE(cxxConstructExpr);
TEST_CASE(cxxMemberCall); TEST_CASE(cxxMemberCall);
TEST_CASE(cxxOperatorCallExpr); TEST_CASE(cxxOperatorCallExpr);
TEST_CASE(cxxStaticCastExpr1); TEST_CASE(cxxStaticCastExpr1);
@ -200,6 +201,17 @@ private:
ASSERT_EQUALS("void C ( ) { this . x@1 = 0 ; } int x@1", parse(clang)); ASSERT_EQUALS("void C ( ) { this . x@1 = 0 ; } int x@1", parse(clang));
} }
void cxxConstructExpr() {
const char clang[] = "`-FunctionDecl 0x2dd7940 <line:2:1, col:30> col:5 f 'Foo (Foo)'\n"
" |-ParmVarDecl 0x2dd7880 <col:7, col:11> col:11 used foo 'Foo'\n"
" `-CompoundStmt 0x2dd80c0 <col:16, col:30>\n"
" `-ReturnStmt 0x2dd80a8 <col:18, col:25>\n"
" `-CXXConstructExpr 0x2dd8070 <col:25> 'Foo' 'void (Foo &&) noexcept'\n"
" `-ImplicitCastExpr 0x2dd7f28 <col:25> 'Foo' xvalue <NoOp>\n"
" `-DeclRefExpr 0x2dd7a28 <col:25> 'Foo' lvalue ParmVar 0x2dd7880 'foo' 'Foo'";
ASSERT_EQUALS("Foo f ( Foo foo@1 ) { return foo@1 ; }", parse(clang));
}
void cxxMemberCall() { void cxxMemberCall() {
const char clang[] = "`-FunctionDecl 0x320dc80 <line:2:1, col:33> col:6 bar 'void ()'\n" const char clang[] = "`-FunctionDecl 0x320dc80 <line:2:1, col:33> col:6 bar 'void ()'\n"
" `-CompoundStmt 0x323bb08 <col:12, col:33>\n" " `-CompoundStmt 0x323bb08 <col:12, col:33>\n"