CXCursor children for class template specialization


I’m using the Python libclang bindings for an experimental pybind11 binding generator for a large C++ library. All is working pretty well except template specializations and I’m wondering if there is a better way. When a type is defined from a template (e.g., typedef TemplateA TypeB), the cursor is a TYPEDEF_DECL and does not have any children except the template reference and the parameters. When I get the underlying/canonical type (TemplateA) it is recognized as a CLASS_DECL but it doesn’t have any children (no access to constructors, methods, etc.). The only way I am currently able to get this information is using “clang_getSpecializedCursorTemplate” which ultimately returns the class template cursor with all its children, but the template parameters are used instead of the specialized type (i.e., “TheItemType” instead of TypeA in this example). I’m generating the binding code using the raw class template then doing a string find/replace of the template parameters with the actual types. That isn’t too bad but has gotten pretty challenging if the class template itself references other templates and on and on.

What I’d really love is a way to get the template specialization to essentially behave the same as a regular class declaration. That is, the cursor for either the typedef or the underlying/canonical type (which already seems to be recognized as a class declaration) to give access to the children of the class template but with all the template parameters already in place.

Is this possible or is there a better way? I’ve looked at the “clang_getSpecializedCursorTemplate” source in /tools/libclang/CIndexCXX.cpp and thought maybe I can cast the typedef declaration to the CXXRecordDecl and then return that as a cursor?

Thanks for the support.