[llvm-branch-commits] [clang-tools-extra] [clang-doc] Consolidate merging logic (PR #190051)
Paul Kirth via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Apr 2 22:47:53 PDT 2026
https://github.com/ilovepi updated https://github.com/llvm/llvm-project/pull/190051
>From 401bf8cd32db2e05881d7b68261686c0d3f9b4d5 Mon Sep 17 00:00:00 2001
From: Paul Kirth <paulkirth at google.com>
Date: Tue, 24 Mar 2026 18:01:08 +0000
Subject: [PATCH] [clang-doc] Consolidate merging logic
As we migrate things in the arena, this logic may get more complex.
Factoring it out now, will give clear extension points to make this
easier to manage.
---
.../clang-doc/Representation.cpp | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/clang-tools-extra/clang-doc/Representation.cpp b/clang-tools-extra/clang-doc/Representation.cpp
index 62f1384ab10ee..2e091682d5d81 100644
--- a/clang-tools-extra/clang-doc/Representation.cpp
+++ b/clang-tools-extra/clang-doc/Representation.cpp
@@ -146,6 +146,14 @@ static void reduceChildren(OwningVec<T> &Children,
}
}
+template <typename Container>
+static void mergeUnkeyed(Container &Target, Container &&Source) {
+ for (auto &Item : Source) {
+ if (llvm::none_of(Target, [&](const auto &E) { return E == Item; }))
+ Target.push_back(std::move(Item));
+ }
+}
+
// Dispatch function.
llvm::Expected<OwnedPtr<Info>> mergeInfos(OwningPtrArray<Info> &Values) {
if (Values.empty() || !Values[0])
@@ -292,11 +300,7 @@ void Info::mergeBase(Info &&Other) {
if (Namespace.empty())
Namespace = std::move(Other.Namespace);
// Unconditionally extend the description, since each decl may have a comment.
- std::move(Other.Description.begin(), Other.Description.end(),
- std::back_inserter(Description));
- llvm::sort(Description);
- auto Last = llvm::unique(Description);
- Description.erase(Last, Description.end());
+ mergeUnkeyed(Description, std::move(Other.Description));
if (ParentUSR == EmptySID)
ParentUSR = Other.ParentUSR;
if (DocumentationFileName.empty())
@@ -312,10 +316,7 @@ void SymbolInfo::merge(SymbolInfo &&Other) {
if (!DefLoc)
DefLoc = std::move(Other.DefLoc);
// Unconditionally extend the list of locations, since we want all of them.
- std::move(Other.Loc.begin(), Other.Loc.end(), std::back_inserter(Loc));
- llvm::sort(Loc);
- auto *Last = llvm::unique(Loc);
- Loc.erase(Last, Loc.end());
+ mergeUnkeyed(Loc, std::move(Other.Loc));
mergeBase(std::move(Other));
if (MangledName.empty())
MangledName = std::move(Other.MangledName);
More information about the llvm-branch-commits
mailing list