brettw created this revision. brettw added a reviewer: paulkirth. brettw added a project: clang-tools-extra. Herald added subscribers: usaxena95, arphaman. Herald added a project: All. brettw requested review of this revision. Herald added a subscriber: cfe-commits.
Always emit the TagType for RecordInfo in YAML output. Previously this omitted the type for "struct", considering it the default. But records in C++ don't really have a default type so always emitting this is more clear. Fix crash on startup when generating HTML code. SmallString (surprisingly) can't handle self-assignment which was happening because parent_path returns a string piece into its argument. This avoids the self-assignment by using another intermediate string. Emit IsTypeDef in YAML. Previously this existed only in the Representation but was never written. Additionally, adds IsTypeDef to the record merge operation which was clearing it (all RecordInfo structures are merged with am empty RecordInfo during the reduce phase). Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D131739 Files: clang-tools-extra/clang-doc/Representation.cpp clang-tools-extra/clang-doc/Representation.h clang-tools-extra/clang-doc/YAMLGenerator.cpp clang-tools-extra/clang-doc/tool/ClangDocMain.cpp clang-tools-extra/unittests/clang-doc/MergeTest.cpp clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp
Index: clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp =================================================================== --- clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp +++ 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' Index: clang-tools-extra/unittests/clang-doc/MergeTest.cpp =================================================================== --- clang-tools-extra/unittests/clang-doc/MergeTest.cpp +++ 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<RecordInfo>(); Expected->Name = "r"; + Expected->IsTypeDef = true; Expected->Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace); Expected->DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"}); Index: clang-tools-extra/clang-doc/tool/ClangDocMain.cpp =================================================================== --- clang-tools-extra/clang-doc/tool/ClangDocMain.cpp +++ clang-tools-extra/clang-doc/tool/ClangDocMain.cpp @@ -231,9 +231,10 @@ if (Format == "html") { void *MainAddr = (void *)(intptr_t)GetExecutablePath; std::string ClangDocPath = GetExecutablePath(argv[0], MainAddr); + llvm::SmallString<128> NativeClangDocPath; + llvm::sys::path::native(ClangDocPath, NativeClangDocPath); llvm::SmallString<128> AssetsPath; - llvm::sys::path::native(ClangDocPath, AssetsPath); - AssetsPath = llvm::sys::path::parent_path(AssetsPath); + AssetsPath = llvm::sys::path::parent_path(NativeClangDocPath); llvm::sys::path::append(AssetsPath, "..", "share", "clang"); llvm::SmallString<128> DefaultStylesheet; llvm::sys::path::native(AssetsPath, DefaultStylesheet); Index: clang-tools-extra/clang-doc/YAMLGenerator.cpp =================================================================== --- clang-tools-extra/clang-doc/YAMLGenerator.cpp +++ 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<Reference, 4>()); Index: clang-tools-extra/clang-doc/Representation.h =================================================================== --- clang-tools-extra/clang-doc/Representation.h +++ 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<MemberTypeInfo, 4> Members; // List of info about record members. llvm::SmallVector<Reference, 4> Parents; // List of base/parent records Index: clang-tools-extra/clang-doc/Representation.cpp =================================================================== --- clang-tools-extra/clang-doc/Representation.cpp +++ 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())
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits