Author: Paul Kirth
Date: 2026-04-03T11:26:12-07:00
New Revision: 4ad1844304d94bc5d695975214741662fe84d605

URL: 
https://github.com/llvm/llvm-project/commit/4ad1844304d94bc5d695975214741662fe84d605
DIFF: 
https://github.com/llvm/llvm-project/commit/4ad1844304d94bc5d695975214741662fe84d605.diff

LOG: [clang-doc] Refactor FriendInfo parameters to use ArrayRef (#190047)

This also adapts readBlock for the new layouts.

Added: 
    

Modified: 
    clang-tools-extra/clang-doc/BitcodeReader.cpp
    clang-tools-extra/clang-doc/BitcodeWriter.cpp
    clang-tools-extra/clang-doc/JSONGenerator.cpp
    clang-tools-extra/clang-doc/Representation.h
    clang-tools-extra/clang-doc/Serialize.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp 
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 27984cf321b46..74f67032e068f 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -620,13 +620,6 @@ template <> llvm::Error addTypeInfo(FunctionInfo *I, 
FieldTypeInfo &&T) {
   return llvm::Error::success();
 }
 
-template <> llvm::Error addTypeInfo(FriendInfo *I, FieldTypeInfo &&T) {
-  if (!I->Params)
-    I->Params.emplace();
-  I->Params->emplace_back(std::move(T));
-  return llvm::Error::success();
-}
-
 template <> llvm::Error addTypeInfo(FriendInfo *I, TypeInfo &&T) {
   I->ReturnType.emplace(std::move(T));
   return llvm::Error::success();
@@ -957,6 +950,51 @@ llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, 
T I) {
   }
 }
 
+template <>
+llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, FriendInfo *I) {
+  llvm::TimeTraceScope("Reducing infos", "readBlock");
+  if (llvm::Error Err = Stream.EnterSubBlock(ID))
+    return Err;
+
+  llvm::SmallVector<FieldTypeInfo, 4> LocalParams;
+
+  while (true) {
+    unsigned BlockOrCode = 0;
+    llvm::Expected<Cursor> C = skipUntilRecordOrBlock(BlockOrCode);
+    if (!C)
+      return C.takeError();
+
+    switch (*C) {
+    case Cursor::BadBlock:
+      return llvm::createStringError(llvm::inconvertibleErrorCode(),
+                                     "bad block found");
+    case Cursor::BlockEnd: {
+      if (!LocalParams.empty())
+        I->Params = allocateArray<FieldTypeInfo>(LocalParams, TransientArena);
+      return llvm::Error::success();
+    }
+    case Cursor::BlockBegin:
+      if (BlockOrCode == BI_FIELD_TYPE_BLOCK_ID) {
+        FieldTypeInfo FI;
+        if (auto Err = readBlock(BlockOrCode, &FI))
+          return Err;
+        LocalParams.push_back(std::move(FI));
+        continue;
+      }
+      if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
+        if (llvm::Error Skipped = Stream.SkipBlock())
+          return joinErrors(std::move(Err), std::move(Skipped));
+        return Err;
+      }
+      continue;
+    case Cursor::Record:
+      break;
+    }
+    if (auto Err = readRecord(BlockOrCode, I))
+      return Err;
+  }
+}
+
 // TODO: fix inconsistentent returning of errors in add callbacks.
 // Once that's fixed, we only need one handleSubBlock.
 template <typename InfoType, typename T, typename Callback>

diff  --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp 
b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
index 710ae5760162b..655a7f6336c1c 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
@@ -490,9 +490,8 @@ void ClangDocBitcodeWriter::emitBlock(const FriendInfo &R) {
   emitRecord(R.IsClass, FRIEND_IS_CLASS);
   if (R.Template)
     emitBlock(*R.Template);
-  if (R.Params)
-    for (const auto &P : *R.Params)
-      emitBlock(P);
+  for (const auto &P : R.Params)
+    emitBlock(P);
   if (R.ReturnType)
     emitBlock(*R.ReturnType);
   for (const auto &CI : R.Description)

diff  --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp 
b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 980dafc2a4ed1..c753da33299af 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -655,8 +655,8 @@ void JSONGenerator::serializeInfo(const FriendInfo &I, 
Object &Obj) {
   Obj["IsClass"] = I.IsClass;
   if (I.Template)
     serializeInfo(I.Template.value(), Obj);
-  if (I.Params)
-    serializeArray(I.Params.value(), Obj, "Params", serializeInfoLambda());
+  if (!I.Params.empty())
+    serializeArray(I.Params, Obj, "Params", serializeInfoLambda());
   if (I.ReturnType) {
     auto ReturnTypeObj = Object();
     serializeInfo(I.ReturnType.value(), ReturnTypeObj);

diff  --git a/clang-tools-extra/clang-doc/Representation.h 
b/clang-tools-extra/clang-doc/Representation.h
index ada4da64a61fb..c8f3fc946f064 100644
--- a/clang-tools-extra/clang-doc/Representation.h
+++ b/clang-tools-extra/clang-doc/Representation.h
@@ -522,7 +522,7 @@ struct FriendInfo : public SymbolInfo, public 
llvm::ilist_node<FriendInfo> {
   Reference Ref;
   std::optional<TemplateInfo> Template;
   std::optional<TypeInfo> ReturnType;
-  std::optional<SmallVector<FieldTypeInfo, 4>> Params;
+  llvm::ArrayRef<FieldTypeInfo> Params;
   bool IsClass = false;
 };
 

diff  --git a/clang-tools-extra/clang-doc/Serialize.cpp 
b/clang-tools-extra/clang-doc/Serialize.cpp
index 023e21dc763b1..cb5c5ef03e197 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -1013,8 +1013,7 @@ void Serializer::parseFriends(RecordInfo &RI, const 
CXXRecordDecl *D) {
     if (auto *FuncDecl = dyn_cast_or_null<FunctionDecl>(ActualDecl)) {
       FunctionInfo TempInfo;
       parseParameters(TempInfo, FuncDecl);
-      F.Params.emplace();
-      F.Params = std::move(TempInfo.Params);
+      F.Params = allocateArray<FieldTypeInfo>(TempInfo.Params, TransientArena);
       F.ReturnType = getTypeInfoForType(FuncDecl->getReturnType(),
                                         FuncDecl->getLangOpts());
     }


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to