Retain doc comments on record fields
PiperOrigin-RevId: 401437153
diff --git a/rs_bindings_from_cc/ast_visitor.cc b/rs_bindings_from_cc/ast_visitor.cc
index 726e734..c891b9d 100644
--- a/rs_bindings_from_cc/ast_visitor.cc
+++ b/rs_bindings_from_cc/ast_visitor.cc
@@ -102,15 +102,6 @@
}
bool AstVisitor::VisitRecordDecl(clang::RecordDecl* record_decl) {
- clang::ASTContext& ctx = record_decl->getASTContext();
-
- clang::SourceManager& sm = ctx.getSourceManager();
- clang::RawComment* raw_comment = ctx.getRawCommentForDeclNoCache(record_decl);
- std::optional<std::string> doc_comment;
- if (raw_comment != nullptr) {
- doc_comment = raw_comment->getFormattedText(sm, sm.getDiagnostics());
- }
-
std::vector<Field> fields;
clang::AccessSpecifier default_access = clang::AS_public;
// The definition is always rewritten, but default access to `kPublic` in case
@@ -180,6 +171,7 @@
}
}
}
+ clang::ASTContext& ctx = record_decl->getASTContext();
const clang::ASTRecordLayout& layout = ctx.getASTRecordLayout(record_decl);
for (const clang::FieldDecl* field_decl : record_decl->fields()) {
auto type = ConvertType(field_decl->getType(), ctx);
@@ -198,6 +190,7 @@
}
fields.push_back(
{.identifier = *std::move(field_name),
+ .doc_comment = GetComment(field_decl),
.type = *type,
.access = TranslateAccessSpecifier(access),
.offset = layout.getFieldOffset(field_decl->getFieldIndex())});
@@ -208,7 +201,7 @@
}
ir_.items.push_back(
Record{.identifier = *record_name,
- .doc_comment = doc_comment,
+ .doc_comment = GetComment(record_decl),
.fields = std::move(fields),
.size = layout.getSize().getQuantity(),
.alignment = layout.getAlignment().getQuantity(),
@@ -219,6 +212,19 @@
return true;
}
+std::optional<std::string> AstVisitor::GetComment(
+ const clang::Decl* decl) const {
+ clang::ASTContext& ctx = decl->getASTContext();
+ clang::SourceManager& sm = ctx.getSourceManager();
+ clang::RawComment* raw_comment = ctx.getRawCommentForDeclNoCache(decl);
+
+ if (raw_comment == nullptr) {
+ return {};
+ } else {
+ return raw_comment->getFormattedText(sm, sm.getDiagnostics());
+ }
+}
+
absl::StatusOr<MappedType> AstVisitor::ConvertType(
clang::QualType qual_type, const clang::ASTContext& ctx) const {
std::optional<MappedType> type = std::nullopt;