Skip to content

Conversation

@evelez7
Copy link
Member

@evelez7 evelez7 commented Dec 10, 2025

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

Copy link
Member Author

evelez7 commented Dec 10, 2025

@evelez7 evelez7 marked this pull request as ready for review December 10, 2025 20:58
@evelez7 evelez7 force-pushed the users/evelez7/clang-doc-serialize-static-for-members branch from 602d10e to dc830ae Compare December 10, 2025 21:35
@evelez7 evelez7 force-pushed the users/evelez7/clang-doc-has-parents-vparents branch from 40a7689 to a0298a6 Compare December 10, 2025 21:35
@github-actions
Copy link

github-actions bot commented Dec 10, 2025

🐧 Linux x64 Test Results

  • 3048 tests passed
  • 7 tests skipped

✅ The build succeeded and all tests passed.

@github-actions
Copy link

github-actions bot commented Dec 10, 2025

🪟 Windows x64 Test Results

  • 2986 tests passed
  • 30 tests skipped

✅ The build succeeded and all tests passed.

@llvmbot
Copy link
Member

llvmbot commented Dec 10, 2025

@llvm/pr-subscribers-clang-tools-extra

Author: Erick Velez (evelez7)

Changes

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


Full diff: https://github.com/llvm/llvm-project/pull/171699.diff

3 Files Affected:

  • (modified) clang-tools-extra/clang-doc/JSONGenerator.cpp (+6-2)
  • (added) clang-tools-extra/test/clang-doc/json/inheritance.cpp (+111)
  • (modified) clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp (+2)
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
diff --git a/clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp
index d5ce34d2b984c..bcb9fd8e47bc6 100644
--- a/clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp
@@ -116,8 +116,10 @@ TEST_F(JSONGeneratorTest, emitRecordJSON) {
     }
   ],
   "HasEnums": true,
+  "HasParents": true,
   "HasPublicFunctions": true,
   "HasRecords": true,
+  "HasVirtualParents": true,
   "InfoType": "record",
   "IsTypedef": false,
   "Location": {

@evelez7 evelez7 force-pushed the users/evelez7/clang-doc-serialize-static-for-members branch from dc830ae to 85b0b75 Compare December 11, 2025 16:53
@evelez7 evelez7 force-pushed the users/evelez7/clang-doc-has-parents-vparents branch from a0298a6 to 45d8e8a Compare December 11, 2025 16:53
Base automatically changed from users/evelez7/clang-doc-serialize-static-for-members to main December 11, 2025 18:39
@evelez7 evelez7 merged commit ca6eb2f into main Dec 11, 2025
10 checks passed
@evelez7 evelez7 deleted the users/evelez7/clang-doc-has-parents-vparents branch December 11, 2025 18:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants