xref: /llvm-project/clang/test/ExtractAPI/emit-symbol-graph/multi_file.c (revision b1b24d751776d5fd2218a5cb43a8d103bf59fa32)
1 // RUN: rm -rf %t
2 // RUN: mkdir %t
3 // RUN: split-file %s %t
4 // RUN: sed -e "s@INPUT_DIR@%{/t:regex_replacement}@g" \
5 // RUN: %t/reference.main.json.in >> %t/reference.main.json
6 // RUN: sed -e "s@INPUT_DIR@%{/t:regex_replacement}@g" \
7 // RUN: %t/reference.test.json.in >> %t/reference.test.json
8 // RUN: %clang_cc1 %t/test.c %t/main.c -emit-symbol-graph --pretty-sgf \
9 // RUN:   --symbol-graph-dir=%t/SymbolGraphs --product-name=multifile_test -triple=x86_64-apple-macosx12.0.0
10 
11 // Test main.json
12 // Generator version is not consistent across test runs, normalize it.
13 // RUN: sed -e "s@\"generator\": \".*\"@\"generator\": \"?\"@g" \
14 // RUN: %t/SymbolGraphs/main.c.symbols.json > %t/output-normalized.json
15 // RUN: diff %t/reference.main.json %t/output-normalized.json
16 
17 // Test test.json
18 // Generator version is not consistent across test runs, normalize it.
19 // RUN: sed -e "s@\"generator\": \".*\"@\"generator\": \"?\"@g" \
20 // RUN: %t/SymbolGraphs/test.c.symbols.json > %t/output-normalized.json
21 // RUN: diff %t/reference.test.json %t/output-normalized.json
22 
23 // CHECK-NOT: error:
24 // CHECK-NOT: warning:
25 
26 //--- test.h
27 #ifndef TEST_H
28 #define TEST_H
29 
30 int testfunc (int param1, int param2);
31 void testfunc2 ();
32 #endif /* TEST_H */
33 
34 //--- test.c
35 #include "test.h"
36 
37 int testfunc(int param1, int param2) { return param1 + param2; }
38 
39 void testfunc2() {}
40 
41 //--- main.c
42 #include "test.h"
43 
44 int main ()
45 {
46   testfunc2();
47   return 0;
48 }
49 
50 //--- reference.main.json.in
51 {
52   "metadata": {
53     "formatVersion": {
54       "major": 0,
55       "minor": 5,
56       "patch": 3
57     },
58     "generator": "?"
59   },
60   "module": {
61     "name": "multifile_test",
62     "platform": {
63       "architecture": "x86_64",
64       "operatingSystem": {
65         "name": "macosx"
66       },
67       "vendor": "apple"
68     }
69   },
70   "relationships": [],
71   "symbols": [
72     {
73       "accessLevel": "public",
74       "declarationFragments": [
75         {
76           "kind": "typeIdentifier",
77           "preciseIdentifier": "c:I",
78           "spelling": "int"
79         },
80         {
81           "kind": "text",
82           "spelling": " "
83         },
84         {
85           "kind": "identifier",
86           "spelling": "testfunc"
87         },
88         {
89           "kind": "text",
90           "spelling": "("
91         },
92         {
93           "kind": "typeIdentifier",
94           "preciseIdentifier": "c:I",
95           "spelling": "int"
96         },
97         {
98           "kind": "text",
99           "spelling": " "
100         },
101         {
102           "kind": "internalParam",
103           "spelling": "param1"
104         },
105         {
106           "kind": "text",
107           "spelling": ", "
108         },
109         {
110           "kind": "typeIdentifier",
111           "preciseIdentifier": "c:I",
112           "spelling": "int"
113         },
114         {
115           "kind": "text",
116           "spelling": " "
117         },
118         {
119           "kind": "internalParam",
120           "spelling": "param2"
121         },
122         {
123           "kind": "text",
124           "spelling": ");"
125         }
126       ],
127       "functionSignature": {
128         "parameters": [
129           {
130             "declarationFragments": [
131               {
132                 "kind": "typeIdentifier",
133                 "preciseIdentifier": "c:I",
134                 "spelling": "int"
135               },
136               {
137                 "kind": "text",
138                 "spelling": " "
139               },
140               {
141                 "kind": "internalParam",
142                 "spelling": "param1"
143               }
144             ],
145             "name": "param1"
146           },
147           {
148             "declarationFragments": [
149               {
150                 "kind": "typeIdentifier",
151                 "preciseIdentifier": "c:I",
152                 "spelling": "int"
153               },
154               {
155                 "kind": "text",
156                 "spelling": " "
157               },
158               {
159                 "kind": "internalParam",
160                 "spelling": "param2"
161               }
162             ],
163             "name": "param2"
164           }
165         ],
166         "returns": [
167           {
168             "kind": "typeIdentifier",
169             "preciseIdentifier": "c:I",
170             "spelling": "int"
171           }
172         ]
173       },
174       "identifier": {
175         "interfaceLanguage": "c",
176         "precise": "c:@F@testfunc"
177       },
178       "kind": {
179         "displayName": "Function",
180         "identifier": "c.func"
181       },
182       "location": {
183         "position": {
184           "character": 4,
185           "line": 3
186         },
187         "uri": "file://INPUT_DIR/test.h"
188       },
189       "names": {
190         "navigator": [
191           {
192             "kind": "identifier",
193             "spelling": "testfunc"
194           }
195         ],
196         "subHeading": [
197           {
198             "kind": "identifier",
199             "spelling": "testfunc"
200           }
201         ],
202         "title": "testfunc"
203       },
204       "pathComponents": [
205         "testfunc"
206       ]
207     },
208     {
209       "accessLevel": "public",
210       "declarationFragments": [
211         {
212           "kind": "typeIdentifier",
213           "preciseIdentifier": "c:v",
214           "spelling": "void"
215         },
216         {
217           "kind": "text",
218           "spelling": " "
219         },
220         {
221           "kind": "identifier",
222           "spelling": "testfunc2"
223         },
224         {
225           "kind": "text",
226           "spelling": "();"
227         }
228       ],
229       "functionSignature": {
230         "returns": [
231           {
232             "kind": "typeIdentifier",
233             "preciseIdentifier": "c:v",
234             "spelling": "void"
235           }
236         ]
237       },
238       "identifier": {
239         "interfaceLanguage": "c",
240         "precise": "c:@F@testfunc2"
241       },
242       "kind": {
243         "displayName": "Function",
244         "identifier": "c.func"
245       },
246       "location": {
247         "position": {
248           "character": 5,
249           "line": 4
250         },
251         "uri": "file://INPUT_DIR/test.h"
252       },
253       "names": {
254         "navigator": [
255           {
256             "kind": "identifier",
257             "spelling": "testfunc2"
258           }
259         ],
260         "subHeading": [
261           {
262             "kind": "identifier",
263             "spelling": "testfunc2"
264           }
265         ],
266         "title": "testfunc2"
267       },
268       "pathComponents": [
269         "testfunc2"
270       ]
271     },
272     {
273       "accessLevel": "public",
274       "declarationFragments": [
275         {
276           "kind": "typeIdentifier",
277           "preciseIdentifier": "c:I",
278           "spelling": "int"
279         },
280         {
281           "kind": "text",
282           "spelling": " "
283         },
284         {
285           "kind": "identifier",
286           "spelling": "main"
287         },
288         {
289           "kind": "text",
290           "spelling": "();"
291         }
292       ],
293       "functionSignature": {
294         "returns": [
295           {
296             "kind": "typeIdentifier",
297             "preciseIdentifier": "c:I",
298             "spelling": "int"
299           }
300         ]
301       },
302       "identifier": {
303         "interfaceLanguage": "c",
304         "precise": "c:@F@main"
305       },
306       "kind": {
307         "displayName": "Function",
308         "identifier": "c.func"
309       },
310       "location": {
311         "position": {
312           "character": 4,
313           "line": 2
314         },
315         "uri": "file://INPUT_DIR/main.c"
316       },
317       "names": {
318         "navigator": [
319           {
320             "kind": "identifier",
321             "spelling": "main"
322           }
323         ],
324         "subHeading": [
325           {
326             "kind": "identifier",
327             "spelling": "main"
328           }
329         ],
330         "title": "main"
331       },
332       "pathComponents": [
333         "main"
334       ]
335     }
336   ]
337 }
338 //--- reference.test.json.in
339 {
340   "metadata": {
341     "formatVersion": {
342       "major": 0,
343       "minor": 5,
344       "patch": 3
345     },
346     "generator": "?"
347   },
348   "module": {
349     "name": "multifile_test",
350     "platform": {
351       "architecture": "x86_64",
352       "operatingSystem": {
353         "name": "macosx"
354       },
355       "vendor": "apple"
356     }
357   },
358   "relationships": [],
359   "symbols": [
360     {
361       "accessLevel": "public",
362       "declarationFragments": [
363         {
364           "kind": "typeIdentifier",
365           "preciseIdentifier": "c:I",
366           "spelling": "int"
367         },
368         {
369           "kind": "text",
370           "spelling": " "
371         },
372         {
373           "kind": "identifier",
374           "spelling": "testfunc"
375         },
376         {
377           "kind": "text",
378           "spelling": "("
379         },
380         {
381           "kind": "typeIdentifier",
382           "preciseIdentifier": "c:I",
383           "spelling": "int"
384         },
385         {
386           "kind": "text",
387           "spelling": " "
388         },
389         {
390           "kind": "internalParam",
391           "spelling": "param1"
392         },
393         {
394           "kind": "text",
395           "spelling": ", "
396         },
397         {
398           "kind": "typeIdentifier",
399           "preciseIdentifier": "c:I",
400           "spelling": "int"
401         },
402         {
403           "kind": "text",
404           "spelling": " "
405         },
406         {
407           "kind": "internalParam",
408           "spelling": "param2"
409         },
410         {
411           "kind": "text",
412           "spelling": ");"
413         }
414       ],
415       "functionSignature": {
416         "parameters": [
417           {
418             "declarationFragments": [
419               {
420                 "kind": "typeIdentifier",
421                 "preciseIdentifier": "c:I",
422                 "spelling": "int"
423               },
424               {
425                 "kind": "text",
426                 "spelling": " "
427               },
428               {
429                 "kind": "internalParam",
430                 "spelling": "param1"
431               }
432             ],
433             "name": "param1"
434           },
435           {
436             "declarationFragments": [
437               {
438                 "kind": "typeIdentifier",
439                 "preciseIdentifier": "c:I",
440                 "spelling": "int"
441               },
442               {
443                 "kind": "text",
444                 "spelling": " "
445               },
446               {
447                 "kind": "internalParam",
448                 "spelling": "param2"
449               }
450             ],
451             "name": "param2"
452           }
453         ],
454         "returns": [
455           {
456             "kind": "typeIdentifier",
457             "preciseIdentifier": "c:I",
458             "spelling": "int"
459           }
460         ]
461       },
462       "identifier": {
463         "interfaceLanguage": "c",
464         "precise": "c:@F@testfunc"
465       },
466       "kind": {
467         "displayName": "Function",
468         "identifier": "c.func"
469       },
470       "location": {
471         "position": {
472           "character": 4,
473           "line": 3
474         },
475         "uri": "file://INPUT_DIR/test.h"
476       },
477       "names": {
478         "navigator": [
479           {
480             "kind": "identifier",
481             "spelling": "testfunc"
482           }
483         ],
484         "subHeading": [
485           {
486             "kind": "identifier",
487             "spelling": "testfunc"
488           }
489         ],
490         "title": "testfunc"
491       },
492       "pathComponents": [
493         "testfunc"
494       ]
495     },
496     {
497       "accessLevel": "public",
498       "declarationFragments": [
499         {
500           "kind": "typeIdentifier",
501           "preciseIdentifier": "c:v",
502           "spelling": "void"
503         },
504         {
505           "kind": "text",
506           "spelling": " "
507         },
508         {
509           "kind": "identifier",
510           "spelling": "testfunc2"
511         },
512         {
513           "kind": "text",
514           "spelling": "();"
515         }
516       ],
517       "functionSignature": {
518         "returns": [
519           {
520             "kind": "typeIdentifier",
521             "preciseIdentifier": "c:v",
522             "spelling": "void"
523           }
524         ]
525       },
526       "identifier": {
527         "interfaceLanguage": "c",
528         "precise": "c:@F@testfunc2"
529       },
530       "kind": {
531         "displayName": "Function",
532         "identifier": "c.func"
533       },
534       "location": {
535         "position": {
536           "character": 5,
537           "line": 4
538         },
539         "uri": "file://INPUT_DIR/test.h"
540       },
541       "names": {
542         "navigator": [
543           {
544             "kind": "identifier",
545             "spelling": "testfunc2"
546           }
547         ],
548         "subHeading": [
549           {
550             "kind": "identifier",
551             "spelling": "testfunc2"
552           }
553         ],
554         "title": "testfunc2"
555       },
556       "pathComponents": [
557         "testfunc2"
558       ]
559     }
560   ]
561 }
562