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

How can I parse a typedef for a function pointer using clang API to get the function pointer name?

本文关键字:函数 指针 typedef API 何使用 clang      更新时间:2023-10-16

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

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);

AST将SOME_TYPE解析为类型定义而不是funcPtrName。如果我用int代替SOME_UNDEF_TYPE,它可以正确解析funcPtrName

我认为我可以使用clang_tokenize来获取游标的所有令牌,并手动获取函数指针名称,但是在指向typedef的游标上调用clang_getCursorExtent不能正确工作(返回的范围为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 };
   }