forked from OSchip/llvm-project
[clang-doc] Fix typedef/using output.
Provides an initializer for the TypedefInfo.IsUsing member. Previously this member was uninitialized and would produce random output. Adds the Description (code comments) to the bitcode reader/writer. Previously the typedef/using descriptions were lost during the bitcode round-trip. Adds a test for this. Differential Revision: https://reviews.llvm.org/D136638
This commit is contained in:
parent
39917b5e01
commit
7231c9966e
|
@ -368,28 +368,27 @@ template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) {
|
|||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) {
|
||||
I->Description.emplace_back();
|
||||
return &I->Description.back();
|
||||
return &I->Description.emplace_back();
|
||||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) {
|
||||
I->Description.emplace_back();
|
||||
return &I->Description.back();
|
||||
return &I->Description.emplace_back();
|
||||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) {
|
||||
I->Description.emplace_back();
|
||||
return &I->Description.back();
|
||||
return &I->Description.emplace_back();
|
||||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) {
|
||||
I->Description.emplace_back();
|
||||
return &I->Description.back();
|
||||
return &I->Description.emplace_back();
|
||||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) {
|
||||
I->Description.emplace_back();
|
||||
return &I->Description.back();
|
||||
return &I->Description.emplace_back();
|
||||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(TypedefInfo *I) {
|
||||
return &I->Description.emplace_back();
|
||||
}
|
||||
|
||||
template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
|
||||
|
|
|
@ -432,6 +432,8 @@ void ClangDocBitcodeWriter::emitBlock(const TypedefInfo &T) {
|
|||
emitRecord(T.Name, TYPEDEF_NAME);
|
||||
for (const auto &N : T.Namespace)
|
||||
emitBlock(N, FieldId::F_namespace);
|
||||
for (const auto &CI : T.Description)
|
||||
emitBlock(CI);
|
||||
if (T.DefLoc)
|
||||
emitRecord(*T.DefLoc, TYPEDEF_DEFLOCATION);
|
||||
emitRecord(T.IsUsing, TYPEDEF_IS_USING);
|
||||
|
|
|
@ -365,7 +365,7 @@ struct TypedefInfo : public SymbolInfo {
|
|||
// using MyVector = std::vector<int>
|
||||
// False means it's a C-style typedef:
|
||||
// typedef std::vector<int> MyVector;
|
||||
bool IsUsing;
|
||||
bool IsUsing = false;
|
||||
};
|
||||
|
||||
struct BaseRecordInfo : public RecordInfo {
|
||||
|
|
|
@ -183,11 +183,33 @@ TEST(BitcodeTest, emitTypedefInfoBitcode) {
|
|||
I.Underlying = TypeInfo("unsigned");
|
||||
I.IsUsing = true;
|
||||
|
||||
CommentInfo Top;
|
||||
Top.Kind = "FullComment";
|
||||
|
||||
Top.Children.emplace_back(std::make_unique<CommentInfo>());
|
||||
CommentInfo *BlankLine = Top.Children.back().get();
|
||||
BlankLine->Kind = "ParagraphComment";
|
||||
BlankLine->Children.emplace_back(std::make_unique<CommentInfo>());
|
||||
BlankLine->Children.back()->Kind = "TextComment";
|
||||
|
||||
I.Description.emplace_back(std::move(Top));
|
||||
|
||||
std::string WriteResult = writeInfo(&I);
|
||||
EXPECT_TRUE(WriteResult.size() > 0);
|
||||
std::vector<std::unique_ptr<Info>> ReadResults = readInfo(WriteResult, 1);
|
||||
|
||||
CheckTypedefInfo(&I, InfoAsTypedef(ReadResults[0].get()));
|
||||
|
||||
// Check one with no IsUsing set, no description, and no definition location.
|
||||
TypedefInfo I2;
|
||||
I2.Name = "SomethingElse";
|
||||
I2.IsUsing = false;
|
||||
I2.Underlying = TypeInfo("int");
|
||||
|
||||
WriteResult = writeInfo(&I2);
|
||||
EXPECT_TRUE(WriteResult.size() > 0);
|
||||
ReadResults = readInfo(WriteResult, 1);
|
||||
CheckTypedefInfo(&I2, InfoAsTypedef(ReadResults[0].get()));
|
||||
}
|
||||
|
||||
TEST(SerializeTest, emitInfoWithCommentBitcode) {
|
||||
|
|
Loading…
Reference in New Issue