diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index e06723c57..f8145d1fc 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -252,12 +252,21 @@ std::string clangimport::AstNode::getSpelling() const int typeIndex = 1; while (typeIndex < mExtTokens.size() && mExtTokens[typeIndex][0] != '\'') typeIndex++; + // name is next quoted token int nameIndex = typeIndex + 1; while (nameIndex < mExtTokens.size() && mExtTokens[nameIndex][0] != '\'') nameIndex++; return (nameIndex < mExtTokens.size()) ? unquote(mExtTokens[nameIndex]) : ""; } + if (nodeType == UnaryExprOrTypeTraitExpr) { + int typeIndex = 1; + while (typeIndex < mExtTokens.size() && mExtTokens[typeIndex][0] != '\'') + typeIndex++; + int nameIndex = typeIndex + 1; + return (nameIndex < mExtTokens.size()) ? unquote(mExtTokens[nameIndex]) : ""; + } + int typeIndex = mExtTokens.size() - 1; if (nodeType == FunctionDecl) { while (mExtTokens[typeIndex][0] != '\'') @@ -759,7 +768,10 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList) if (nodeType == UnaryExprOrTypeTraitExpr) { Token *tok1 = addtoken(tokenList, getSpelling()); Token *par1 = addtoken(tokenList, "("); - addTypeTokens(tokenList, mExtTokens.back()); + if (children.empty()) + addTypeTokens(tokenList, mExtTokens.back()); + else + addTypeTokens(tokenList, children[0]->getType()); Token *par2 = addtoken(tokenList, ")"); par1->link(par2); par2->link(par1); diff --git a/test/testclangimport.cpp b/test/testclangimport.cpp index b62f62e28..00d804f0a 100644 --- a/test/testclangimport.cpp +++ b/test/testclangimport.cpp @@ -65,7 +65,8 @@ private: TEST_CASE(typedefDecl1); TEST_CASE(typedefDecl2); TEST_CASE(typedefDecl3); - TEST_CASE(unaryExprOrTypeTraitExpr); + TEST_CASE(unaryExprOrTypeTraitExpr1); + TEST_CASE(unaryExprOrTypeTraitExpr2); TEST_CASE(unaryOperator); TEST_CASE(vardecl1); TEST_CASE(vardecl2); @@ -495,13 +496,22 @@ private: ASSERT_EQUALS("typedef char * __builtin_ms_va_list ;", parse(clang)); } - void unaryExprOrTypeTraitExpr() { + void unaryExprOrTypeTraitExpr1() { const char clang[] = "`-VarDecl 0x24cc610 col:5 x 'int' cinit\n" " `-ImplicitCastExpr 0x24cc6e8 'int' \n" " `-UnaryExprOrTypeTraitExpr 0x24cc6c8 'unsigned long' sizeof 'int'\n"; ASSERT_EQUALS("int x@1 = sizeof ( int ) ;", parse(clang)); } + void unaryExprOrTypeTraitExpr2() { + const char clang[] = "`-VarDecl 0x27c6c00 col:9 x 'int' cinit\n" + " `-ImplicitCastExpr 0x27c6cc8 'int' \n" + " `-UnaryExprOrTypeTraitExpr 0x27c6ca8 'unsigned long' sizeof\n" + " `-ParenExpr 0x27c6c88 'char [10]' lvalue\n" + " `-DeclRefExpr 0x27c6c60 'char [10]' lvalue Var 0x27c6b48 'buf' 'char [10]'"; + ASSERT_EQUALS("int x@1 = sizeof ( char [10] ) ;", parse(clang)); + } + void unaryOperator() { const char clang[] = "`-FunctionDecl 0x2dd9748 <1.cpp:2:1, col:44> col:5 foo 'int (int *)'\n" " |-ParmVarDecl 0x2dd9680 col:19 used p 'int *'\n"