Я пробовал разобрать методы C ++ с помощью libClang, но при попытке получить параметры / аргументы функций иногда выдает неправильные типы.
Пример:
У меня есть два отдельных метода
std::string Method::exportMethod(std::map<std::string, std::string> &defines) const
и
std::string Field::exportField(std::map<std::string, std::string> &defines) const
, и я распечатываю AST (для целей отладки) с помощью
CXChildVisitResult printer::printVisitor(CXCursor c, CXCursor parent, CXClientData clientData) {
recursivePrintData data = *static_cast<recursivePrintData *>(clientData);
*(data.stream) <<
data.indent <<
clang_getCursorKindSpelling(clang_getCursorKind(c)) <<
"; name: " << clang_getCursorSpelling(c) <<
", type: " << clang_getCursorType(c) <<
", arg0Type: " << clang_getArgType(clang_getCursorType(c), 0) <<
std::endl;
recursivePrintData newDat(data);
data.indent += " ";
clang_visitChildren(c, printVisitor, (void *) &data);
return CXChildVisit_Recurse;
}
(recursivePrintData - это структура, содержащая выходной поток и текущий уровень отступа)
Для двух методов выходные данные следующие:
exportMethod:
CXXMethod; name: exportMethod, type: std::string (int &) const, arg0Type: int &
NamespaceRef; name: std, type: , arg0Type:
TypeRef; name: std::string, type: std::string, arg0Type:
ParmDecl; name: defines, type: int &, arg0Type:
exportField:
CXXMethod; name: exportField, type: std::string (std::map<std::string, std::string> &) const, arg0Type: std::map<std::string, std::string> &
NamespaceRef; name: std, type: , arg0Type:
TypeRef; name: std::string, type: std::string, arg0Type:
ParmDecl; name: defines, type: std::map<std::string, std::string> &, arg0Type:
NamespaceRef; name: std, type: , arg0Type:
TemplateRef; name: map, type: , arg0Type:
NamespaceRef; name: std, type: , arg0Type:
TypeRef; name: std::string, type: std::string, arg0Type:
NamespaceRef; name: std, type: , arg0Type:
TypeRef; name: std::string, type: std::string, arg0Type:
NamespaceRef; name: std, type: , arg0Type:
TemplateRef; name: map, type: , arg0Type:
NamespaceRef; name: std, type: , arg0Type:
TypeRef; name: std::string, type: std::string, arg0Type:
NamespaceRef; name: std, type: , arg0Type:
TypeRef; name: std::string, type: std::string, arg0Type:
Даже если два метода, по сути, одинаковы (кроме имени), он неправильно определяет аргумент первого как целочисленную ссылку, тогда как второй обрабатывает правильно. Что могло быть причиной этого?