xref: /llvm-project/clang/test/ExtractAPI/method_template_spec.cpp (revision 7a6747939218efbe3b1d2cc0f896dfa97c0ff40f)
1 // RUN: rm -rf %t
2 // RUN: split-file %s %t
3 // RUN: sed -e "s@INPUT_DIR@%{/t:regex_replacement}@g" \
4 // RUN: %t/reference.output.json.in >> %t/reference.output.json
5 // RUN: %clang_cc1 -extract-api --pretty-sgf -triple arm64-apple-macosx \
6 // RUN:   -x c++-header %t/input.h -o %t/output.json -verify
7 
8 // Generator version is not consistent across test runs, normalize it.
9 // RUN: sed -e "s@\"generator\": \".*\"@\"generator\": \"?\"@g" \
10 // RUN: %t/output.json >> %t/output-normalized.json
11 // RUN: diff %t/reference.output.json %t/output-normalized.json
12 
13 //--- input.h
14 class Foo {
15   template<typename T> void Bar(T Fizz);
16 
17   template<> void Bar<int>(int Fizz);
18 };
19 
20 /// expected-no-diagnostics
21 
22 //--- reference.output.json.in
23 {
24   "metadata": {
25     "formatVersion": {
26       "major": 0,
27       "minor": 5,
28       "patch": 3
29     },
30     "generator": "?"
31   },
32   "module": {
33     "name": "",
34     "platform": {
35       "architecture": "arm64",
36       "operatingSystem": {
37         "minimumVersion": {
38           "major": 11,
39           "minor": 0,
40           "patch": 0
41         },
42         "name": "macosx"
43       },
44       "vendor": "apple"
45     }
46   },
47   "relationships": [
48     {
49       "kind": "memberOf",
50       "source": "c:@S@Foo@FT@>1#TBar#t0.0#v#",
51       "target": "c:@S@Foo",
52       "targetFallback": "Foo"
53     },
54     {
55       "kind": "memberOf",
56       "source": "c:@S@Foo@F@Bar<#I>#I#",
57       "target": "c:@S@Foo",
58       "targetFallback": "Foo"
59     }
60   ],
61   "symbols": [
62     {
63       "accessLevel": "public",
64       "declarationFragments": [
65         {
66           "kind": "keyword",
67           "spelling": "class"
68         },
69         {
70           "kind": "text",
71           "spelling": " "
72         },
73         {
74           "kind": "identifier",
75           "spelling": "Foo"
76         },
77         {
78           "kind": "text",
79           "spelling": ";"
80         }
81       ],
82       "identifier": {
83         "interfaceLanguage": "c++",
84         "precise": "c:@S@Foo"
85       },
86       "kind": {
87         "displayName": "Class",
88         "identifier": "c++.class"
89       },
90       "location": {
91         "position": {
92           "character": 6,
93           "line": 0
94         },
95         "uri": "file://INPUT_DIR/input.h"
96       },
97       "names": {
98         "navigator": [
99           {
100             "kind": "identifier",
101             "spelling": "Foo"
102           }
103         ],
104         "subHeading": [
105           {
106             "kind": "identifier",
107             "spelling": "Foo"
108           }
109         ],
110         "title": "Foo"
111       },
112       "pathComponents": [
113         "Foo"
114       ]
115     },
116     {
117       "accessLevel": "private",
118       "declarationFragments": [
119         {
120           "kind": "keyword",
121           "spelling": "template"
122         },
123         {
124           "kind": "text",
125           "spelling": " <"
126         },
127         {
128           "kind": "keyword",
129           "spelling": "typename"
130         },
131         {
132           "kind": "text",
133           "spelling": " "
134         },
135         {
136           "kind": "genericParameter",
137           "spelling": "T"
138         },
139         {
140           "kind": "text",
141           "spelling": "> "
142         },
143         {
144           "kind": "typeIdentifier",
145           "preciseIdentifier": "c:v",
146           "spelling": "void"
147         },
148         {
149           "kind": "text",
150           "spelling": " "
151         },
152         {
153           "kind": "identifier",
154           "spelling": "Bar"
155         },
156         {
157           "kind": "text",
158           "spelling": "("
159         },
160         {
161           "kind": "typeIdentifier",
162           "preciseIdentifier": "c:t0.0",
163           "spelling": "T"
164         },
165         {
166           "kind": "text",
167           "spelling": " "
168         },
169         {
170           "kind": "internalParam",
171           "spelling": "Fizz"
172         },
173         {
174           "kind": "text",
175           "spelling": ");"
176         }
177       ],
178       "functionSignature": {
179         "parameters": [
180           {
181             "declarationFragments": [
182               {
183                 "kind": "typeIdentifier",
184                 "preciseIdentifier": "c:t0.0",
185                 "spelling": "T"
186               },
187               {
188                 "kind": "text",
189                 "spelling": " "
190               },
191               {
192                 "kind": "internalParam",
193                 "spelling": "Fizz"
194               }
195             ],
196             "name": "Fizz"
197           }
198         ],
199         "returns": [
200           {
201             "kind": "typeIdentifier",
202             "preciseIdentifier": "c:v",
203             "spelling": "void"
204           }
205         ]
206       },
207       "identifier": {
208         "interfaceLanguage": "c++",
209         "precise": "c:@S@Foo@FT@>1#TBar#t0.0#v#"
210       },
211       "kind": {
212         "displayName": "Method Template",
213         "identifier": "c++.method"
214       },
215       "location": {
216         "position": {
217           "character": 28,
218           "line": 1
219         },
220         "uri": "file://INPUT_DIR/input.h"
221       },
222       "names": {
223         "navigator": [
224           {
225             "kind": "identifier",
226             "spelling": "Bar"
227           }
228         ],
229         "subHeading": [
230           {
231             "kind": "identifier",
232             "spelling": "Bar"
233           }
234         ],
235         "title": "Bar"
236       },
237       "pathComponents": [
238         "Foo",
239         "Bar"
240       ],
241       "swiftGenerics": {
242         "parameters": [
243           {
244             "depth": 0,
245             "index": 0,
246             "name": "T"
247           }
248         ]
249       }
250     },
251     {
252       "accessLevel": "private",
253       "declarationFragments": [
254         {
255           "kind": "keyword",
256           "spelling": "template"
257         },
258         {
259           "kind": "text",
260           "spelling": " <> "
261         },
262         {
263           "kind": "typeIdentifier",
264           "preciseIdentifier": "c:v",
265           "spelling": "void"
266         },
267         {
268           "kind": "text",
269           "spelling": " "
270         },
271         {
272           "kind": "identifier",
273           "spelling": "Bar"
274         },
275         {
276           "kind": "text",
277           "spelling": "<"
278         },
279         {
280           "kind": "typeIdentifier",
281           "preciseIdentifier": "c:I",
282           "spelling": "int"
283         },
284         {
285           "kind": "text",
286           "spelling": ">("
287         },
288         {
289           "kind": "typeIdentifier",
290           "preciseIdentifier": "c:I",
291           "spelling": "int"
292         },
293         {
294           "kind": "text",
295           "spelling": " "
296         },
297         {
298           "kind": "internalParam",
299           "spelling": "Fizz"
300         },
301         {
302           "kind": "text",
303           "spelling": ");"
304         }
305       ],
306       "functionSignature": {
307         "parameters": [
308           {
309             "declarationFragments": [
310               {
311                 "kind": "typeIdentifier",
312                 "preciseIdentifier": "c:I",
313                 "spelling": "int"
314               },
315               {
316                 "kind": "text",
317                 "spelling": " "
318               },
319               {
320                 "kind": "internalParam",
321                 "spelling": "Fizz"
322               }
323             ],
324             "name": "Fizz"
325           }
326         ],
327         "returns": [
328           {
329             "kind": "typeIdentifier",
330             "preciseIdentifier": "c:v",
331             "spelling": "void"
332           }
333         ]
334       },
335       "identifier": {
336         "interfaceLanguage": "c++",
337         "precise": "c:@S@Foo@F@Bar<#I>#I#"
338       },
339       "kind": {
340         "displayName": "Method Template Specialization",
341         "identifier": "c++.method"
342       },
343       "location": {
344         "position": {
345           "character": 18,
346           "line": 3
347         },
348         "uri": "file://INPUT_DIR/input.h"
349       },
350       "names": {
351         "navigator": [
352           {
353             "kind": "identifier",
354             "spelling": "Bar"
355           }
356         ],
357         "subHeading": [
358           {
359             "kind": "identifier",
360             "spelling": "Bar"
361           }
362         ],
363         "title": "Bar"
364       },
365       "pathComponents": [
366         "Foo",
367         "Bar"
368       ]
369     }
370   ]
371 }
372