How can I parse a typedef for a function pointer u

2019-08-13 01:10发布

问题:

I am currently building a parser for C++ code using the clang C API. The parser will process a header file and generate a list of defined and missing symbols for it (it ignores include directives, so it will parse strictly the contents of the header). My problem is, if I have a typedef for a function pointer which takes an argument of an undefined type, such as:

typedef SOME_TYPE (* funcPtrName)(SOME_UNDEF_TYPE x);

the AST parses SOME_TYPE as the typedef instead of funcPtrName. If I replace SOME_UNDEF_TYPE with int, it parses funcPtrName correctly.

I thought I could use clang_tokenize to get all the tokens for the cursor and manually get the function pointer name, but calling clang_getCursorExtent on the cursor pointing to the typedef does not work correctly (the range returned is 0,0).

Do you know any way around this issue?

回答1:

I did manage to work around the issue by building a list of all the tokens in the translation unit and passing that over to the visitor function. When I reached the CXCursor_TypedefDecl cursor, I searched for the typedef name in the tokens list and then checked if the next token is (. If so, look forward to the first token after *, which will be the name of the function pointer.

Here is some sample code:

   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 };
   }