[llvm-branch-commits] [clang-tools-extra] [clang-doc] Add JSON bools for parents, vparents and test (PR #171699)

Erick Velez via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Dec 10 12:57:51 PST 2025


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 <erickvelez7 at gmail.com>
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



More information about the llvm-branch-commits mailing list