我目前正在建设使用铛C API C ++代码分析器。 解析器将处理头文件和生成为其定义和丢失的符号的列表(它忽略包含指令,所以将解析报头的严格的内容)。 我的问题是,如果我有一个typedef
为一个函数指针这需要一个未定义的类型,诸如一个参数:
typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);
AST的解析SOME_TYPE
作为类型定义,而不是funcPtrName
。 如果我更换SOME_UNDEF_TYPE
与int
,它分析funcPtrName
正确。
我以为我可以使用clang_tokenize
以获取光标的所有令牌和手动获取函数指针的名字,但调用clang_getCursorExtent
上的光标指向的typedef不能正常工作(返回的范围是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 };
}
文章来源: How can I parse a typedef for a function pointer using clang API to get the function pointer name?