Шаблонный курсор конструктора и шаблонный курсор элемента имеют вид FUNCTION_TEMPLATE в libclang

В некотором контексте

Я не знаком с libclang. Я просто модифицирую плагин vim, который использует привязки python к libclang .

Существует функция python, которая получает параметр курсора. Это называется почти для каждого узла в АСТ текущего буфера C ++.

Проблема

cursor.kind используется для получения типа курсора. Все в порядке, за исключением того, что

  • шаблонные объявления бесплатных функций,
  • шаблонные объявления конструкторов и
  • объявления шаблонных методов

все они имеют одинаковый вид: FUNCTION_TEMPLATE . Мне нужно различать их.

Больше информации

Например, не-шаблонные версии выше имеют следующие типы:

  • FUNCTION_DECL
  • CXX_METHOD и
  • CONSTRUCTOR .

У меня есть поиск источника cindex.py и нет CXX_METHOD_TEMPLATE или CONSTRUCTOR_TEMPLATE или подобных.

Я пробовал без успеха, чтобы как-то получить нужную мне информацию, например, с помощью cursor.get_definition() и cursor.underlying_typedef_type.get_declaration() .

Единственный частичный успех, который я получил, заключается в том, что для метода и конструктора семантический и лексический родитель является STRUCT_DECL .

Мне все равно, если это шаблон или нет. Все, что мне нужно, это конструктор, член или свободная функция.

Подвести итог

Учитывая курсор, как я могу определить, является ли это метод (даже шаблонный), конструктор (даже шаблонный) или объявление свободной функции?

ТЛ; др

 cindex.CursorKind.from_id(cindex.conf.lib.clang_getTemplateCursorKind(cursor)) 

Просмотрев документацию Cxyclang онлайн-доксигена, мы обнаруживаем, что в Cros-AST ASTRO- функции функция clang_getTemplateCursorKind

 CINDEX_LINKAGE enum CXCursorKind clang_getTemplateCursorKind (CXCursor C) 

Учитывая курсор, который представляет шаблон, определите тип курсора специализации, который будет сгенерирован путем создания экземпляра шаблона.

Это именно то, что я хочу. К сожалению, вызов его в Python не так прост.

Оглядываясь, это то, как мы называем C функции, явно не реализованные в Python:

 tk = cindex.conf.lib.clang_getTemplateCursorKind(cursor) 

Не спрашивайте, черная магия.

Следующий удар в дороге состоит в том, что эта функция возвращает длинную. Если мы действительно хотим объект CursorKind , нам нужно следующее:

 cindex.CursorKind.from_id(tk)