5

How to get parameter information as a string from FunctionDecl class in clang . I'm trying but getting confused by so many inheritances. Also they compiler is saying that getReturnType() is not a member of FunctionDecl but doxygen documentation says otherwise . Please help. http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html

using namespace std;
using namespace clang;
using namespace clang::driver;
using namespace clang::tooling;
using namespace llvm;

.......
class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> 
{
    ......
    virtual bool VisitFunctionDecl(FunctionDecl *func) 
    {
            numFunctions++;
            string funcName = func->getNameInfo().getName().getAsString();
            string retName = func->getReturnType().getAsString();
            ...
            return true;
    }

}

Errors:-

‘class clang::FunctionDecl’ has no member named ‘getReturnType’

beresfordt
  • 5,088
  • 10
  • 35
  • 43
Sourav Mukherjee
  • 299
  • 7
  • 13

4 Answers4

3

Depending if you need a qualified or unqualified name, you can stringify your return type and parameter names as follows

std::string retType = F->getReturnType().getAsString();
std::string arg0;
if(F->getNumParams() > 0)
  arg0 = F->parameters()[0]->getQualifiedNameAsString();

Check out the getAsString() method provided.


Edit: after your comments I figured out that you don't have the latest Clang source code. Please check it out before retrying. Good luck!

Marco A.
  • 43,032
  • 26
  • 132
  • 246
  • Then why is it saying that getReturnType() is not a member of FunctionDecl. – Sourav Mukherjee Jun 23 '14 at 11:03
  • Either that error is coming from somewhere else or you're getting the wrong FunctionDecl - GitHub repository mirror (https://github.com/llvm-mirror/clang/blob/master/include/clang/AST/Decl.h) – Marco A. Jun 23 '14 at 11:07
2

try this,

getResultType() 

rather than

getReturnType()

llvm 3.4 has no member getReturnType() but identical function whose name is getResultType() exists.

Shawn Mehan
  • 4,513
  • 9
  • 31
  • 51
0

To get all parameter list dynamically, below code would help.

string retName = func->getReturnType().getAsString();
for(int i=0; i<func->getNumParams(); i++)
{
    std::cout << " " << func->parameters()[i]->getQualifiedNameAsString();
}
...     
S S
  • 920
  • 1
  • 17
  • 34
0

Here is a working function to print all the information about a FunctionDecl.Tested on Windows/LLVM6.0.0

void printFunctionDecl(FunctionDecl* f) 
{
    std::cout << "FunctionDecl@:"<<f<<":"
        << f->getReturnType().getAsString()<<" "
        << f->getQualifiedNameAsString()
        <<"(";

    for (int i = 0; i < f->getNumParams(); i++)
    {
        if (i > 0) std::cout << ",";             
        std::cout 
            << QualType::getAsString(f->parameters()[i]->getType().split()
                , PrintingPolicy{ {} })<<" "
            << f->parameters()[i]->getQualifiedNameAsString();          
    }

    std::cout << ")"
        <<"   Definition@"<<f->getDefinition()
        <<"\n";
}
jw_
  • 1,663
  • 18
  • 32