@@ -297,11 +297,44 @@ private CppClass VisitClassDecl(CXCursor cursor, void* data)
297297 return cppStruct ;
298298 }
299299
300+ private CppFunction VisitUsing ( CXCursor cursor , CXCursor parent , void * data )
301+ {
302+ var contextContainer = GetOrCreateDeclarationContainer ( cursor . SemanticParent , data ) ;
303+ var container = contextContainer . DeclarationContainer ;
304+
305+ if ( container == null )
306+ {
307+ WarningUnhandled ( cursor , parent ) ;
308+ return null ;
309+ }
310+
311+ cursor . VisitChildren ( ( childCursor , funcCursor , clientData ) =>
312+ {
313+ // Please note that this is not the complete using implementation,
314+ // it only works with constructors
315+ if ( childCursor . Kind == CXCursorKind . CXCursor_OverloadedDeclRef )
316+ {
317+ // We simply copy the overloaded functions into the current class
318+ for ( uint i = 0 ; i < childCursor . NumOverloadedDecls ; i ++ )
319+ {
320+ VisitFunctionDecl ( cursor , childCursor . GetOverloadedDecl ( i ) , parent , clientData ) ;
321+ }
322+ return CXChildVisitResult . CXChildVisit_Break ;
323+ }
324+ return CXChildVisitResult . CXChildVisit_Continue ;
325+ } , new CXClientData ( ( IntPtr ) data ) ) ;
326+
327+ return null ;
328+ }
329+
300330 private CXChildVisitResult VisitMember ( CXCursor cursor , CXCursor parent , void * data )
301331 {
302332 CppElement element = null ;
303333 switch ( cursor . Kind )
304334 {
335+ case CXCursorKind . CXCursor_UsingDeclaration :
336+ element = VisitUsing ( cursor , parent , data ) ;
337+ break ;
305338 case CXCursorKind . CXCursor_FieldDecl :
306339 case CXCursorKind . CXCursor_VarDecl :
307340 {
@@ -390,7 +423,7 @@ private CXChildVisitResult VisitMember(CXCursor cursor, CXCursor parent, void* d
390423 case CXCursorKind . CXCursor_FunctionDecl :
391424 case CXCursorKind . CXCursor_Constructor :
392425 case CXCursorKind . CXCursor_CXXMethod :
393- element = VisitFunctionDecl ( cursor , parent , data ) ;
426+ element = VisitFunctionDecl ( cursor , cursor , parent , data ) ;
394427 break ;
395428
396429 case CXCursorKind . CXCursor_UsingDirective :
@@ -1212,43 +1245,47 @@ private static CppStorageQualifier GetStorageQualifier(CXCursor cursor)
12121245 return CppStorageQualifier . None ;
12131246 }
12141247
1215- private CppFunction VisitFunctionDecl ( CXCursor cursor , CXCursor parent , void * data )
1248+ private CppFunction VisitFunctionDecl ( CXCursor destinationCursor , CXCursor cursor , CXCursor parent , void * data )
12161249 {
1250+ var destinationContextContainer = GetOrCreateDeclarationContainer ( destinationCursor . SemanticParent , data ) ;
1251+ var destinationContainer = destinationContextContainer . DeclarationContainer ;
12171252 var contextContainer = GetOrCreateDeclarationContainer ( cursor . SemanticParent , data ) ;
12181253 var container = contextContainer . DeclarationContainer ;
12191254
1220- if ( container == null )
1255+ if ( destinationContainer == null || container == null )
12211256 {
12221257 WarningUnhandled ( cursor , parent ) ;
12231258 return null ;
12241259 }
12251260
1226- var functionName = GetCursorSpelling ( cursor ) ;
1261+ // This (not using 'cursor', but 'destinationCursor') is only used when we pulling in constructors from Foo, into Bar
1262+ // We are renaming effectively the pulled in 'Foo' constructor into 'Bar'
1263+ var functionName = GetCursorSpelling ( destinationCursor ) ;
12271264
12281265 //We need ignore the function define out in the class definition here(Otherwise it will has two same functions here~)!
1229- var semKind = cursor . SemanticParent . Kind ;
1266+ var semKind = destinationCursor . SemanticParent . Kind ;
12301267 if ( ( semKind == CXCursorKind . CXCursor_StructDecl || semKind == CXCursorKind . CXCursor_ClassDecl )
1231- && cursor . LexicalParent != cursor . SemanticParent )
1268+ && destinationCursor . LexicalParent != destinationCursor . SemanticParent )
12321269 {
12331270 return null ;
12341271 }
12351272
12361273 var cppFunction = new CppFunction ( functionName )
12371274 {
1238- Visibility = contextContainer . CurrentVisibility ,
1275+ Visibility = destinationContextContainer . CurrentVisibility ,
12391276 StorageQualifier = GetStorageQualifier ( cursor ) ,
12401277 LinkageKind = GetLinkage ( cursor . Linkage ) ,
12411278 } ;
12421279
12431280 if ( cursor . Kind == CXCursorKind . CXCursor_Constructor )
12441281 {
1245- var cppClass = ( CppClass ) container ;
1282+ var cppClass = ( CppClass ) destinationContainer ;
12461283 cppFunction . IsConstructor = true ;
12471284 cppClass . Constructors . Add ( cppFunction ) ;
12481285 }
12491286 else
12501287 {
1251- container . Functions . Add ( cppFunction ) ;
1288+ destinationContainer . Functions . Add ( cppFunction ) ;
12521289 }
12531290
12541291 if ( cursor . kind == CXCursorKind . CXCursor_FunctionTemplate )
0 commit comments