[cfe-dev] CXCursor children for class template specialization

Trevor Laughlin via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 13 06:30:15 PST 2017



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<TypeA> 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<TypeA>) 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.




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171113/82fa826b/attachment.html>

More information about the cfe-dev mailing list