Как я могу сопоставить clang::CXXMethodDecl с комментариями документации, которые находятся в заголовке?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу сопоставить clang::CXXMethodDecl с комментариями документации, которые находятся в заголовке?

Сообщение Anonymous »

Я учусь работать с clang AST при разработке инструмента рефакторинга.
Я использую clang::ast_matchers::dynamic::DynTypedMatcher, созданный с помощью вызова clang::ast_matchers::dynamic::Parser::parseMatcherExpression() для запроса cxxMethodDecl() в единице перевода.
Я хотел бы иметь возможность проверять комментарии к документации как часть моего инструмента и из моего clang::ast_matchers::MatchFinder::MatchCallback. Я могу получать необработанные комментарии для определенных совпадающих записей clang::CXXMethodDecl, но не для других, вызывая что-то нравится:

Код: Выделить всё

auto& ast_ctx = ast_unit_ptr->getASTContext();
auto& src_mgr = ast_ctx.getSourceManager();
if (const auto comment = ast_ctx.getRawCommentForDeclNoCache(decl);
comment != nullptr)
{
auto text = comment->getRawText(src_mgr);
...
}
Комментарии к методам обычно пишутся в заголовке, но SourceLocation для записей clang::CXXMethodDecl, которые я получаю в MatchCallback, берутся из исходного файла.
Я могу перебирать комментарии во включениях для единицы перевода, используя что-то вроде:

Код: Выделить всё

for (auto it = src_mgr.fileinfo_begin(); it != src_mgr.fileinfo_end(); ++it)
{
auto info = it->getFirst();
auto file_path = std::filesystem::path{ std::string_view{ info.getName() } };
auto file_id = src_mgr.translateFile(info);
if (file_path.has_extension() && file_path.extension().string().ends_with("h"))
{
const auto comment_map = ast_ctx.Comments.getCommentsInFile(file_id);
if (comment_map)
{
for (auto [offset, comment_ptr] : comment_map)
{
// TODO: Match the offset to the CXXMethodDecl
}
}
}
}
Однако у меня нет способа сопоставить смещения/комментарии, полученные из заголовков, с decls метода.
Я пробовал пройтись по цепочке decl->getPreviousDecl(), чтобы увидеть, есть ли какие-либо связанные объявления, которые могли бы иметь комментарии, но я не нашел там ничего для методов, которые, как я знаю, конкретно имеют комментарии в заголовок.
Это использование clang+llvm-21.1.0

Подробнее здесь: https://stackoverflow.com/questions/797 ... s-that-are
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»