[PATCH] D66238: [clang-doc] Serialize inherited attributes and methods
Julie Hockett via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 14 16:16:30 PDT 2019
juliehockett added inline comments.
================
Comment at: clang-tools-extra/clang-doc/BitcodeWriter.h:33
// BitCodeConstants, though they can be added without breaking it.
static const unsigned VersionNumber = 2;
----------------
I definitely haven't been particularly good about bumping this, but can you bump it? This is a decently large change.
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:233
-static void parseFields(RecordInfo &I, const RecordDecl *D, bool PublicOnly) {
+static bool documentInfo(bool PublicOnly, bool IsInAnonymousNamespace,
+ const NamedDecl *D) {
----------------
s/documentInfo/shouldSerializeInfo
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:277
for (const FieldDecl *F : D->fields()) {
- if (PublicOnly && !isPublic(F->getAccessUnsafe(), F->getLinkageInternal()))
+ if (!documentInfo(PublicOnly, false, F))
continue;
----------------
s/false/`/*IsInAnonymousNamespace=*/false`
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:436
+ if (const CXXRecordDecl *Base =
+ cast_or_null<CXXRecordDecl>(Ty->getDecl()->getDefinition())) {
+ bool IsVirtual = false;
----------------
Will `getDecl()` always return a non-null pointer? In the normal case I'd assume so, but the `cast_or_null` will only catch a null coming out of `getDefinition()` or the cast, not `getDecl`, so just want to check.
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:437-439
+ bool IsVirtual = false;
+ if (B.isVirtual())
+ IsVirtual = true;
----------------
Is there a reason this isn't `bool IsVirtual = B.IsVirtual()`?
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:440-446
+ SymbolID USR = getUSRForDecl(Base);
+ std::string BaseName = Base->getNameAsString();
+ if (const auto *Ty = B.getType()->getAs<TemplateSpecializationType>()) {
+ const TemplateDecl *D = Ty->getTemplateName().getAsTemplateDecl();
+ USR = getUSRForDecl(D);
+ BaseName = B.getType().getAsString();
+ }
----------------
Do this in an if/else -- `getNameAsString()` is a decently expensive operation, so only do it when you need it.
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:447-450
+ I.Bases.emplace_back(
+ USR, BaseName, getInfoRelativePath(Base), IsVirtual,
+ getFinalAccessSpecifier(ParentAccess, B.getAccessSpecifier()),
+ IsParent);
----------------
It would be better to create the BaseRecordInfo and then move it into the vector, since the constructor will copy all those strings.
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:454
+ if (const auto *MD = dyn_cast<CXXMethodDecl>(Decl)) {
+ // Don't inherit private methods
+ if (MD->getAccessUnsafe() == AccessSpecifier::AS_private ||
----------------
s/inherit/serialize
================
Comment at: clang-tools-extra/clang-doc/Serialize.cpp:460
+ FI.IsMethod = true;
+ // The seventh arg in populateParentNamespaces is a boolean
+ // passed by reference, its value is not relevant in here so
----------------
s/populateParentNamespaces/populateFunctionInfo ?
================
Comment at: clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp:91
+ I.Bases.back().ChildFunctions.back().Name = "InheritedFunctionOne";
+ I.Bases.back().Members.emplace_back("int", "path/to/int", "X",
+ AccessSpecifier::AS_private);
----------------
For clarity, call this something else? Since it already has an `X` private member.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D66238/new/
https://reviews.llvm.org/D66238
More information about the cfe-commits
mailing list