Получите полное имя аргумента шаблона шаблона с помощью libtooling

Я пытаюсь использовать libtooling для печати CXXRecordDecl обоснования класса шаблона с параметром шаблона шаблона. К сожалению, строковое представление параметра шаблона шаблона не является полным (например, отсутствуют пространства имен).

Я печатаю CXXRecordDecl с помощью этого кода:

clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);

Вот пример, когда я ожидал, что вывод будет ns::A<ns::B>, но я получаю ns::A<B>:

namespace ns {

template <template <class> class T>
class A {
  T<int> x;
};

template <class T>
class B {
  T y;
};

} // namespace ns

int main(int argc, char **argv)
{
  using namespace ns;
  A<B> z;
}

Как напечатать полное имя класса с параметром шаблона шаблона?

Кстати, есть ли способ сделать это без вызова getCanonicalTypeInternal, который звучит как внутренняя функция?

[Редактировать #1] Я также пробовал decl->getQualifiedNameAsString(), который полностью опускает аргументы шаблона и выводит ns::A.

[Edit #2] Cling меняет один набор проблем на другой. Он правильно создает полные типы для параметров шаблона шаблона. Однако он создает неполные имена для аргументов и возвращаемых типов функций (и указателей на функции). Например, приведенный ниже код выводит ns::A<void (B)> вместо ns::A<void (ns::B)>:

namespace ns {

class B { };

template <class T>
class A { };

} // namespace

int main(int argc, char **argv)
{
  using namespace ns;

  A<void (B)> x;
}

[Редактировать #3] я опубликовал проблему на Cling средство отслеживания проблем для вышеуказанной проблемы. Обратите внимание, что для просмотра страницы необходимо войти в систему с облегченной учетной записью CERN. Инструкции по созданию учетной записи см. на этой странице.


person Michael Koval    schedule 11.11.2015    source источник


Ответы (1)


Попробуйте это: decl->getQualifiedNameAsString();

Похоже, что на данный момент у clang/libclang есть подходящие части, но нет подходящего и простого решения, которое просто печатает полное имя,

см. этот http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html

но есть проект cling на основе clang, в котором реализована такая функциональность, смотрите здесь:

https://root.cern.ch/gitweb?p=root.git;a=blob;f=interpreter/cling/include/cling/Utils/AST.h;h=91cea2ef82f6a6b2ed4671d43253b1c0ebd86fd4;hb=HEAD

std::string GetFullyQualifiedName(clang::QualType QT,
                                        const clang::ASTContext &Ctx);

это именно то, что вы ищете, после подачи заявки на ваш пример он возвращает ns::A<ns::B>

Похоже, они интегрируют эту функциональность в следующий или последующий выпуск clang/libclang, так что надейтесь на лучшее.

person fghj    schedule 11.11.2015
comment
decl->getQualifiedNameAsString() выводит ns::A. Это на самом деле еще хуже — полностью опускает аргументы шаблона. - person Michael Koval; 11.11.2015
comment
Благодарю вас! Это было именно то, что я ищу. Как и плакат в списке рассылки LLVM, я очень удивлен, что это недоступно в libtooling. - person Michael Koval; 12.11.2015
comment
Cling правильно обрабатывает аргументы шаблона. Однако он создает неполные имена типов для аргументов функции и возвращаемых значений. Любые идеи? - person Michael Koval; 20.11.2015