66using System . Collections . Generic ;
77using System . Diagnostics ;
88using System . Linq ;
9- using System . Linq . Expressions ;
109using System . Runtime . InteropServices ;
1110using System . Text ;
12- using ClangSharp ;
1311using ClangSharp . Interop ;
1412
1513namespace CppAst
@@ -156,29 +154,6 @@ private CppContainerContext GetOrCreateDeclarationContainer(CXCursor cursor, voi
156154 symbol = cppEnum ;
157155 break ;
158156
159- case CXCursorKind . CXCursor_ObjCCategoryDecl :
160- {
161- // Fetch the target class for the category
162- CXCursor parentCursor = default ;
163- cursor . VisitChildren ( ( cxCursor , parent , clientData ) =>
164- {
165- if ( cxCursor . Kind == CXCursorKind . CXCursor_ObjCClassRef )
166- {
167- parentCursor = cxCursor . Referenced ;
168- return CXChildVisitResult . CXChildVisit_Break ;
169- }
170-
171- return CXChildVisitResult . CXChildVisit_Continue ;
172- } , default ) ;
173-
174- var parentContainer = GetOrCreateDeclarationContainer ( parentCursor , data ) . Container ;
175- var targetClass = ( CppClass ) parentContainer ;
176-
177- var category = new CppObjCCategory ( targetClass , CXUtil . GetCursorSpelling ( cursor ) ) ;
178- targetClass . ObjCCategories . Add ( category ) ;
179- symbol = category ;
180- break ;
181- }
182157
183158 case CXCursorKind . CXCursor_ClassTemplate :
184159 case CXCursorKind . CXCursor_ClassTemplatePartialSpecialization :
@@ -187,6 +162,7 @@ private CppContainerContext GetOrCreateDeclarationContainer(CXCursor cursor, voi
187162 case CXCursorKind . CXCursor_UnionDecl :
188163 case CXCursorKind . CXCursor_ObjCInterfaceDecl :
189164 case CXCursorKind . CXCursor_ObjCProtocolDecl :
165+ case CXCursorKind . CXCursor_ObjCCategoryDecl :
190166 var cppClass = new CppClass ( CXUtil . GetCursorSpelling ( cursor ) ) ;
191167 parentDeclarationContainer . Classes . Add ( cppClass ) ;
192168 symbol = cppClass ;
@@ -210,6 +186,33 @@ private CppContainerContext GetOrCreateDeclarationContainer(CXCursor cursor, voi
210186 case CXCursorKind . CXCursor_ObjCProtocolDecl :
211187 cppClass . ClassKind = CppClassKind . ObjCProtocol ;
212188 break ;
189+ case CXCursorKind . CXCursor_ObjCCategoryDecl :
190+ {
191+ cppClass . ClassKind = CppClassKind . ObjCInterfaceCategory ;
192+
193+ // Fetch the target class for the category
194+ CXCursor parentCursor = default ;
195+ cursor . VisitChildren ( ( cxCursor , parent , clientData ) =>
196+ {
197+ if ( cxCursor . Kind == CXCursorKind . CXCursor_ObjCClassRef )
198+ {
199+ parentCursor = cxCursor . Referenced ;
200+ return CXChildVisitResult . CXChildVisit_Break ;
201+ }
202+
203+ return CXChildVisitResult . CXChildVisit_Continue ;
204+ } , default ) ;
205+
206+ var parentContainer = GetOrCreateDeclarationContainer ( parentCursor , data ) . Container ;
207+ var targetClass = ( CppClass ) parentContainer ;
208+ cppClass . ObjCCategoryName = cppClass . Name ;
209+ cppClass . Name = targetClass . Name ;
210+ cppClass . ObjCCategoryTargetClass = targetClass ;
211+
212+ // Link back
213+ targetClass . ObjCCategories . Add ( cppClass ) ;
214+ break ;
215+ }
213216 }
214217
215218 cppClass . IsAbstract = cursor . CXXRecord_IsAbstract ;
@@ -274,24 +277,7 @@ private CppContainerContext GetOrCreateDeclarationContainer(CXCursor cursor, voi
274277 }
275278 else
276279 {
277- cursor . VisitChildren ( ( childCursor , classCursor , clientData ) =>
278- {
279- var tmplParam = TryToCreateTemplateParameters ( childCursor , clientData ) ;
280- if ( tmplParam != null )
281- {
282- cppClass . TemplateParameters . Add ( tmplParam ) ;
283- if ( cppClass . ClassKind == CppClassKind . ObjCInterface ||
284- cppClass . ClassKind == CppClassKind . ObjCProtocol )
285- {
286- cppClass . TemplateKind = CppTemplateKind . ObjCGenericClass ;
287- }
288- else
289- {
290- cppClass . TemplateKind = CppTemplateKind . TemplateClass ;
291- }
292- }
293- return CXChildVisitResult . CXChildVisit_Continue ;
294- } , new CXClientData ( ( IntPtr ) data ) ) ;
280+ AddTemplateParameters ( cursor , cppClass ) ;
295281 }
296282
297283 defaultContainerVisibility = cursor . Kind == CXCursorKind . CXCursor_ClassDecl ? CppVisibility . Private : CppVisibility . Public ;
@@ -320,6 +306,32 @@ private CppContainerContext GetOrCreateDeclarationContainer(CXCursor cursor, voi
320306 return containerContext ;
321307 }
322308
309+ private void AddTemplateParameters ( CXCursor cursor , ICppTemplateOwner templateOwner )
310+ {
311+ cursor . VisitChildren ( ( childCursor , classCursor , clientData ) =>
312+ {
313+ var tmplParam = TryToCreateTemplateParameters ( childCursor , clientData ) ;
314+ if ( tmplParam != null )
315+ {
316+ templateOwner . TemplateParameters . Add ( tmplParam ) ;
317+ if ( templateOwner is CppClass cppClass )
318+ {
319+ if ( cppClass . ClassKind == CppClassKind . ObjCInterface ||
320+ cppClass . ClassKind == CppClassKind . ObjCProtocol )
321+ {
322+ cppClass . TemplateKind = CppTemplateKind . ObjCGenericClass ;
323+ }
324+ else
325+ {
326+ cppClass . TemplateKind = CppTemplateKind . TemplateClass ;
327+ }
328+ }
329+ }
330+
331+ return CXChildVisitResult . CXChildVisit_Continue ;
332+ } , default ) ;
333+ }
334+
323335 private TCppElement GetOrCreateDeclarationContainer < TCppElement > ( CXCursor cursor , void * data , out CppContainerContext context ) where TCppElement : CppElement , ICppContainer
324336 {
325337 context = GetOrCreateDeclarationContainer ( cursor , data ) ;
@@ -406,6 +418,7 @@ private CXChildVisitResult VisitMember(CXCursor cursor, CXCursor parent, void* d
406418 case CXCursorKind . CXCursor_UnionDecl :
407419 case CXCursorKind . CXCursor_ObjCInterfaceDecl :
408420 case CXCursorKind . CXCursor_ObjCProtocolDecl :
421+ case CXCursorKind . CXCursor_ObjCCategoryDecl :
409422 {
410423 bool isAnonymous = cursor . IsAnonymous ;
411424 var cppClass = VisitClassDecl ( cursor , data ) ;
@@ -553,9 +566,6 @@ private CXChildVisitResult VisitMember(CXCursor cursor, CXCursor parent, void* d
553566 cursor . VisitChildren ( VisitMember , new CXClientData ( ( IntPtr ) data ) ) ;
554567 break ;
555568
556- case CXCursorKind . CXCursor_ObjCCategoryDecl :
557- element = VisitObjCCategory ( cursor , data ) ;
558- break ;
559569 case CXCursorKind . CXCursor_ObjCPropertyDecl :
560570 {
561571 var containerContext = GetOrCreateDeclarationContainer ( parent , data ) ;
@@ -599,16 +609,6 @@ private CXChildVisitResult VisitMember(CXCursor cursor, CXCursor parent, void* d
599609 return CXChildVisitResult . CXChildVisit_Continue ;
600610 }
601611
602- private CppElement VisitObjCCategory ( CXCursor cursor , void * data )
603- {
604- var categoryContainer = GetOrCreateDeclarationContainer ( cursor , data ) . Container ;
605- var cppCategory = ( CppObjCCategory ) categoryContainer ;
606- _currentClassBeingVisited = cppCategory . TargetClass ;
607- cursor . VisitChildren ( VisitMember , new CXClientData ( ( IntPtr ) data ) ) ;
608- _currentClassBeingVisited = null ;
609- return cppCategory ;
610- }
611-
612612 private CppComment GetComment ( CXCursor cursor )
613613 {
614614 var cxComment = cursor . ParsedComment ;
0 commit comments