diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h --- a/clang-tools-extra/clang-doc/Representation.h +++ b/clang-tools-extra/clang-doc/Representation.h @@ -348,10 +348,15 @@ void merge(RecordInfo &&I); - TagTypeKind TagType = TagTypeKind::TTK_Struct; // Type of this record - // (struct, class, union, - // interface). - bool IsTypeDef = false; // Indicates if record was declared using typedef + // Type of this record (struct, class, union, interface). + TagTypeKind TagType = TagTypeKind::TTK_Struct; + + // Indicates if the record was declared using a typedef. Things like anonymous + // structs in a typedef: + // typedef struct { ... } foo_t; + // are converted into records with the typedef as the Name + this flag set. + bool IsTypeDef = false; + llvm::SmallVector Members; // List of info about record members. llvm::SmallVector Parents; // List of base/parent records diff --git a/clang-tools-extra/clang-doc/Representation.cpp b/clang-tools-extra/clang-doc/Representation.cpp --- a/clang-tools-extra/clang-doc/Representation.cpp +++ b/clang-tools-extra/clang-doc/Representation.cpp @@ -222,6 +222,7 @@ assert(mergeable(Other)); if (!TagType) TagType = Other.TagType; + IsTypeDef = IsTypeDef || Other.IsTypeDef; if (Members.empty()) Members = std::move(Other.Members); if (Bases.empty()) diff --git a/clang-tools-extra/clang-doc/YAMLGenerator.cpp b/clang-tools-extra/clang-doc/YAMLGenerator.cpp --- a/clang-tools-extra/clang-doc/YAMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/YAMLGenerator.cpp @@ -127,7 +127,8 @@ static void RecordInfoMapping(IO &IO, RecordInfo &I) { SymbolInfoMapping(IO, I); - IO.mapOptional("TagType", I.TagType, clang::TagTypeKind::TTK_Struct); + IO.mapOptional("TagType", I.TagType); + IO.mapOptional("IsTypeDef", I.IsTypeDef, false); IO.mapOptional("Members", I.Members); IO.mapOptional("Bases", I.Bases); IO.mapOptional("Parents", I.Parents, llvm::SmallVector()); diff --git a/clang-tools-extra/unittests/clang-doc/MergeTest.cpp b/clang-tools-extra/unittests/clang-doc/MergeTest.cpp --- a/clang-tools-extra/unittests/clang-doc/MergeTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/MergeTest.cpp @@ -78,6 +78,7 @@ TEST(MergeTest, mergeRecordInfos) { RecordInfo One; One.Name = "r"; + One.IsTypeDef = true; One.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); One.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}); @@ -119,6 +120,7 @@ auto Expected = std::make_unique(); Expected->Name = "r"; + Expected->IsTypeDef = true; Expected->Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); Expected->DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}); diff --git a/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp --- a/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp @@ -76,6 +76,7 @@ RecordInfo I; I.Name = "r"; I.Path = "path/to/A"; + I.IsTypeDef = true; I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}); @@ -136,6 +137,7 @@ - LineNumber: 12 Filename: 'test.cpp' TagType: Class +IsTypeDef: true Members: - Type: Name: 'int' @@ -154,6 +156,7 @@ - USR: '0000000000000000000000000000000000000000' Name: 'F' Path: 'path/to/F' + TagType: Struct Members: - Type: Name: 'int'