[PATCH] D41102: Setup clang-doc frontend framework
Roman Lebedev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 24 05:55:19 PST 2018
lebedev.ri added a comment.
Thank you for working on this!
Some more thoughts.
================
Comment at: clang-doc/BitcodeWriter.cpp:191
+ Record.clear();
+ for (const char C : BlockIdNameMap[ID]) Record.push_back(C);
+ Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, Record);
----------------
Why do we have this indirection?
Is there a need to first to (unefficiently?) copy to `Record`, and then emit from there?
Wouldn't this work just as well?
```
Record.clear();
Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME, BlockIdNameMap[ID]);
```
================
Comment at: clang-doc/BitcodeWriter.cpp:196
+/// \brief Emits a record name to the BLOCKINFO block.
+void ClangDocBitcodeWriter::emitRecordID(RecordId ID) {
+ assert(RecordIdNameMap[ID] && "Unknown Abbreviation");
----------------
Hmm, so i've been staring at this and http://llvm.org/doxygen/classllvm_1_1BitstreamWriter.html and i must say i'm not fond of this indirection.
What i don't understand is, in previous function, we don't store `BlockId`, why do we want to store `RecordId`?
Aren't they both unstable, and are implementation detail?
Do we want to store it (`RecordId`)? If yes, please explain it as a new comment in code.
If no, i guess this would work too?
```
assert(RecordIdNameMap[ID] && "Unknown Abbreviation");
Record.clear();
Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME, RecordIdNameMap[ID].Name);
```
And after that you can lower the default size of `SmallVector<> Record` down to, hm, `4`?
================
Comment at: clang-doc/BitcodeWriter.h:161
+
+ using RecordData = SmallVector<uint64_t, 128>;
+
----------------
This alias is used exactly once, for `Record` member variable in this class.
Is there any point in having this alias?
================
Comment at: clang-doc/BitcodeWriter.h:161
+
+ using RecordData = SmallVector<uint64_t, 128>;
+
----------------
lebedev.ri wrote:
> This alias is used exactly once, for `Record` member variable in this class.
> Is there any point in having this alias?
Also, why is `uint64_t` used?
We either push `char`, or `enum`, or `int`. Do we ever need 64-bit?
================
Comment at: clang-doc/ClangDoc.h:47
+ bool OmitFilenames)
+ : Mapper(Ctx, ECtx, OmitFilenames){};
+ void HandleTranslationUnit(clang::ASTContext &Context) override {
----------------
Please add space before `{}`, and drop unneeded `;`
================
Comment at: clang-doc/Mapper.h:56
+ private:
+ class ClangDocCommentVisitor
+ : public ConstCommentVisitor<ClangDocCommentVisitor> {
----------------
`ClangDocMapper` class is staring to look like a god-class.
I would recommend:
1. Rename `ClangDocMapper` to `ClangDocASTVisitor`.
It's kind-of conventional to name `RecursiveASTVisitor`-based classes like that.
2. Move `ClangDocCommentVisitor` out of the `ClangDocMapper`, into `namespace {}` in `clang-doc/Mapper.cpp`
3.
* Split `ClangDocSerializer` into new .h/.cpp
* Replace `ClangDocSerializer Serializer;` with `ClangDocSerializer& Serializer;`
* Instantiate `ClangDocSerializer` (in `MapperActionFactory`, i think?) before `ClangDocMapper`
* Pass `ClangDocSerializer&` into `ClangDocMapper` ctor.
https://reviews.llvm.org/D41102
More information about the cfe-commits
mailing list