[PATCH] D131298: [clang-doc] Read docstrings for record members
Paul Kirth via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 8 14:51:31 PDT 2022
paulkirth requested changes to this revision.
paulkirth added a comment.
This revision now requires changes to proceed.
I agree w/ @phosek on unit testing.
Additionally, while we don't have many of them in clang-doc, an end-to-end test would also be welcome. In this case, it will also probably help w/ review, since we can see how clang-doc output is changing as part of the review process. To be clear: I'm not going to block acceptance on the end-to-end tests, since that may be asking too much. It would just be helpful.
I've left more direct feedback inline.
================
Comment at: clang-tools-extra/clang-doc/BitcodeReader.cpp:354
+template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) {
+ I->Description.emplace_back();
+ return &I->Description.back();
----------------
So, I see that this uses the same pattern as in other `getCommentInfo(...)` API's, but I'm a bit confused by this.
Do we always grow the vector whenever `getCommentInfo(...)` is called? I would expect a `get...` function to be `const` and just return data. This grows the `Description` vector on every call, which seems like an odd choice. The pattern is also pervasive in BitcodeReader.cpp.
@phosek is this intentional? If `Description` exceeds capacity and reallocs on `emplace_back`, then any reference it had returned would be invalidated, right? Or am I missing something here re: the various `*TypeInfos` and how clang-doc uses them?
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:439
+static void populateMemberTypeInfo(MemberTypeInfo &I, const FieldDecl *D) {
+ ASTContext& Context = D->getASTContext();
+ RawComment *Comment = Context.getRawCommentForDeclNoCache(D);
----------------
I think we need to at least assert that `D != nullptr`. While there is only one caller now, its likely there may be more in the future. Plus `nullptr` is deref is never fun to debug.
If getting a `nullptr` is expected to be a common input, then an early return is also fine.
If you prefer, a few places in the codebase do both to maintain correct behavior when asserts are disabled. Often they have a form along these lines:
```
if(!D){
assert(false && "Some error message");
return;
}
```
Any of these would be fine, and I don't have a preference between them.
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:440
+ ASTContext& Context = D->getASTContext();
+ RawComment *Comment = Context.getRawCommentForDeclNoCache(D);
+ if (!Comment)
----------------
If the goal is to get the FullComment, then doesn't `getCommentForDecl(...) ` handle that? This also seems like an area where we'd want to use caching if we could.
================
Comment at: clang-tools-extra/clang-doc/YAMLGenerator.cpp:195
IO.mapOptional("Access", I.Access, clang::AccessSpecifier::AS_none);
+ IO.mapOptional("Description", I.Description);
}
----------------
Can we get a comment describing this?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D131298/new/
https://reviews.llvm.org/D131298
More information about the cfe-commits
mailing list