@@ -86,22 +86,24 @@ namespace architect
86
86
public:
87
87
VisitorContext (Registry *registry, Namespace *nameSpace);
88
88
89
- VisitorContext setReferenceType (ReferenceType referenceType);
89
+ VisitorContext setReferenceType (ReferenceType referenceType) const ;
90
90
91
91
VisitorContext declareNameSpace (const CXCursor &cursor);
92
92
93
- VisitorContext declareGlobal (const CXCursor &cursor);
93
+ VisitorContext declareGlobal (const CXCursor &cursor, bool isTemplate, bool &wasDefined );
94
94
95
- VisitorContext declareRecord (const CXCursor &cursor);
95
+ VisitorContext declareRecord (const CXCursor &cursor, bool isTemplate, bool &wasDefined);
96
+
97
+ VisitorContext declareTemplateParameter (const CXCursor &cursor);
96
98
97
99
VisitorContext declareTypedef (const CXCursor &cursor);
98
100
99
101
void declareReference (const CXCursor &cursor, const CXCursor &referenceCursor);
100
102
101
103
private:
102
- Symbol *getSymbol (const CXCursor &cursor, SymbolIdentifier &identifier);
104
+ Symbol *getSymbol (const CXCursor &cursor, SymbolIdentifier &identifier) const ;
103
105
104
- Symbol *declareSymbol (SymbolType symbolType, const CXCursor &cursor, const CXCursor &referenceCursor);
106
+ Symbol *declareSymbol (SymbolType symbolType, const CXCursor &cursor, const CXCursor &referenceCursor, bool &wasDefined );
105
107
106
108
static CXChildVisitResult nameSpaceVisitor (CXCursor cursor, CXCursor parent, CXClientData clientData);
107
109
@@ -110,6 +112,7 @@ namespace architect
110
112
Symbol *_currentSymbol;
111
113
ReferenceType _referenceType;
112
114
bool _inRecord;
115
+ bool _inTemplateParameter;
113
116
};
114
117
115
118
VisitorContext::VisitorContext (Registry *registry, Namespace *ns)
@@ -118,9 +121,10 @@ namespace architect
118
121
, _currentSymbol(nullptr )
119
122
, _referenceType(ReferenceType::ASSOCIATION)
120
123
, _inRecord(false )
124
+ , _inTemplateParameter(false )
121
125
{}
122
126
123
- VisitorContext VisitorContext::setReferenceType (ReferenceType referenceType)
127
+ VisitorContext VisitorContext::setReferenceType (ReferenceType referenceType) const
124
128
{
125
129
VisitorContext subContext (*this );
126
130
subContext._referenceType = referenceType;
@@ -140,34 +144,49 @@ namespace architect
140
144
return subContext;
141
145
}
142
146
143
- VisitorContext VisitorContext::declareGlobal (const CXCursor &cursor)
147
+ VisitorContext VisitorContext::declareGlobal (const CXCursor &cursor, bool isTemplate, bool &wasDefined )
144
148
{
145
149
VisitorContext subContext (*this );
146
150
subContext._referenceType = ReferenceType::ASSOCIATION;
147
151
148
152
if (!_inRecord)
149
153
{
150
- Symbol *symbol = declareSymbol (SymbolType::GLOBAL, cursor, cursor);
154
+ Symbol *symbol = declareSymbol (isTemplate ? SymbolType::GLOBAL_TEMPLATE : SymbolType:: GLOBAL, cursor, cursor, wasDefined );
151
155
subContext._currentSymbol = symbol;
152
156
}
153
157
154
158
return subContext;
155
159
}
156
160
157
- VisitorContext VisitorContext::declareRecord (const CXCursor &cursor)
161
+ VisitorContext VisitorContext::declareRecord (const CXCursor &cursor, bool isTemplate, bool &wasDefined )
158
162
{
159
- Symbol *symbol = declareSymbol (SymbolType::RECORD, cursor, cursor);
163
+ Symbol *symbol = declareSymbol (isTemplate ? SymbolType::RECORD_TEMPLATE : SymbolType:: RECORD, cursor, cursor, wasDefined );
160
164
161
165
VisitorContext subContext (*this );
162
166
subContext._currentSymbol = symbol;
163
167
subContext._referenceType = ReferenceType::COMPOSITION;
164
168
subContext._inRecord = true ;
165
169
return subContext;
166
170
}
171
+
172
+ VisitorContext VisitorContext::declareTemplateParameter (const CXCursor &cursor)
173
+ {
174
+ if (_inTemplateParameter)
175
+ return *this ;
176
+
177
+ auto name = clang_getCString (clang_getCursorSpelling (cursor));
178
+ _currentSymbol->templateParameters .push_back (name);
179
+
180
+ VisitorContext subContext (*this );
181
+ subContext._referenceType = ReferenceType::ASSOCIATION;
182
+ subContext._inTemplateParameter = true ;
183
+ return subContext;
184
+ }
167
185
168
186
VisitorContext VisitorContext::declareTypedef (const CXCursor &cursor)
169
187
{
170
- Symbol *symbol = declareSymbol (SymbolType::TYPEDEF, cursor, cursor);
188
+ bool wasDefined;
189
+ Symbol *symbol = declareSymbol (SymbolType::TYPEDEF, cursor, cursor, wasDefined);
171
190
172
191
VisitorContext subContext (*this );
173
192
subContext._currentSymbol = symbol;
@@ -190,7 +209,7 @@ namespace architect
190
209
}
191
210
}
192
211
193
- Symbol *VisitorContext::getSymbol (const CXCursor &cursor, SymbolIdentifier &identifier)
212
+ Symbol *VisitorContext::getSymbol (const CXCursor &cursor, SymbolIdentifier &identifier) const
194
213
{
195
214
CXType type = clang_getCursorType (cursor);
196
215
@@ -241,19 +260,23 @@ namespace architect
241
260
return nullptr ;
242
261
}
243
262
244
- Symbol *VisitorContext::declareSymbol (SymbolType symbolType, const CXCursor &cursor, const CXCursor &referenceCursor)
263
+ Symbol *VisitorContext::declareSymbol (SymbolType symbolType, const CXCursor &cursor, const CXCursor &referenceCursor, bool &wasDefined )
245
264
{
246
265
SymbolIdentifier identifier;
247
266
Symbol *symbol = getSymbol (cursor, identifier);
248
267
if (!symbol)
249
268
{
250
- symbol = _registry->createSymbol (symbolType);
269
+ symbol = _registry->createSymbol (symbolType, false );
251
270
symbol->identifier = identifier;
252
271
symbol->ns = _currentNameSpace;
253
272
254
273
_currentNameSpace->symbols .insert (std::pair<SymbolIdentifier, Symbol *>(identifier, symbol));
255
274
}
256
275
276
+ wasDefined = symbol->defined ;
277
+ if (clang_isCursorDefinition (cursor))
278
+ symbol->defined = true ;
279
+
257
280
if (_currentSymbol && symbol != _currentSymbol)
258
281
{
259
282
Reference reference;
@@ -279,10 +302,12 @@ namespace architect
279
302
return CXChildVisit_Continue;
280
303
}
281
304
305
+ CXChildVisitResult functionVisitor (CXCursor cursor, CXCursor parent, CXClientData clientData);
282
306
CXChildVisitResult globalVisitor (CXCursor cursor, CXCursor parent, CXClientData clientData);
283
307
284
308
bool handleReference (CXCursor &cursor, VisitorContext &context)
285
309
{
310
+ auto name = clang_getCString (clang_getCursorSpelling (cursor));
286
311
CXCursorKind kind = clang_getCursorKind (cursor);
287
312
switch (kind)
288
313
{
@@ -293,9 +318,7 @@ namespace architect
293
318
CXCursor referencedCursor = clang_getCursorReferenced (cursor);
294
319
if (!clang_Cursor_isNull (referencedCursor))
295
320
{
296
- VisitorContext subContext = context.setReferenceType (ReferenceType::TEMPLATE);
297
- // subContext.declareReference(referencedCursor, cursor);
298
- globalVisitor (referencedCursor, cursor, &subContext);
321
+ globalVisitor (referencedCursor, cursor, &context);
299
322
}
300
323
}
301
324
break ;
@@ -314,6 +337,15 @@ namespace architect
314
337
break ;
315
338
}
316
339
340
+ case CXCursor_TemplateTypeParameter:
341
+ case CXCursor_NonTypeTemplateParameter:
342
+ case CXCursor_TemplateTemplateParameter:
343
+ {
344
+ VisitorContext subContext = context.declareTemplateParameter (cursor);
345
+ clang_visitChildren (cursor, functionVisitor, &subContext);
346
+ break ;
347
+ }
348
+
317
349
default :
318
350
return false ;
319
351
}
@@ -327,6 +359,7 @@ namespace architect
327
359
if (handleReference (cursor, context))
328
360
return CXChildVisit_Continue;
329
361
362
+ auto name = clang_getCString (clang_getCursorSpelling (cursor));
330
363
CXCursorKind kind = clang_getCursorKind (cursor);
331
364
switch (kind)
332
365
{
@@ -347,6 +380,7 @@ namespace architect
347
380
if (handleReference (cursor, context))
348
381
return CXChildVisit_Continue;
349
382
383
+ auto name = clang_getCString (clang_getCursorSpelling (cursor));
350
384
CXCursorKind kind = clang_getCursorKind (cursor);
351
385
switch (kind)
352
386
{
@@ -363,8 +397,10 @@ namespace architect
363
397
case CXCursor_StructDecl:
364
398
case CXCursor_UnionDecl:
365
399
{
366
- VisitorContext subContext = context.declareRecord (cursor);
367
- clang_visitChildren (cursor, globalVisitor, &subContext);
400
+ bool wasDefined;
401
+ VisitorContext subContext = context.declareRecord (cursor, kind == CXCursor_ClassTemplate, wasDefined);
402
+ if (!wasDefined)
403
+ clang_visitChildren (cursor, globalVisitor, &subContext);
368
404
break ;
369
405
}
370
406
@@ -376,10 +412,13 @@ namespace architect
376
412
}
377
413
378
414
case CXCursor_FunctionDecl:
415
+ case CXCursor_FunctionTemplate:
379
416
case CXCursor_VarDecl:
380
417
{
381
- VisitorContext subContext = context.declareGlobal (cursor);
382
- clang_visitChildren (cursor, functionVisitor, &subContext);
418
+ bool wasDefined;
419
+ VisitorContext subContext = context.declareGlobal (cursor, kind == CXCursor_FunctionTemplate, wasDefined);
420
+ if (!wasDefined)
421
+ clang_visitChildren (cursor, functionVisitor, &subContext);
383
422
break ;
384
423
}
385
424
0 commit comments