Skip to content

Commit 40e3760

Browse files
committed
Generate parent context id from Decl* instead of DeclContext*.
Because of multiple inheritance, a DeclContext pointer does not produce the same pointer representation as a Decl pointer that references the same AST Node. When dumping the parentDeclContextId field of a node, convert the pointer to Decl* first, so the id can be used to find the AST node it references. Patch by Bert Belder. llvm-svn: 370970
1 parent 41adc37 commit 40e3760

File tree

5 files changed

+298
-7
lines changed

5 files changed

+298
-7
lines changed

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,14 @@ void JSONNodeDumper::Visit(const Decl *D) {
111111
if (const auto *ND = dyn_cast<NamedDecl>(D))
112112
attributeOnlyIfTrue("isHidden", ND->isHidden());
113113

114-
if (D->getLexicalDeclContext() != D->getDeclContext())
115-
JOS.attribute("parentDeclContext",
116-
createPointerRepresentation(D->getDeclContext()));
114+
if (D->getLexicalDeclContext() != D->getDeclContext()) {
115+
// Because of multiple inheritance, a DeclContext pointer does not produce
116+
// the same pointer representation as a Decl pointer that references the
117+
// same AST Node.
118+
const auto *ParentDeclContextDecl = dyn_cast<Decl>(D->getDeclContext());
119+
JOS.attribute("parentDeclContextId",
120+
createPointerRepresentation(ParentDeclContextDecl));
121+
}
117122

118123
addPreviousDeclaration(D);
119124
InnerDeclVisitor::Visit(D);
Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump=json -ast-dump-filter Test %s | FileCheck %s
2+
3+
namespace Test {
4+
5+
namespace NS {
6+
void Function();
7+
}
8+
void NS::Function() {}
9+
10+
struct S {
11+
void Method();
12+
};
13+
void S::Method() {}
14+
15+
} // namespace Test
16+
17+
// CHECK: "kind": "NamespaceDecl",
18+
// CHECK-NEXT: "loc": {
19+
// CHECK-NEXT: "file": "{{.*}}",
20+
// CHECK-NEXT: "line": 3,
21+
// CHECK-NEXT: "col": 11,
22+
// CHECK-NEXT: "tokLen": 4
23+
// CHECK-NEXT: },
24+
// CHECK-NEXT: "range": {
25+
// CHECK-NEXT: "begin": {
26+
// CHECK-NEXT: "col": 1,
27+
// CHECK-NEXT: "tokLen": 9
28+
// CHECK-NEXT: },
29+
// CHECK-NEXT: "end": {
30+
// CHECK-NEXT: "line": 15,
31+
// CHECK-NEXT: "col": 1,
32+
// CHECK-NEXT: "tokLen": 1
33+
// CHECK-NEXT: }
34+
// CHECK-NEXT: },
35+
// CHECK-NEXT: "name": "Test",
36+
// CHECK-NEXT: "inner": [
37+
// CHECK-NEXT: {
38+
// CHECK-NEXT: "id": "0x[[NS_ID:.*]]",
39+
// CHECK-NEXT: "kind": "NamespaceDecl",
40+
// CHECK-NEXT: "loc": {
41+
// CHECK-NEXT: "line": 5,
42+
// CHECK-NEXT: "col": 11,
43+
// CHECK-NEXT: "tokLen": 2
44+
// CHECK-NEXT: },
45+
// CHECK-NEXT: "range": {
46+
// CHECK-NEXT: "begin": {
47+
// CHECK-NEXT: "col": 1,
48+
// CHECK-NEXT: "tokLen": 9
49+
// CHECK-NEXT: },
50+
// CHECK-NEXT: "end": {
51+
// CHECK-NEXT: "line": 7,
52+
// CHECK-NEXT: "col": 1,
53+
// CHECK-NEXT: "tokLen": 1
54+
// CHECK-NEXT: }
55+
// CHECK-NEXT: },
56+
// CHECK-NEXT: "name": "NS",
57+
// CHECK-NEXT: "inner": [
58+
// CHECK-NEXT: {
59+
// CHECK-NEXT: "id": "0x[[FUNCTION_ID:.*]]",
60+
// CHECK-NEXT: "kind": "FunctionDecl",
61+
// CHECK-NEXT: "loc": {
62+
// CHECK-NEXT: "line": 6,
63+
// CHECK-NEXT: "col": 6,
64+
// CHECK-NEXT: "tokLen": 8
65+
// CHECK-NEXT: },
66+
// CHECK-NEXT: "range": {
67+
// CHECK-NEXT: "begin": {
68+
// CHECK-NEXT: "col": 1,
69+
// CHECK-NEXT: "tokLen": 4
70+
// CHECK-NEXT: },
71+
// CHECK-NEXT: "end": {
72+
// CHECK-NEXT: "col": 15,
73+
// CHECK-NEXT: "tokLen": 1
74+
// CHECK-NEXT: }
75+
// CHECK-NEXT: },
76+
// CHECK-NEXT: "name": "Function",
77+
// CHECK-NEXT: "type": {
78+
// CHECK-NEXT: "qualType": "void ()"
79+
// CHECK-NEXT: }
80+
// CHECK-NEXT: }
81+
// CHECK-NEXT: ]
82+
// CHECK-NEXT: },
83+
// CHECK-NEXT: {
84+
// CHECK-NEXT: "id": "0x{{.*}}",
85+
// CHECK-NEXT: "kind": "FunctionDecl",
86+
// CHECK-NEXT: "loc": {
87+
// CHECK-NEXT: "line": 8,
88+
// CHECK-NEXT: "col": 10,
89+
// CHECK-NEXT: "tokLen": 8
90+
// CHECK-NEXT: },
91+
// CHECK-NEXT: "range": {
92+
// CHECK-NEXT: "begin": {
93+
// CHECK-NEXT: "col": 1,
94+
// CHECK-NEXT: "tokLen": 4
95+
// CHECK-NEXT: },
96+
// CHECK-NEXT: "end": {
97+
// CHECK-NEXT: "col": 22,
98+
// CHECK-NEXT: "tokLen": 1
99+
// CHECK-NEXT: }
100+
// CHECK-NEXT: },
101+
// CHECK-NEXT: "parentDeclContextId": "0x[[NS_ID]]",
102+
// CHECK-NEXT: "previousDecl": "0x[[FUNCTION_ID]]",
103+
// CHECK-NEXT: "name": "Function",
104+
// CHECK-NEXT: "type": {
105+
// CHECK-NEXT: "qualType": "void ()"
106+
// CHECK-NEXT: },
107+
// CHECK-NEXT: "inner": [
108+
// CHECK-NEXT: {
109+
// CHECK-NEXT: "id": "0x{{.*}}",
110+
// CHECK-NEXT: "kind": "CompoundStmt",
111+
// CHECK-NEXT: "range": {
112+
// CHECK-NEXT: "begin": {
113+
// CHECK-NEXT: "col": 21,
114+
// CHECK-NEXT: "tokLen": 1
115+
// CHECK-NEXT: },
116+
// CHECK-NEXT: "end": {
117+
// CHECK-NEXT: "col": 22,
118+
// CHECK-NEXT: "tokLen": 1
119+
// CHECK-NEXT: }
120+
// CHECK-NEXT: }
121+
// CHECK-NEXT: }
122+
// CHECK-NEXT: ]
123+
// CHECK-NEXT: },
124+
// CHECK-NEXT: {
125+
// CHECK-NEXT: "id": "0x[[S_ID:.*]]",
126+
// CHECK-NEXT: "kind": "CXXRecordDecl",
127+
// CHECK-NEXT: "loc": {
128+
// CHECK-NEXT: "line": 10,
129+
// CHECK-NEXT: "col": 8,
130+
// CHECK-NEXT: "tokLen": 1
131+
// CHECK-NEXT: },
132+
// CHECK-NEXT: "range": {
133+
// CHECK-NEXT: "begin": {
134+
// CHECK-NEXT: "col": 1,
135+
// CHECK-NEXT: "tokLen": 6
136+
// CHECK-NEXT: },
137+
// CHECK-NEXT: "end": {
138+
// CHECK-NEXT: "line": 12,
139+
// CHECK-NEXT: "col": 1,
140+
// CHECK-NEXT: "tokLen": 1
141+
// CHECK-NEXT: }
142+
// CHECK-NEXT: },
143+
// CHECK-NEXT: "name": "S",
144+
// CHECK-NEXT: "tagUsed": "struct",
145+
// CHECK-NEXT: "completeDefinition": true,
146+
// CHECK-NEXT: "definitionData": {
147+
// CHECK-NEXT: "canConstDefaultInit": true,
148+
// CHECK-NEXT: "canPassInRegisters": true,
149+
// CHECK-NEXT: "copyAssign": {
150+
// CHECK-NEXT: "hasConstParam": true,
151+
// CHECK-NEXT: "implicitHasConstParam": true,
152+
// CHECK-NEXT: "needsImplicit": true,
153+
// CHECK-NEXT: "trivial": true
154+
// CHECK-NEXT: },
155+
// CHECK-NEXT: "copyCtor": {
156+
// CHECK-NEXT: "hasConstParam": true,
157+
// CHECK-NEXT: "implicitHasConstParam": true,
158+
// CHECK-NEXT: "needsImplicit": true,
159+
// CHECK-NEXT: "simple": true,
160+
// CHECK-NEXT: "trivial": true
161+
// CHECK-NEXT: },
162+
// CHECK-NEXT: "defaultCtor": {
163+
// CHECK-NEXT: "defaultedIsConstexpr": true,
164+
// CHECK-NEXT: "exists": true,
165+
// CHECK-NEXT: "isConstexpr": true,
166+
// CHECK-NEXT: "needsImplicit": true,
167+
// CHECK-NEXT: "trivial": true
168+
// CHECK-NEXT: },
169+
// CHECK-NEXT: "dtor": {
170+
// CHECK-NEXT: "irrelevant": true,
171+
// CHECK-NEXT: "needsImplicit": true,
172+
// CHECK-NEXT: "simple": true,
173+
// CHECK-NEXT: "trivial": true
174+
// CHECK-NEXT: },
175+
// CHECK-NEXT: "hasConstexprNonCopyMoveConstructor": true,
176+
// CHECK-NEXT: "isAggregate": true,
177+
// CHECK-NEXT: "isEmpty": true,
178+
// CHECK-NEXT: "isLiteral": true,
179+
// CHECK-NEXT: "isPOD": true,
180+
// CHECK-NEXT: "isStandardLayout": true,
181+
// CHECK-NEXT: "isTrivial": true,
182+
// CHECK-NEXT: "isTriviallyCopyable": true,
183+
// CHECK-NEXT: "moveAssign": {
184+
// CHECK-NEXT: "exists": true,
185+
// CHECK-NEXT: "needsImplicit": true,
186+
// CHECK-NEXT: "simple": true,
187+
// CHECK-NEXT: "trivial": true
188+
// CHECK-NEXT: },
189+
// CHECK-NEXT: "moveCtor": {
190+
// CHECK-NEXT: "exists": true,
191+
// CHECK-NEXT: "needsImplicit": true,
192+
// CHECK-NEXT: "simple": true,
193+
// CHECK-NEXT: "trivial": true
194+
// CHECK-NEXT: }
195+
// CHECK-NEXT: },
196+
// CHECK-NEXT: "inner": [
197+
// CHECK-NEXT: {
198+
// CHECK-NEXT: "id": "0x{{.*}}",
199+
// CHECK-NEXT: "kind": "CXXRecordDecl",
200+
// CHECK-NEXT: "loc": {
201+
// CHECK-NEXT: "line": 10,
202+
// CHECK-NEXT: "col": 8,
203+
// CHECK-NEXT: "tokLen": 1
204+
// CHECK-NEXT: },
205+
// CHECK-NEXT: "range": {
206+
// CHECK-NEXT: "begin": {
207+
// CHECK-NEXT: "col": 1,
208+
// CHECK-NEXT: "tokLen": 6
209+
// CHECK-NEXT: },
210+
// CHECK-NEXT: "end": {
211+
// CHECK-NEXT: "col": 8,
212+
// CHECK-NEXT: "tokLen": 1
213+
// CHECK-NEXT: }
214+
// CHECK-NEXT: },
215+
// CHECK-NEXT: "isImplicit": true,
216+
// CHECK-NEXT: "name": "S",
217+
// CHECK-NEXT: "tagUsed": "struct"
218+
// CHECK-NEXT: },
219+
// CHECK-NEXT: {
220+
// CHECK-NEXT: "id": "0x[[METHOD_ID:.*]]",
221+
// CHECK-NEXT: "kind": "CXXMethodDecl",
222+
// CHECK-NEXT: "loc": {
223+
// CHECK-NEXT: "line": 11,
224+
// CHECK-NEXT: "col": 8,
225+
// CHECK-NEXT: "tokLen": 6
226+
// CHECK-NEXT: },
227+
// CHECK-NEXT: "range": {
228+
// CHECK-NEXT: "begin": {
229+
// CHECK-NEXT: "col": 3,
230+
// CHECK-NEXT: "tokLen": 4
231+
// CHECK-NEXT: },
232+
// CHECK-NEXT: "end": {
233+
// CHECK-NEXT: "col": 15,
234+
// CHECK-NEXT: "tokLen": 1
235+
// CHECK-NEXT: }
236+
// CHECK-NEXT: },
237+
// CHECK-NEXT: "name": "Method",
238+
// CHECK-NEXT: "type": {
239+
// CHECK-NEXT: "qualType": "void ()"
240+
// CHECK-NEXT: }
241+
// CHECK-NEXT: }
242+
// CHECK-NEXT: ]
243+
// CHECK-NEXT: },
244+
// CHECK-NEXT: {
245+
// CHECK-NEXT: "id": "0x{{.*}}",
246+
// CHECK-NEXT: "kind": "CXXMethodDecl",
247+
// CHECK-NEXT: "loc": {
248+
// CHECK-NEXT: "line": 13,
249+
// CHECK-NEXT: "col": 9,
250+
// CHECK-NEXT: "tokLen": 6
251+
// CHECK-NEXT: },
252+
// CHECK-NEXT: "range": {
253+
// CHECK-NEXT: "begin": {
254+
// CHECK-NEXT: "col": 1,
255+
// CHECK-NEXT: "tokLen": 4
256+
// CHECK-NEXT: },
257+
// CHECK-NEXT: "end": {
258+
// CHECK-NEXT: "col": 19,
259+
// CHECK-NEXT: "tokLen": 1
260+
// CHECK-NEXT: }
261+
// CHECK-NEXT: },
262+
// CHECK-NEXT: "parentDeclContextId": "0x[[S_ID]]",
263+
// CHECK-NEXT: "previousDecl": "0x[[METHOD_ID]]",
264+
// CHECK-NEXT: "name": "Method",
265+
// CHECK-NEXT: "type": {
266+
// CHECK-NEXT: "qualType": "void ()"
267+
// CHECK-NEXT: },
268+
// CHECK-NEXT: "inner": [
269+
// CHECK-NEXT: {
270+
// CHECK-NEXT: "id": "0x{{.*}}",
271+
// CHECK-NEXT: "kind": "CompoundStmt",
272+
// CHECK-NEXT: "range": {
273+
// CHECK-NEXT: "begin": {
274+
// CHECK-NEXT: "col": 18,
275+
// CHECK-NEXT: "tokLen": 1
276+
// CHECK-NEXT: },
277+
// CHECK-NEXT: "end": {
278+
// CHECK-NEXT: "col": 19,
279+
// CHECK-NEXT: "tokLen": 1
280+
// CHECK-NEXT: }
281+
// CHECK-NEXT: }
282+
// CHECK-NEXT: }
283+
// CHECK-NEXT: ]
284+
// CHECK-NEXT: }
285+
// CHECK-NEXT: ]
286+
// CHECK-NEXT: }

clang/test/AST/ast-dump-decl-json.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ void testParmVarDecl(int TestParmVarDecl);
226226
// CHECK-NEXT: "tokLen": 1
227227
// CHECK-NEXT: }
228228
// CHECK-NEXT: },
229-
// CHECK-NEXT: "parentDeclContext": "0x{{.*}}",
229+
// CHECK-NEXT: "parentDeclContextId": "0x{{.*}}",
230230
// CHECK-NEXT: "name": "y",
231231
// CHECK-NEXT: "tagUsed": "struct",
232232
// CHECK-NEXT: "completeDefinition": true,

clang/test/AST/ast-dump-funcs-json.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ int main() {
426426
// CHECK-NEXT: "tokLen": 1
427427
// CHECK-NEXT: }
428428
// CHECK-NEXT: },
429-
// CHECK-NEXT: "parentDeclContext": "0x{{.*}}",
429+
// CHECK-NEXT: "parentDeclContextId": "0x{{.*}}",
430430
// CHECK-NEXT: "previousDecl": "0x{{.*}}",
431431
// CHECK-NEXT: "name": "Test1",
432432
// CHECK-NEXT: "type": {

clang/test/AST/ast-dump-template-decls-json.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2217,7 +2217,7 @@ void V<Ty>::f() {}
22172217
// CHECK-NEXT: "tokLen": 1
22182218
// CHECK-NEXT: }
22192219
// CHECK-NEXT: },
2220-
// CHECK-NEXT: "parentDeclContext": "0x{{.*}}",
2220+
// CHECK-NEXT: "parentDeclContextId": "0x{{.*}}",
22212221
// CHECK-NEXT: "previousDecl": "0x{{.*}}",
22222222
// CHECK-NEXT: "name": "f",
22232223
// CHECK-NEXT: "inner": [
@@ -2264,7 +2264,7 @@ void V<Ty>::f() {}
22642264
// CHECK-NEXT: "tokLen": 1
22652265
// CHECK-NEXT: }
22662266
// CHECK-NEXT: },
2267-
// CHECK-NEXT: "parentDeclContext": "0x{{.*}}",
2267+
// CHECK-NEXT: "parentDeclContextId": "0x{{.*}}",
22682268
// CHECK-NEXT: "previousDecl": "0x{{.*}}",
22692269
// CHECK-NEXT: "name": "f",
22702270
// CHECK-NEXT: "type": {

0 commit comments

Comments
 (0)