[PATCH] D63911: [clang-doc] Serialize child namespaces and records
This revision was automatically updated to reflect the committed changes. Closed by commit rL364963: [clang-doc] Serialize child namespaces and records (authored by juliehockett, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D63911?vs=207605=207612#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 Files: clang-tools-extra/trunk/clang-doc/Mapper.cpp clang-tools-extra/trunk/clang-doc/Serialize.cpp clang-tools-extra/trunk/clang-doc/Serialize.h clang-tools-extra/trunk/unittests/clang-doc/ClangDocTest.cpp clang-tools-extra/trunk/unittests/clang-doc/SerializeTest.cpp Index: clang-tools-extra/trunk/unittests/clang-doc/ClangDocTest.cpp === --- clang-tools-extra/trunk/unittests/clang-doc/ClangDocTest.cpp +++ clang-tools-extra/trunk/unittests/clang-doc/ClangDocTest.cpp @@ -130,11 +130,12 @@ ASSERT_EQ(Expected->ChildNamespaces.size(), Actual->ChildNamespaces.size()); for (size_t Idx = 0; Idx < Actual->ChildNamespaces.size(); ++Idx) -EXPECT_EQ(Expected->ChildNamespaces[Idx], Actual->ChildNamespaces[Idx]); +CheckReference(Expected->ChildNamespaces[Idx], + Actual->ChildNamespaces[Idx]); ASSERT_EQ(Expected->ChildRecords.size(), Actual->ChildRecords.size()); for (size_t Idx = 0; Idx < Actual->ChildRecords.size(); ++Idx) -EXPECT_EQ(Expected->ChildRecords[Idx], Actual->ChildRecords[Idx]); +CheckReference(Expected->ChildRecords[Idx], Actual->ChildRecords[Idx]); ASSERT_EQ(Expected->ChildFunctions.size(), Actual->ChildFunctions.size()); for (size_t Idx = 0; Idx < Actual->ChildFunctions.size(); ++Idx) @@ -167,7 +168,7 @@ ASSERT_EQ(Expected->ChildRecords.size(), Actual->ChildRecords.size()); for (size_t Idx = 0; Idx < Actual->ChildRecords.size(); ++Idx) -EXPECT_EQ(Expected->ChildRecords[Idx], Actual->ChildRecords[Idx]); +CheckReference(Expected->ChildRecords[Idx], Actual->ChildRecords[Idx]); ASSERT_EQ(Expected->ChildFunctions.size(), Actual->ChildFunctions.size()); for (size_t Idx = 0; Idx < Actual->ChildFunctions.size(); ++Idx) Index: clang-tools-extra/trunk/unittests/clang-doc/SerializeTest.cpp === --- clang-tools-extra/trunk/unittests/clang-doc/SerializeTest.cpp +++ clang-tools-extra/trunk/unittests/clang-doc/SerializeTest.cpp @@ -35,48 +35,30 @@ ClangDocSerializeTestVisitor(EmittedInfoList , bool Public) : EmittedInfos(EmittedInfos), Public(Public) {} - bool VisitNamespaceDecl(const NamespaceDecl *D) { + template bool mapDecl(const T *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } + bool VisitNamespaceDecl(const NamespaceDecl *D) { return mapDecl(D); } + bool VisitFunctionDecl(const FunctionDecl *D) { // Don't visit CXXMethodDecls twice if (dyn_cast(D)) return true; -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; +return mapDecl(D); } - bool VisitCXXMethodDecl(const CXXMethodDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitCXXMethodDecl(const CXXMethodDecl *D) { return mapDecl(D); } - bool VisitRecordDecl(const RecordDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitRecordDecl(const RecordDecl *D) { return mapDecl(D); } - bool VisitEnumDecl(const EnumDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitEnumDecl(const EnumDecl *D) { return mapDecl(D); } }; void ExtractInfosFromCode(StringRef Code, size_t NumExpectedInfos, bool Public, @@ -101,19 +83,19 @@ // Test serialization of namespace declarations. TEST(SerializeTest, emitNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 3, + ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 5, /*Public=*/false, Infos);
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
DiegoAstiazaran updated this revision to Diff 207605. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 Files: clang-tools-extra/clang-doc/Mapper.cpp clang-tools-extra/clang-doc/Serialize.cpp clang-tools-extra/clang-doc/Serialize.h clang-tools-extra/unittests/clang-doc/ClangDocTest.cpp clang-tools-extra/unittests/clang-doc/SerializeTest.cpp Index: clang-tools-extra/unittests/clang-doc/SerializeTest.cpp === --- clang-tools-extra/unittests/clang-doc/SerializeTest.cpp +++ clang-tools-extra/unittests/clang-doc/SerializeTest.cpp @@ -35,48 +35,30 @@ ClangDocSerializeTestVisitor(EmittedInfoList , bool Public) : EmittedInfos(EmittedInfos), Public(Public) {} - bool VisitNamespaceDecl(const NamespaceDecl *D) { + template bool mapDecl(const T *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } + bool VisitNamespaceDecl(const NamespaceDecl *D) { return mapDecl(D); } + bool VisitFunctionDecl(const FunctionDecl *D) { // Don't visit CXXMethodDecls twice if (dyn_cast(D)) return true; -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; +return mapDecl(D); } - bool VisitCXXMethodDecl(const CXXMethodDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitCXXMethodDecl(const CXXMethodDecl *D) { return mapDecl(D); } - bool VisitRecordDecl(const RecordDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitRecordDecl(const RecordDecl *D) { return mapDecl(D); } - bool VisitEnumDecl(const EnumDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitEnumDecl(const EnumDecl *D) { return mapDecl(D); } }; void ExtractInfosFromCode(StringRef Code, size_t NumExpectedInfos, bool Public, @@ -101,19 +83,19 @@ // Test serialization of namespace declarations. TEST(SerializeTest, emitNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 3, + ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 5, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID, "A"); CheckNamespaceInfo(, A); - NamespaceInfo *B = InfoAsNamespace(Infos[1].get()); + NamespaceInfo *B = InfoAsNamespace(Infos[2].get()); NamespaceInfo ExpectedB(EmptySID, "B"); ExpectedB.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); CheckNamespaceInfo(, B); - NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[2].get()); + NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[4].get()); NamespaceInfo ExpectedBWithFunction(EmptySID); FunctionInfo F; F.Name = "f"; @@ -127,7 +109,7 @@ TEST(SerializeTest, emitAnonymousNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace { }", 1, /*Public=*/false, Infos); + ExtractInfosFromCode("namespace { }", 2, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID); @@ -151,7 +133,7 @@ template <> void F::TemplateMethod(); typedef struct {} G;)raw", - 7, /*Public=*/false, Infos); + 10, /*Public=*/false, Infos); RecordInfo *E = InfoAsRecord(Infos[0].get()); RecordInfo ExpectedE(EmptySID, "E"); @@ -159,7 +141,7 @@ ExpectedE.DefLoc = Location(0, llvm::SmallString<16>{"test.cpp"}); CheckRecordInfo(, E); - RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[1].get()); + RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[2].get()); RecordInfo ExpectedRecordWithEConstructor(EmptySID); FunctionInfo EConstructor; EConstructor.Name = "E"; @@ -173,7 +155,7 @@ std::move(EConstructor)); CheckRecordInfo(, RecordWithEConstructor); - RecordInfo *RecordWithMethod = InfoAsRecord(Infos[2].get()); + RecordInfo *RecordWithMethod = InfoAsRecord(Infos[3].get()); RecordInfo ExpectedRecordWithMethod(EmptySID); FunctionInfo
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
DiegoAstiazaran updated this revision to Diff 207153. DiegoAstiazaran marked 3 inline comments as done. DiegoAstiazaran added a comment. Change an if statement for a switch statement in `emitInfo(const RecordDecl *D, ...)`, it now handles correctly unexpected info types. Fix spelling in comments. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 Files: clang-tools-extra/clang-doc/Mapper.cpp clang-tools-extra/clang-doc/Serialize.cpp clang-tools-extra/clang-doc/Serialize.h clang-tools-extra/unittests/clang-doc/ClangDocTest.cpp clang-tools-extra/unittests/clang-doc/SerializeTest.cpp Index: clang-tools-extra/unittests/clang-doc/SerializeTest.cpp === --- clang-tools-extra/unittests/clang-doc/SerializeTest.cpp +++ clang-tools-extra/unittests/clang-doc/SerializeTest.cpp @@ -35,48 +35,30 @@ ClangDocSerializeTestVisitor(EmittedInfoList , bool Public) : EmittedInfos(EmittedInfos), Public(Public) {} - bool VisitNamespaceDecl(const NamespaceDecl *D) { + template bool mapDecl(const T *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } + bool VisitNamespaceDecl(const NamespaceDecl *D) { return mapDecl(D); } + bool VisitFunctionDecl(const FunctionDecl *D) { // Don't visit CXXMethodDecls twice if (dyn_cast(D)) return true; -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; +return mapDecl(D); } - bool VisitCXXMethodDecl(const CXXMethodDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitCXXMethodDecl(const CXXMethodDecl *D) { return mapDecl(D); } - bool VisitRecordDecl(const RecordDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitRecordDecl(const RecordDecl *D) { return mapDecl(D); } - bool VisitEnumDecl(const EnumDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitEnumDecl(const EnumDecl *D) { return mapDecl(D); } }; void ExtractInfosFromCode(StringRef Code, size_t NumExpectedInfos, bool Public, @@ -101,19 +83,19 @@ // Test serialization of namespace declarations. TEST(SerializeTest, emitNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 3, + ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 5, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID, "A"); CheckNamespaceInfo(, A); - NamespaceInfo *B = InfoAsNamespace(Infos[1].get()); + NamespaceInfo *B = InfoAsNamespace(Infos[2].get()); NamespaceInfo ExpectedB(EmptySID, "B"); ExpectedB.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); CheckNamespaceInfo(, B); - NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[2].get()); + NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[4].get()); NamespaceInfo ExpectedBWithFunction(EmptySID); FunctionInfo F; F.Name = "f"; @@ -127,7 +109,7 @@ TEST(SerializeTest, emitAnonymousNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace { }", 1, /*Public=*/false, Infos); + ExtractInfosFromCode("namespace { }", 2, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID); @@ -142,7 +124,8 @@ E() {} protected: void ProtectedMethod(); -};)raw", 3, /*Public=*/false, Infos); +};)raw", + 4, /*Public=*/false, Infos); RecordInfo *E = InfoAsRecord(Infos[0].get()); RecordInfo ExpectedE(EmptySID, "E"); @@ -150,7 +133,7 @@ ExpectedE.DefLoc = Location(0, llvm::SmallString<16>{"test.cpp"}); CheckRecordInfo(, E); - RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[1].get()); + RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[2].get()); RecordInfo ExpectedRecordWithEConstructor(EmptySID); FunctionInfo EConstructor; EConstructor.Name = "E"; @@ -164,7 +147,7 @@ std::move(EConstructor));
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
juliehockett added inline comments. Comment at: clang-tools-extra/clang-doc/Serialize.cpp:366 + + if (I->Namespace[0].RefType == InfoType::IT_namespace) { +auto Parent = llvm::make_unique(); Can you make this a switch statement, doing the appropriate things for `IT_record` and `IT_namespace` and using `llvm_unreachable("Invalid reference type")` for all other possible values? This will help prevent silent regressions down the line. Comment at: clang-tools-extra/clang-doc/Serialize.cpp:374 + + // At this point any parent will be a RecordInfo + auto Parent = llvm::make_unique(); nit: generally try to make comments full sentences Comment at: clang-tools-extra/clang-doc/Serialize.cpp:398 I->ChildFunctions.emplace_back(std::move(Func)); - return std::unique_ptr{std::move(I)}; + // Info es wrapped in its parent scope so it's returned in the second position + return {nullptr, std::unique_ptr{std::move(I)}}; nit: spelling, here and below CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
DiegoAstiazaran updated this revision to Diff 207126. DiegoAstiazaran marked 6 inline comments as done. DiegoAstiazaran added a comment. Herald added subscribers: kadircet, arphaman. Add comments. Extract repeated logic into mapDecl function in SerializeTest.cpp Use EmptySID instead of specific USR in tests. Use {} instead of {nullptr, nullptr}. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 Files: clang-tools-extra/clang-doc/Mapper.cpp clang-tools-extra/clang-doc/Serialize.cpp clang-tools-extra/clang-doc/Serialize.h clang-tools-extra/unittests/clang-doc/ClangDocTest.cpp clang-tools-extra/unittests/clang-doc/SerializeTest.cpp Index: clang-tools-extra/unittests/clang-doc/SerializeTest.cpp === --- clang-tools-extra/unittests/clang-doc/SerializeTest.cpp +++ clang-tools-extra/unittests/clang-doc/SerializeTest.cpp @@ -35,48 +35,30 @@ ClangDocSerializeTestVisitor(EmittedInfoList , bool Public) : EmittedInfos(EmittedInfos), Public(Public) {} - bool VisitNamespaceDecl(const NamespaceDecl *D) { + template bool mapDecl(const T *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } + bool VisitNamespaceDecl(const NamespaceDecl *D) { return mapDecl(D); } + bool VisitFunctionDecl(const FunctionDecl *D) { // Don't visit CXXMethodDecls twice if (dyn_cast(D)) return true; -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; +return mapDecl(D); } - bool VisitCXXMethodDecl(const CXXMethodDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitCXXMethodDecl(const CXXMethodDecl *D) { return mapDecl(D); } - bool VisitRecordDecl(const RecordDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitRecordDecl(const RecordDecl *D) { return mapDecl(D); } - bool VisitEnumDecl(const EnumDecl *D) { -auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, - /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); -return true; - } + bool VisitEnumDecl(const EnumDecl *D) { return mapDecl(D); } }; void ExtractInfosFromCode(StringRef Code, size_t NumExpectedInfos, bool Public, @@ -101,19 +83,19 @@ // Test serialization of namespace declarations. TEST(SerializeTest, emitNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 3, + ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 5, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID, "A"); CheckNamespaceInfo(, A); - NamespaceInfo *B = InfoAsNamespace(Infos[1].get()); + NamespaceInfo *B = InfoAsNamespace(Infos[2].get()); NamespaceInfo ExpectedB(EmptySID, "B"); ExpectedB.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); CheckNamespaceInfo(, B); - NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[2].get()); + NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[4].get()); NamespaceInfo ExpectedBWithFunction(EmptySID); FunctionInfo F; F.Name = "f"; @@ -127,7 +109,7 @@ TEST(SerializeTest, emitAnonymousNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace { }", 1, /*Public=*/false, Infos); + ExtractInfosFromCode("namespace { }", 2, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID); @@ -142,7 +124,8 @@ E() {} protected: void ProtectedMethod(); -};)raw", 3, /*Public=*/false, Infos); +};)raw", + 4, /*Public=*/false, Infos); RecordInfo *E = InfoAsRecord(Infos[0].get()); RecordInfo ExpectedE(EmptySID, "E"); @@ -150,7 +133,7 @@ ExpectedE.DefLoc = Location(0, llvm::SmallString<16>{"test.cpp"}); CheckRecordInfo(, E); - RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[1].get()); + RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[2].get()); RecordInfo ExpectedRecordWithEConstructor(EmptySID); FunctionInfo EConstructor; EConstructor.Name = "E"; @@ -164,7 +147,7 @@
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
DiegoAstiazaran added inline comments. Comment at: clang-tools-extra/clang-doc/Serialize.cpp:341 + Parent->USR = ParentUSR; + Parent->ChildNamespaces.emplace_back(I->USR, I->Name, InfoType::IT_namespace); + return {std::unique_ptr{std::move(I)}, juliehockett wrote: > You're probably going to want the path in this too, here and below This will be added when D63663 is pushed. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
juliehockett added inline comments. Comment at: clang-tools-extra/clang-doc/Serialize.cpp:341 + Parent->USR = ParentUSR; + Parent->ChildNamespaces.emplace_back(I->USR, I->Name, InfoType::IT_namespace); + return {std::unique_ptr{std::move(I)}, You're probably going to want the path in this too, here and below Comment at: clang-tools-extra/clang-doc/Serialize.cpp:398 I->ChildFunctions.emplace_back(std::move(Func)); - return std::unique_ptr{std::move(I)}; + return {std::unique_ptr{std::move(I)}, nullptr}; } Maybe return the parent in the second position, and then comment about how the info itself is wrapped in its parent scope? That would make more sense logically, and they all end up in the same place. Same for methods/enums. Comment at: clang-tools-extra/clang-doc/Serialize.h:30 -std::unique_ptr emitInfo(const NamespaceDecl *D, const FullComment *FC, - int LineNumber, StringRef File, bool PublicOnly); -std::unique_ptr emitInfo(const RecordDecl *D, const FullComment *FC, - int LineNumber, StringRef File, bool PublicOnly); -std::unique_ptr emitInfo(const EnumDecl *D, const FullComment *FC, - int LineNumber, StringRef File, bool PublicOnly); -std::unique_ptr emitInfo(const FunctionDecl *D, const FullComment *FC, - int LineNumber, StringRef File, bool PublicOnly); -std::unique_ptr emitInfo(const CXXMethodDecl *D, const FullComment *FC, - int LineNumber, StringRef File, bool PublicOnly); +std::pair, std::unique_ptr> +emitInfo(const NamespaceDecl *D, const FullComment *FC, int LineNumber, Comment here what each of these represents, e.g. the first info contains the relevant information about the declaration, the second records the parent. Comment at: clang-tools-extra/unittests/clang-doc/SerializeTest.cpp:41-44 +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); Extract this logic into a mapDecl function, since it's repeated so much Comment at: clang-tools-extra/unittests/clang-doc/SerializeTest.cpp:362 + NamespaceInfo *ParentA = InfoAsNamespace(Infos[1].get()); + NamespaceInfo ExpectedParentA(EmptySID); + ExpectedParentA.ChildRecords.emplace_back(Infos[0]->USR, "A", Just use the EmptySID -- the checking function ignores the USRs since they can be system-dependent. Here and below. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63911/new/ https://reviews.llvm.org/D63911 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D63911: [clang-doc] Serialize child namespaces and records
DiegoAstiazaran created this revision. DiegoAstiazaran added reviewers: juliehockett, jakehehrlich, lebedev.ri. DiegoAstiazaran added a project: clang-tools-extra. Serialization of child namespaces and records is now handled. Namespaces can have child records and child namespaces. Records can only have child records. https://reviews.llvm.org/D63911 Files: clang-tools-extra/clang-doc/Mapper.cpp clang-tools-extra/clang-doc/Serialize.cpp clang-tools-extra/clang-doc/Serialize.h clang-tools-extra/unittests/clang-doc/SerializeTest.cpp Index: clang-tools-extra/unittests/clang-doc/SerializeTest.cpp === --- clang-tools-extra/unittests/clang-doc/SerializeTest.cpp +++ clang-tools-extra/unittests/clang-doc/SerializeTest.cpp @@ -38,8 +38,10 @@ bool VisitNamespaceDecl(const NamespaceDecl *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } @@ -49,32 +51,40 @@ return true; auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } bool VisitCXXMethodDecl(const CXXMethodDecl *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } bool VisitRecordDecl(const RecordDecl *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } bool VisitEnumDecl(const EnumDecl *D) { auto I = serialize::emitInfo(D, getComment(D), /*Line=*/0, /*File=*/"test.cpp", Public); -if (I) - EmittedInfos.emplace_back(std::move(I)); +if (I.first) + EmittedInfos.emplace_back(std::move(I.first)); +if (I.second) + EmittedInfos.emplace_back(std::move(I.second)); return true; } }; @@ -101,19 +111,19 @@ // Test serialization of namespace declarations. TEST(SerializeTest, emitNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 3, + ExtractInfosFromCode("namespace A { namespace B { void f() {} } }", 5, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID, "A"); CheckNamespaceInfo(, A); - NamespaceInfo *B = InfoAsNamespace(Infos[1].get()); + NamespaceInfo *B = InfoAsNamespace(Infos[2].get()); NamespaceInfo ExpectedB(EmptySID, "B"); ExpectedB.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); CheckNamespaceInfo(, B); - NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[2].get()); + NamespaceInfo *BWithFunction = InfoAsNamespace(Infos[4].get()); NamespaceInfo ExpectedBWithFunction(EmptySID); FunctionInfo F; F.Name = "f"; @@ -127,7 +137,7 @@ TEST(SerializeTest, emitAnonymousNamespaceInfo) { EmittedInfoList Infos; - ExtractInfosFromCode("namespace { }", 1, /*Public=*/false, Infos); + ExtractInfosFromCode("namespace { }", 2, /*Public=*/false, Infos); NamespaceInfo *A = InfoAsNamespace(Infos[0].get()); NamespaceInfo ExpectedA(EmptySID); @@ -142,7 +152,8 @@ E() {} protected: void ProtectedMethod(); -};)raw", 3, /*Public=*/false, Infos); +};)raw", + 4, /*Public=*/false, Infos); RecordInfo *E = InfoAsRecord(Infos[0].get()); RecordInfo ExpectedE(EmptySID, "E"); @@ -150,7 +161,7 @@ ExpectedE.DefLoc = Location(0, llvm::SmallString<16>{"test.cpp"}); CheckRecordInfo(, E); - RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[1].get()); + RecordInfo *RecordWithEConstructor = InfoAsRecord(Infos[2].get()); RecordInfo ExpectedRecordWithEConstructor(EmptySID); FunctionInfo EConstructor; EConstructor.Name = "E"; @@ -164,7 +175,7 @@ std::move(EConstructor)); CheckRecordInfo(, RecordWithEConstructor); - RecordInfo *RecordWithMethod = InfoAsRecord(Infos[2].get()); + RecordInfo *RecordWithMethod = InfoAsRecord(Infos[3].get());