https://github.com/evelez7 created 
https://github.com/llvm/llvm-project/pull/171699

Parents and virtual parents didn't have "Has" bools in JSON output. That
made it difficult to only create output conditionally.

Also add an explicit test for inheritance and parents, vparents, and
bases which actually weren't tested in JSON

>From 40a76890f36b0fa77c9a5adea0ec1f82f30f063b Mon Sep 17 00:00:00 2001
From: Erick Velez <[email protected]>
Date: Sun, 16 Nov 2025 12:43:44 -0800
Subject: [PATCH] [clang-doc] Add JSON bools for parents, vparents and test

Parents and virtual parents didn't have "Has" bools in JSON output. That
made it difficult to only create output conditionally.

Also add an explicit test for inheritance and parents, vparents, and
bases which actually weren't tested in JSON
---
 clang-tools-extra/clang-doc/JSONGenerator.cpp |   8 +-
 .../test/clang-doc/json/inheritance.cpp       | 111 ++++++++++++++++++
 2 files changed, 117 insertions(+), 2 deletions(-)
 create mode 100644 clang-tools-extra/test/clang-doc/json/inheritance.cpp

diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp 
b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 0253ebf5335da..c65c3dc759c3e 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -572,12 +572,16 @@ static void serializeInfo(const RecordInfo &I, 
json::Object &Obj,
           serializeInfo(Base, BaseObj, RepositoryUrl);
         });
 
-  if (!I.Parents.empty())
+  if (!I.Parents.empty()) {
     serializeArray(I.Parents, Obj, "Parents", SerializeReferenceLambda);
+    Obj["HasParents"] = true;
+  }
 
-  if (!I.VirtualParents.empty())
+  if (!I.VirtualParents.empty()) {
     serializeArray(I.VirtualParents, Obj, "VirtualParents",
                    SerializeReferenceLambda);
+    Obj["HasVirtualParents"] = true;
+  }
 
   if (I.Template)
     serializeInfo(I.Template.value(), Obj);
diff --git a/clang-tools-extra/test/clang-doc/json/inheritance.cpp 
b/clang-tools-extra/test/clang-doc/json/inheritance.cpp
new file mode 100644
index 0000000000000..53476da870c61
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/json/inheritance.cpp
@@ -0,0 +1,111 @@
+// RUN: rm -rf %t && mkdir -p %t
+// RUN: clang-doc --output=%t --format=json --executor=standalone %s
+// RUN: FileCheck %s < %t/json/GlobalNamespace/_ZTV7MyClass.json
+
+class Virtual {};
+class Foo : virtual Virtual {};
+class Bar : Foo {};
+class Fizz : virtual Virtual {};
+class Buzz : Fizz {};
+
+class MyClass : Bar, Buzz {};
+
+// CHECK:       "Bases": [
+// CHECK-NEXT:    {
+// CHECK-NEXT:     "Access": "private",
+// CHECK-NEXT:      "InfoType": "record",
+// CHECK-NEXT:      "IsParent": true,
+// CHECK-NEXT:      "IsTypedef": false,
+// CHECK-NEXT:      "IsVirtual": false,
+// CHECK-NEXT:      "MangledName": "",
+// CHECK-NEXT:      "Name": "Bar",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "TagType": "struct",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "Access": "private",
+// CHECK-NEXT:      "InfoType": "record",
+// CHECK-NEXT:      "IsParent": false,
+// CHECK-NEXT:      "IsTypedef": false,
+// CHECK-NEXT:      "IsVirtual": false,
+// CHECK-NEXT:      "MangledName": "",
+// CHECK-NEXT:      "Name": "Foo",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "TagType": "struct",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "Access": "private",
+// CHECK-NEXT:      "InfoType": "record",
+// CHECK-NEXT:      "IsParent": false,
+// CHECK-NEXT:      "IsTypedef": false,
+// CHECK-NEXT:      "IsVirtual": true,
+// CHECK-NEXT:      "MangledName": "",
+// CHECK-NEXT:      "Name": "Virtual",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "TagType": "struct",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "Access": "private",
+// CHECK-NEXT:      "InfoType": "record",
+// CHECK-NEXT:      "IsParent": true,
+// CHECK-NEXT:      "IsTypedef": false,
+// CHECK-NEXT:      "IsVirtual": false,
+// CHECK-NEXT:      "MangledName": "",
+// CHECK-NEXT:      "Name": "Buzz",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "TagType": "struct",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "Access": "private",
+// CHECK-NEXT:      "InfoType": "record",
+// CHECK-NEXT:      "IsParent": false,
+// CHECK-NEXT:      "IsTypedef": false,
+// CHECK-NEXT:      "IsVirtual": false,
+// CHECK-NEXT:      "MangledName": "",
+// CHECK-NEXT:      "Name": "Fizz",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "TagType": "struct",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "Access": "private",
+// CHECK-NEXT:      "End": true,
+// CHECK-NEXT:      "InfoType": "record",
+// CHECK-NEXT:      "IsParent": false,
+// CHECK-NEXT:      "IsTypedef": false,
+// CHECK-NEXT:      "IsVirtual": true,
+// CHECK-NEXT:      "MangledName": "",
+// CHECK-NEXT:      "Name": "Virtual",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "TagType": "struct",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    }
+// CHECK-NEXT:  ],
+// CHECK:       "Parents": [
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "Name": "Bar",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "QualName": "Bar",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    },
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "End": true,
+// CHECK-NEXT:      "Name": "Buzz",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "QualName": "Buzz",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    }
+// CHECK-NEXT:  ],
+// CHECK:       "VirtualParents": [
+// CHECK-NEXT:    {
+// CHECK-NEXT:      "End": true,
+// CHECK-NEXT:      "Name": "Virtual",
+// CHECK-NEXT:      "Path": "GlobalNamespace",
+// CHECK-NEXT:      "QualName": "Virtual",
+// CHECK-NEXT:      "USR": "{{[0-9A-F]*}}"
+// CHECK-NEXT:    }
+// CHECK-NEXT:  ]
\ No newline at end of file

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

Reply via email to