Получить полное имя шаблона аргумента шаблона с помощью 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,

[Правка № 2] Цепление обменивает один набор проблем на другой. Он правильно создает полные типы для параметров шаблона шаблона. Однако он создает неквалифицированные имена для аргумента и возвращает типы функций (и указатели на функции). Например, приведенный ниже код производит вывод 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. Увидеть эта страница инструкции по созданию учетной записи.

4

Решение

Попробуй это: 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 отпусти, так что надейся на лучшее.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]