Skip to content

Commit ca6eb2f

Browse files
authored
[clang-doc] Add JSON bools for parents, vparents and test (#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
1 parent 3a6c8c4 commit ca6eb2f

File tree

3 files changed

+119
-2
lines changed

3 files changed

+119
-2
lines changed

clang-tools-extra/clang-doc/JSONGenerator.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,12 +572,16 @@ static void serializeInfo(const RecordInfo &I, json::Object &Obj,
572572
serializeInfo(Base, BaseObj, RepositoryUrl);
573573
});
574574

575-
if (!I.Parents.empty())
575+
if (!I.Parents.empty()) {
576576
serializeArray(I.Parents, Obj, "Parents", SerializeReferenceLambda);
577+
Obj["HasParents"] = true;
578+
}
577579

578-
if (!I.VirtualParents.empty())
580+
if (!I.VirtualParents.empty()) {
579581
serializeArray(I.VirtualParents, Obj, "VirtualParents",
580582
SerializeReferenceLambda);
583+
Obj["HasVirtualParents"] = true;
584+
}
581585

582586
if (I.Template)
583587
serializeInfo(I.Template.value(), Obj);
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// RUN: rm -rf %t && mkdir -p %t
2+
// RUN: clang-doc --output=%t --format=json --executor=standalone %s
3+
// RUN: FileCheck %s < %t/json/GlobalNamespace/_ZTV7MyClass.json
4+
5+
class Virtual {};
6+
class Foo : virtual Virtual {};
7+
class Bar : Foo {};
8+
class Fizz : virtual Virtual {};
9+
class Buzz : Fizz {};
10+
11+
class MyClass : Bar, Buzz {};
12+
13+
// CHECK: "Bases": [
14+
// CHECK-NEXT: {
15+
// CHECK-NEXT: "Access": "private",
16+
// CHECK-NEXT: "InfoType": "record",
17+
// CHECK-NEXT: "IsParent": true,
18+
// CHECK-NEXT: "IsTypedef": false,
19+
// CHECK-NEXT: "IsVirtual": false,
20+
// CHECK-NEXT: "MangledName": "",
21+
// CHECK-NEXT: "Name": "Bar",
22+
// CHECK-NEXT: "Path": "GlobalNamespace",
23+
// CHECK-NEXT: "TagType": "struct",
24+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
25+
// CHECK-NEXT: },
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: "Access": "private",
28+
// CHECK-NEXT: "InfoType": "record",
29+
// CHECK-NEXT: "IsParent": false,
30+
// CHECK-NEXT: "IsTypedef": false,
31+
// CHECK-NEXT: "IsVirtual": false,
32+
// CHECK-NEXT: "MangledName": "",
33+
// CHECK-NEXT: "Name": "Foo",
34+
// CHECK-NEXT: "Path": "GlobalNamespace",
35+
// CHECK-NEXT: "TagType": "struct",
36+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
37+
// CHECK-NEXT: },
38+
// CHECK-NEXT: {
39+
// CHECK-NEXT: "Access": "private",
40+
// CHECK-NEXT: "InfoType": "record",
41+
// CHECK-NEXT: "IsParent": false,
42+
// CHECK-NEXT: "IsTypedef": false,
43+
// CHECK-NEXT: "IsVirtual": true,
44+
// CHECK-NEXT: "MangledName": "",
45+
// CHECK-NEXT: "Name": "Virtual",
46+
// CHECK-NEXT: "Path": "GlobalNamespace",
47+
// CHECK-NEXT: "TagType": "struct",
48+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
49+
// CHECK-NEXT: },
50+
// CHECK-NEXT: {
51+
// CHECK-NEXT: "Access": "private",
52+
// CHECK-NEXT: "InfoType": "record",
53+
// CHECK-NEXT: "IsParent": true,
54+
// CHECK-NEXT: "IsTypedef": false,
55+
// CHECK-NEXT: "IsVirtual": false,
56+
// CHECK-NEXT: "MangledName": "",
57+
// CHECK-NEXT: "Name": "Buzz",
58+
// CHECK-NEXT: "Path": "GlobalNamespace",
59+
// CHECK-NEXT: "TagType": "struct",
60+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
61+
// CHECK-NEXT: },
62+
// CHECK-NEXT: {
63+
// CHECK-NEXT: "Access": "private",
64+
// CHECK-NEXT: "InfoType": "record",
65+
// CHECK-NEXT: "IsParent": false,
66+
// CHECK-NEXT: "IsTypedef": false,
67+
// CHECK-NEXT: "IsVirtual": false,
68+
// CHECK-NEXT: "MangledName": "",
69+
// CHECK-NEXT: "Name": "Fizz",
70+
// CHECK-NEXT: "Path": "GlobalNamespace",
71+
// CHECK-NEXT: "TagType": "struct",
72+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
73+
// CHECK-NEXT: },
74+
// CHECK-NEXT: {
75+
// CHECK-NEXT: "Access": "private",
76+
// CHECK-NEXT: "End": true,
77+
// CHECK-NEXT: "InfoType": "record",
78+
// CHECK-NEXT: "IsParent": false,
79+
// CHECK-NEXT: "IsTypedef": false,
80+
// CHECK-NEXT: "IsVirtual": true,
81+
// CHECK-NEXT: "MangledName": "",
82+
// CHECK-NEXT: "Name": "Virtual",
83+
// CHECK-NEXT: "Path": "GlobalNamespace",
84+
// CHECK-NEXT: "TagType": "struct",
85+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
86+
// CHECK-NEXT: }
87+
// CHECK-NEXT: ],
88+
// CHECK: "Parents": [
89+
// CHECK-NEXT: {
90+
// CHECK-NEXT: "Name": "Bar",
91+
// CHECK-NEXT: "Path": "GlobalNamespace",
92+
// CHECK-NEXT: "QualName": "Bar",
93+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
94+
// CHECK-NEXT: },
95+
// CHECK-NEXT: {
96+
// CHECK-NEXT: "End": true,
97+
// CHECK-NEXT: "Name": "Buzz",
98+
// CHECK-NEXT: "Path": "GlobalNamespace",
99+
// CHECK-NEXT: "QualName": "Buzz",
100+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
101+
// CHECK-NEXT: }
102+
// CHECK-NEXT: ],
103+
// CHECK: "VirtualParents": [
104+
// CHECK-NEXT: {
105+
// CHECK-NEXT: "End": true,
106+
// CHECK-NEXT: "Name": "Virtual",
107+
// CHECK-NEXT: "Path": "GlobalNamespace",
108+
// CHECK-NEXT: "QualName": "Virtual",
109+
// CHECK-NEXT: "USR": "{{[0-9A-F]*}}"
110+
// CHECK-NEXT: }
111+
// CHECK-NEXT: ]

clang-tools-extra/unittests/clang-doc/JSONGeneratorTest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@ TEST_F(JSONGeneratorTest, emitRecordJSON) {
116116
}
117117
],
118118
"HasEnums": true,
119+
"HasParents": true,
119120
"HasPublicFunctions": true,
120121
"HasRecords": true,
122+
"HasVirtualParents": true,
121123
"InfoType": "record",
122124
"IsTypedef": false,
123125
"Location": {

0 commit comments

Comments
 (0)