Skip to content

Commit fa6c157

Browse files
committed
Differentiate between the presumed and actual file when dumping the AST to JSON
Currently, when dumping the AST to JSON, the presumed file is what is included when dumping a source location. This patch changes the behavior to instead dump the actual file, and only dump a presumed file name when it differs from the actual file. This also corrects an issue with the test script generator that would prevent it from working on Windows due to file permissions issues.
1 parent 6ed9cef commit fa6c157

File tree

4 files changed

+323
-5
lines changed

4 files changed

+323
-5
lines changed

clang/include/clang/AST/JSONNodeDumper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ class JSONNodeDumper
126126
ASTNameGenerator ASTNameGen;
127127
PrintingPolicy PrintPolicy;
128128
const comments::CommandTraits *Traits;
129-
StringRef LastLocFilename;
129+
StringRef LastLocFilename, LastLocPresumedFilename;
130130
unsigned LastLocLine, LastLocPresumedLine;
131131

132132
using InnerAttrVisitor = ConstAttrVisitor<JSONNodeDumper>;

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,22 +202,29 @@ void JSONNodeDumper::writeBareSourceLocation(SourceLocation Loc,
202202
PresumedLoc Presumed = SM.getPresumedLoc(Loc);
203203
unsigned ActualLine = IsSpelling ? SM.getSpellingLineNumber(Loc)
204204
: SM.getExpansionLineNumber(Loc);
205+
StringRef ActualFile = SM.getBufferName(Loc);
206+
205207
if (Presumed.isValid()) {
206208
JOS.attribute("offset", SM.getDecomposedLoc(Loc).second);
207-
if (LastLocFilename != Presumed.getFilename()) {
208-
JOS.attribute("file", Presumed.getFilename());
209+
if (LastLocFilename != ActualFile) {
210+
JOS.attribute("file", ActualFile);
209211
JOS.attribute("line", ActualLine);
210212
} else if (LastLocLine != ActualLine)
211213
JOS.attribute("line", ActualLine);
212214

215+
StringRef PresumedFile = Presumed.getFilename();
216+
if (PresumedFile != ActualFile && LastLocPresumedFilename != PresumedFile)
217+
JOS.attribute("presumedFile", PresumedFile);
218+
213219
unsigned PresumedLine = Presumed.getLine();
214220
if (ActualLine != PresumedLine && LastLocPresumedLine != PresumedLine)
215221
JOS.attribute("presumedLine", PresumedLine);
216222

217223
JOS.attribute("col", Presumed.getColumn());
218224
JOS.attribute("tokLen",
219225
Lexer::MeasureTokenLength(Loc, SM, Ctx.getLangOpts()));
220-
LastLocFilename = Presumed.getFilename();
226+
LastLocFilename = ActualFile;
227+
LastLocPresumedFilename = PresumedFile;
221228
LastLocPresumedLine = PresumedLine;
222229
LastLocLine = ActualLine;
223230

Lines changed: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,309 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump=json %s | FileCheck %s
2+
3+
#line 4 "test.c"
4+
int a;
5+
6+
#line 32 "bar.h"
7+
int b;
8+
int c;
9+
10+
#line 11 "test.c"
11+
int d;
12+
int e;
13+
// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
14+
15+
16+
// CHECK: "kind": "TranslationUnitDecl",
17+
// CHECK-NEXT: "loc": {},
18+
// CHECK-NEXT: "range": {
19+
// CHECK-NEXT: "begin": {},
20+
// CHECK-NEXT: "end": {}
21+
// CHECK-NEXT: },
22+
// CHECK-NEXT: "inner": [
23+
// CHECK-NEXT: {
24+
// CHECK-NEXT: "id": "0x{{.*}}",
25+
// CHECK-NEXT: "kind": "TypedefDecl",
26+
// CHECK-NEXT: "loc": {},
27+
// CHECK-NEXT: "range": {
28+
// CHECK-NEXT: "begin": {},
29+
// CHECK-NEXT: "end": {}
30+
// CHECK-NEXT: },
31+
// CHECK-NEXT: "isImplicit": true,
32+
// CHECK-NEXT: "name": "__int128_t",
33+
// CHECK-NEXT: "type": {
34+
// CHECK-NEXT: "qualType": "__int128"
35+
// CHECK-NEXT: },
36+
// CHECK-NEXT: "inner": [
37+
// CHECK-NEXT: {
38+
// CHECK-NEXT: "id": "0x{{.*}}",
39+
// CHECK-NEXT: "kind": "BuiltinType",
40+
// CHECK-NEXT: "type": {
41+
// CHECK-NEXT: "qualType": "__int128"
42+
// CHECK-NEXT: }
43+
// CHECK-NEXT: }
44+
// CHECK-NEXT: ]
45+
// CHECK-NEXT: },
46+
// CHECK-NEXT: {
47+
// CHECK-NEXT: "id": "0x{{.*}}",
48+
// CHECK-NEXT: "kind": "TypedefDecl",
49+
// CHECK-NEXT: "loc": {},
50+
// CHECK-NEXT: "range": {
51+
// CHECK-NEXT: "begin": {},
52+
// CHECK-NEXT: "end": {}
53+
// CHECK-NEXT: },
54+
// CHECK-NEXT: "isImplicit": true,
55+
// CHECK-NEXT: "name": "__uint128_t",
56+
// CHECK-NEXT: "type": {
57+
// CHECK-NEXT: "qualType": "unsigned __int128"
58+
// CHECK-NEXT: },
59+
// CHECK-NEXT: "inner": [
60+
// CHECK-NEXT: {
61+
// CHECK-NEXT: "id": "0x{{.*}}",
62+
// CHECK-NEXT: "kind": "BuiltinType",
63+
// CHECK-NEXT: "type": {
64+
// CHECK-NEXT: "qualType": "unsigned __int128"
65+
// CHECK-NEXT: }
66+
// CHECK-NEXT: }
67+
// CHECK-NEXT: ]
68+
// CHECK-NEXT: },
69+
// CHECK-NEXT: {
70+
// CHECK-NEXT: "id": "0x{{.*}}",
71+
// CHECK-NEXT: "kind": "TypedefDecl",
72+
// CHECK-NEXT: "loc": {},
73+
// CHECK-NEXT: "range": {
74+
// CHECK-NEXT: "begin": {},
75+
// CHECK-NEXT: "end": {}
76+
// CHECK-NEXT: },
77+
// CHECK-NEXT: "isImplicit": true,
78+
// CHECK-NEXT: "name": "__NSConstantString",
79+
// CHECK-NEXT: "type": {
80+
// CHECK-NEXT: "qualType": "struct __NSConstantString_tag"
81+
// CHECK-NEXT: },
82+
// CHECK-NEXT: "inner": [
83+
// CHECK-NEXT: {
84+
// CHECK-NEXT: "id": "0x{{.*}}",
85+
// CHECK-NEXT: "kind": "RecordType",
86+
// CHECK-NEXT: "type": {
87+
// CHECK-NEXT: "qualType": "struct __NSConstantString_tag"
88+
// CHECK-NEXT: },
89+
// CHECK-NEXT: "decl": {
90+
// CHECK-NEXT: "id": "0x{{.*}}",
91+
// CHECK-NEXT: "kind": "RecordDecl",
92+
// CHECK-NEXT: "name": "__NSConstantString_tag"
93+
// CHECK-NEXT: }
94+
// CHECK-NEXT: }
95+
// CHECK-NEXT: ]
96+
// CHECK-NEXT: },
97+
// CHECK-NEXT: {
98+
// CHECK-NEXT: "id": "0x{{.*}}",
99+
// CHECK-NEXT: "kind": "TypedefDecl",
100+
// CHECK-NEXT: "loc": {},
101+
// CHECK-NEXT: "range": {
102+
// CHECK-NEXT: "begin": {},
103+
// CHECK-NEXT: "end": {}
104+
// CHECK-NEXT: },
105+
// CHECK-NEXT: "isImplicit": true,
106+
// CHECK-NEXT: "name": "__builtin_ms_va_list",
107+
// CHECK-NEXT: "type": {
108+
// CHECK-NEXT: "qualType": "char *"
109+
// CHECK-NEXT: },
110+
// CHECK-NEXT: "inner": [
111+
// CHECK-NEXT: {
112+
// CHECK-NEXT: "id": "0x{{.*}}",
113+
// CHECK-NEXT: "kind": "PointerType",
114+
// CHECK-NEXT: "type": {
115+
// CHECK-NEXT: "qualType": "char *"
116+
// CHECK-NEXT: },
117+
// CHECK-NEXT: "inner": [
118+
// CHECK-NEXT: {
119+
// CHECK-NEXT: "id": "0x{{.*}}",
120+
// CHECK-NEXT: "kind": "BuiltinType",
121+
// CHECK-NEXT: "type": {
122+
// CHECK-NEXT: "qualType": "char"
123+
// CHECK-NEXT: }
124+
// CHECK-NEXT: }
125+
// CHECK-NEXT: ]
126+
// CHECK-NEXT: }
127+
// CHECK-NEXT: ]
128+
// CHECK-NEXT: },
129+
// CHECK-NEXT: {
130+
// CHECK-NEXT: "id": "0x{{.*}}",
131+
// CHECK-NEXT: "kind": "TypedefDecl",
132+
// CHECK-NEXT: "loc": {},
133+
// CHECK-NEXT: "range": {
134+
// CHECK-NEXT: "begin": {},
135+
// CHECK-NEXT: "end": {}
136+
// CHECK-NEXT: },
137+
// CHECK-NEXT: "isImplicit": true,
138+
// CHECK-NEXT: "name": "__builtin_va_list",
139+
// CHECK-NEXT: "type": {
140+
// CHECK-NEXT: "qualType": "struct __va_list_tag [1]"
141+
// CHECK-NEXT: },
142+
// CHECK-NEXT: "inner": [
143+
// CHECK-NEXT: {
144+
// CHECK-NEXT: "id": "0x{{.*}}",
145+
// CHECK-NEXT: "kind": "ConstantArrayType",
146+
// CHECK-NEXT: "type": {
147+
// CHECK-NEXT: "qualType": "struct __va_list_tag [1]"
148+
// CHECK-NEXT: },
149+
// CHECK-NEXT: "size": 1,
150+
// CHECK-NEXT: "inner": [
151+
// CHECK-NEXT: {
152+
// CHECK-NEXT: "id": "0x{{.*}}",
153+
// CHECK-NEXT: "kind": "RecordType",
154+
// CHECK-NEXT: "type": {
155+
// CHECK-NEXT: "qualType": "struct __va_list_tag"
156+
// CHECK-NEXT: },
157+
// CHECK-NEXT: "decl": {
158+
// CHECK-NEXT: "id": "0x{{.*}}",
159+
// CHECK-NEXT: "kind": "RecordDecl",
160+
// CHECK-NEXT: "name": "__va_list_tag"
161+
// CHECK-NEXT: }
162+
// CHECK-NEXT: }
163+
// CHECK-NEXT: ]
164+
// CHECK-NEXT: }
165+
// CHECK-NEXT: ]
166+
// CHECK-NEXT: },
167+
// CHECK-NEXT: {
168+
// CHECK-NEXT: "id": "0x{{.*}}",
169+
// CHECK-NEXT: "kind": "VarDecl",
170+
// CHECK-NEXT: "loc": {
171+
// CHECK-NEXT: "offset": 108,
172+
// CHECK-NEXT: "file": "{{.*}}",
173+
// CHECK-NEXT: "line": 4,
174+
// CHECK-NEXT: "presumedFile": "test.c",
175+
// CHECK-NEXT: "col": 5,
176+
// CHECK-NEXT: "tokLen": 1
177+
// CHECK-NEXT: },
178+
// CHECK-NEXT: "range": {
179+
// CHECK-NEXT: "begin": {
180+
// CHECK-NEXT: "offset": 104,
181+
// CHECK-NEXT: "col": 1,
182+
// CHECK-NEXT: "tokLen": 3
183+
// CHECK-NEXT: },
184+
// CHECK-NEXT: "end": {
185+
// CHECK-NEXT: "offset": 108,
186+
// CHECK-NEXT: "col": 5,
187+
// CHECK-NEXT: "tokLen": 1
188+
// CHECK-NEXT: }
189+
// CHECK-NEXT: },
190+
// CHECK-NEXT: "name": "a",
191+
// CHECK-NEXT: "mangledName": "a",
192+
// CHECK-NEXT: "type": {
193+
// CHECK-NEXT: "qualType": "int"
194+
// CHECK-NEXT: }
195+
// CHECK-NEXT: },
196+
// CHECK-NEXT: {
197+
// CHECK-NEXT: "id": "0x{{.*}}",
198+
// CHECK-NEXT: "kind": "VarDecl",
199+
// CHECK-NEXT: "loc": {
200+
// CHECK-NEXT: "offset": 136,
201+
// CHECK-NEXT: "line": 7,
202+
// CHECK-NEXT: "presumedFile": "bar.h",
203+
// CHECK-NEXT: "presumedLine": 32,
204+
// CHECK-NEXT: "col": 5,
205+
// CHECK-NEXT: "tokLen": 1
206+
// CHECK-NEXT: },
207+
// CHECK-NEXT: "range": {
208+
// CHECK-NEXT: "begin": {
209+
// CHECK-NEXT: "offset": 132,
210+
// CHECK-NEXT: "col": 1,
211+
// CHECK-NEXT: "tokLen": 3
212+
// CHECK-NEXT: },
213+
// CHECK-NEXT: "end": {
214+
// CHECK-NEXT: "offset": 136,
215+
// CHECK-NEXT: "col": 5,
216+
// CHECK-NEXT: "tokLen": 1
217+
// CHECK-NEXT: }
218+
// CHECK-NEXT: },
219+
// CHECK-NEXT: "name": "b",
220+
// CHECK-NEXT: "mangledName": "b",
221+
// CHECK-NEXT: "type": {
222+
// CHECK-NEXT: "qualType": "int"
223+
// CHECK-NEXT: }
224+
// CHECK-NEXT: },
225+
// CHECK-NEXT: {
226+
// CHECK-NEXT: "id": "0x{{.*}}",
227+
// CHECK-NEXT: "kind": "VarDecl",
228+
// CHECK-NEXT: "loc": {
229+
// CHECK-NEXT: "offset": 144,
230+
// CHECK-NEXT: "line": 8,
231+
// CHECK-NEXT: "presumedLine": 33,
232+
// CHECK-NEXT: "col": 5,
233+
// CHECK-NEXT: "tokLen": 1
234+
// CHECK-NEXT: },
235+
// CHECK-NEXT: "range": {
236+
// CHECK-NEXT: "begin": {
237+
// CHECK-NEXT: "offset": 140,
238+
// CHECK-NEXT: "col": 1,
239+
// CHECK-NEXT: "tokLen": 3
240+
// CHECK-NEXT: },
241+
// CHECK-NEXT: "end": {
242+
// CHECK-NEXT: "offset": 144,
243+
// CHECK-NEXT: "col": 5,
244+
// CHECK-NEXT: "tokLen": 1
245+
// CHECK-NEXT: }
246+
// CHECK-NEXT: },
247+
// CHECK-NEXT: "name": "c",
248+
// CHECK-NEXT: "mangledName": "c",
249+
// CHECK-NEXT: "type": {
250+
// CHECK-NEXT: "qualType": "int"
251+
// CHECK-NEXT: }
252+
// CHECK-NEXT: },
253+
// CHECK-NEXT: {
254+
// CHECK-NEXT: "id": "0x{{.*}}",
255+
// CHECK-NEXT: "kind": "VarDecl",
256+
// CHECK-NEXT: "loc": {
257+
// CHECK-NEXT: "offset": 173,
258+
// CHECK-NEXT: "line": 11,
259+
// CHECK-NEXT: "presumedFile": "test.c",
260+
// CHECK-NEXT: "col": 5,
261+
// CHECK-NEXT: "tokLen": 1
262+
// CHECK-NEXT: },
263+
// CHECK-NEXT: "range": {
264+
// CHECK-NEXT: "begin": {
265+
// CHECK-NEXT: "offset": 169,
266+
// CHECK-NEXT: "col": 1,
267+
// CHECK-NEXT: "tokLen": 3
268+
// CHECK-NEXT: },
269+
// CHECK-NEXT: "end": {
270+
// CHECK-NEXT: "offset": 173,
271+
// CHECK-NEXT: "col": 5,
272+
// CHECK-NEXT: "tokLen": 1
273+
// CHECK-NEXT: }
274+
// CHECK-NEXT: },
275+
// CHECK-NEXT: "name": "d",
276+
// CHECK-NEXT: "mangledName": "d",
277+
// CHECK-NEXT: "type": {
278+
// CHECK-NEXT: "qualType": "int"
279+
// CHECK-NEXT: }
280+
// CHECK-NEXT: },
281+
// CHECK-NEXT: {
282+
// CHECK-NEXT: "id": "0x{{.*}}",
283+
// CHECK-NEXT: "kind": "VarDecl",
284+
// CHECK-NEXT: "loc": {
285+
// CHECK-NEXT: "offset": 181,
286+
// CHECK-NEXT: "line": 12,
287+
// CHECK-NEXT: "col": 5,
288+
// CHECK-NEXT: "tokLen": 1
289+
// CHECK-NEXT: },
290+
// CHECK-NEXT: "range": {
291+
// CHECK-NEXT: "begin": {
292+
// CHECK-NEXT: "offset": 177,
293+
// CHECK-NEXT: "col": 1,
294+
// CHECK-NEXT: "tokLen": 3
295+
// CHECK-NEXT: },
296+
// CHECK-NEXT: "end": {
297+
// CHECK-NEXT: "offset": 181,
298+
// CHECK-NEXT: "col": 5,
299+
// CHECK-NEXT: "tokLen": 1
300+
// CHECK-NEXT: }
301+
// CHECK-NEXT: },
302+
// CHECK-NEXT: "name": "e",
303+
// CHECK-NEXT: "mangledName": "e",
304+
// CHECK-NEXT: "type": {
305+
// CHECK-NEXT: "qualType": "int"
306+
// CHECK-NEXT: }
307+
// CHECK-NEXT: }
308+
// CHECK-NEXT: ]
309+
// CHECK-NEXT: }

clang/test/AST/gen_ast_dump_json_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def process_file(source_file, clang_binary, cmdline_filters, cmdline_opts,
180180

181181
filter_json(j, filters, out_asts)
182182

183-
with tempfile.NamedTemporaryFile("w") as f:
183+
with tempfile.NamedTemporaryFile("w", delete=False) as f:
184184
with open(source_file, "r") as srcf:
185185
for line in srcf.readlines():
186186
# copy up to the note:
@@ -201,6 +201,7 @@ def process_file(source_file, clang_binary, cmdline_filters, cmdline_opts,
201201

202202
f.write(out_str)
203203
f.flush()
204+
f.close()
204205
if do_update:
205206
print("Updating json appended source file to %s." % source_file)
206207
copyfile(f.name, source_file)
@@ -209,6 +210,7 @@ def process_file(source_file, clang_binary, cmdline_filters, cmdline_opts,
209210
dest_path = '%s-json%s%s' % (partition[0], partition[1], partition[2])
210211
print("Writing json appended source file to %s." % dest_path)
211212
copyfile(f.name, dest_path)
213+
os.remove(f.name)
212214
return 0
213215

214216

0 commit comments

Comments
 (0)