Search code examples
clangllvmlibclanglibtooling

Getting the signature of a FunctionDecl


I got the FunctionDecl for the definition of a function. There is no declaration for this function.

For example:

int foo(char c, double d)
{
   ...
}

How do I get the signature (qualifier, return type, function name, parametrs) as a valid signature I could use to make a declaration?


Solution

  • I found that the easiest way is to use the lexer to get the signature of the function. Since I wanted to make a declaration out of a definition, I wanted the declaration to look exactly like the definition. Therefore I defined a SourceRange from the start of the function to the beginning of the body of the function (minus the opening "{") and let the lexer give me this range as a string.

    static std::string getDeclaration(const clang::FunctionDecl* D)
    {
      clang::ASTContext& ctx = D->getASTContext();
      clang::SourceManager& mgr = ctx.getSourceManager();
    
      clang::SourceRange range = clang::SourceRange(D->getSourceRange().getBegin(), D->getBody()->getSourceRange().getBegin());
      StringRef s = clang::Lexer::getSourceText(clang::CharSourceRange::getTokenRange(range), mgr, ctx.getLangOpts());
    
      return s.substr(0, s.size() - 2).str().append(";");
    }
    

    This solution assums that the FunctionDecl is a definition (has a body).