如何使用clang API解析函数指针的typedef以获取函数指针名称?

时间:2014-06-05 07:43:07

标签: c++ parsing clang abstract-syntax-tree libclang

我目前正在使用clang C API为C ++代码构建解析器。解析器将处理头文件并为其生成已定义和缺失符号的列表(它忽略包含指令,因此它将严格解析头的内容)。我的问题是,如果我有一个typedef的函数指针,它接受一个未定义类型的参数,例如:

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);

AST将SOME_TYPE解析为typedef而不是funcPtrName。如果我将SOME_UNDEF_TYPE替换为int,则会正确解析funcPtrName

我以为我可以使用clang_tokenize获取游标的所有标记并手动获取函数指针名称,但是指向typedef的光标上调用clang_getCursorExtent不能正常工作(范围)返回是0,0)。

你知道解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:0)

我确实设法通过在翻译单元中构建所有令牌的列表并将其传递给访问者功能来解决该问题。当我到达CXCursor_TypedefDecl光标时,我在标记列表中搜索typedef名称,然后检查下一个标记是否为(。如果是这样,请期待*之后的第一个标记,它将是函数指针的名称。

以下是一些示例代码:

   std::string symbol = clang_getCString(clang_getCursorSpelling(Cursor));

   ...

   case CXCursor_TypedefDecl:
   {
       auto finder = std::find(tokens.begin(), tokens.end(), symbol);
       if (*(finder + 1) == "(")
       {
           auto next = std::find(finder, parserData->tokens.end(), "*") + 1;
           symbol = *next;
       }
       symbolData[symbol] = SymbolInfo{ cursorKind, fileName };
   }