получение информации о параметрах из класса FunctionDecl в clang

#c #clang #libtooling

#c #clang #libtooling

Вопрос:

Как получить информацию о параметрах в виде строки из класса FunctionDecl в clang. Я пытаюсь, но меня смущает так много наследований. Также компилятор сообщает, что getReturnType() не является членом FunctionDecl, но документация doxygen говорит об обратном. Пожалуйста, помогите. 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;
    }

}
 

Ошибки:-

‘class clang::FunctionDecl’ не имеет члена с именем ‘getReturnType’

Комментарии:

1. Покажите свой код и ошибки, которые вы получаете.

2. вопрос отредактирован с помощью кода

3. Предполагая, что документация верна: clang.llvm.org/doxygen/… Откуда эта ошибка? Вы уверены, что это из этой строки? Можете ли вы попытаться полностью квалифицировать его с помощью clang::FunctionDecl?

4. квалификация не помогла, и ошибка только в этой строке

5. Это странно, пожалуйста, перейдите и проверьте Decl.h для getReturnType() . Если у вас ее нет, возможно, вам придется обновить источники clang

Ответ №1:

В зависимости от того, требуется ли вам определенное или неквалифицированное имя, вы можете указать возвращаемый тип и имена параметров следующим образом

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

Проверьте предоставленный метод getAsString().


Редактировать: после ваших комментариев я понял, что у вас нет последнего исходного кода Clang. Пожалуйста, проверьте это перед повторной попыткой. Удачи!

Комментарии:

1. Тогда почему говорится, что getReturnType() не является членом FunctionDecl .

2. Либо эта ошибка исходит откуда-то еще, либо вы получаете неправильное зеркало репозитория FunctionDecl — GitHub ( github.com/llvm-mirror/clang/blob/master/include/clang/AST /… )

Ответ №2:

попробуйте это,

 getResultType() 
 

вместо

 getReturnType()
 

llvm 3.4 не имеет члена getReturnType() , кроме идентичной функции, имя которой getResultType() существует.

Ответ №3:

Чтобы получить весь список параметров динамически, приведенный ниже код поможет.

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

Ответ №4:

Вот рабочая функция для печати всей информации о FunctionDecl.Протестировано на 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";
}