<font size=2 face="sans-serif">Hello everybody,</font>
<br>
<br><font size=2 face="sans-serif">I have started to use libtooling to
write some software that can parse a c++ header in order to generate automatic
code used in a SDK. In order to do this I have implemented RecursiveASTVisitor
and its virtual member function VisitFunctionDecl. In VisitFunctionDecl
i collect all kinds of data from the Function prototype in order to expand
the string templates in the code Id like to generate. When sorting through
the parameter declarations I'm experiencing difficulties in uniquely identifying
some of the class types. Whereas it is quite clear how to handle builtin
types and enumerals I am struggling with class types. Heres an example
of a prototype that i am visiting:</font>
<br>
<br><font size=2 face="sans-serif"><b>CallResult ExampleApiCall(std::vector<std::string>
&outputVector);</b></font>
<br>
<br><font size=2 face="sans-serif">Now I am interested in identifying the
exact type of the LValue <b>outputVector</b>. What I have been able to
do up until now is check if the desugared type pointer is a class type.
This is straight forward. Once I know it is a class type such as in the
above example I am interested in its unique class type. Up until now all
i could manage to do retrieve the CXXRecordDecl from the type im looking
at. Now I can find out the kind name and qualified name string of this
class which is <b>vector</b>. So naively spoken i can string compare (which
I dont want to really) the unqualified name with the string "vector"
and I'd now that I am looking at a vector type. I am also interested in
knowing what type of vector container this is though as I will generate
different code depending on what is in the container. This, I have not
been able to find out yet. How can I access the specified template parameter?
One of the things I tried was </font>
<br>
<br><font size=2 face="sans-serif"><b>const ClassTemplateSpecializationDecl
*cltmplsdcl = desugaredType->getAs<ClassTemplateSpecializationDecl>();</b></font>
<br>
<br><font size=2 face="sans-serif">but to no avail. Maybe Im barking up
the completely wrong tree here, my experience with clang AST is very limited.
I'd appreciate any help and ideas from the community. Thanks a lot!</font>
<br>
<br><font size=2 face="sans-serif">Here's an excerpt of the code Im using
right now in VisitFunctionDecl :</font>
<br>
<br><font size=2 color=#0000e0 face="sans-serif">       
// desugar the parameter qualifier type</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
const QualType desugaredQualType = parmQualType.getCanonicalType().getTypePtr()->getPointeeType();</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
// get the desugared type pointer</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
const Type *desugaredType = desugaredQualType.getTypePtr();</font>
<br>
<br><font size=2 color=#0000e0 face="sans-serif">       
// handle class types</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
if(desugaredType->isClassType()) {</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    // get the class type</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    const CXXRecordDecl *cxxrcdcl = desugaredType->getAsCXXRecordDecl();</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    if(nullptr == cxxrcdcl</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    ) {</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
        cout << "Could not cast class type
to CXXRecordDecl" << endl;</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
        return hdt_CXXRecord_NA;</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    }</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    // some cxx record decl tests ---> this gets me the class
type but not the template specification</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    cout << "cxxrcdcl->getKindName(): " <<
cxxrcdcl->getKindName() << endl;</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    cout << "cxxrcdcl->getQualifiedNameAsString():
" << cxxrcdcl->getQualifiedNameAsString() << endl;</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
    return hdt_CXXRecord_NA;</font>
<br><font size=2 color=#0000e0 face="sans-serif">       
}</font><font size=2 face="sans-serif"><br>
</font>
<br><font size=2 face="Arial">Cheers,<br>
</font>
<br><font size=2 color=#808080 face="Arial"><b>Benjamin Fabricius</b><br>
Software Engineer<br>
<br>
Leica Geosystems AG, part of Hexagon<br>
Machine Control Division<br>
Heinrich-Wild-Strasse<br>
9435 Heerbrugg, Switzerland<br>
Skype: b.fabricius</font><a href=skype:b.fabricius?chat><img src=cid:_1_0CED8E580CED886800405103C1257C07></a><font size=2 color=#808080 face="Arial"><br>
Phone: +41 71 727 3407<br>
E-Mail: </font><a href="mailto:benjamin.fabricius@leica-geosystems.com"><font size=2 color=blue face="Arial"><u>benjamin.fabricius@leica-geosystems.com</u></font></a><font size=2 color=#808080 face="Arial"><br>
Website: </font><a href="http://www.leica-geosystems.com/"><font size=2 color=blue face="Arial"><u>http://www.leica-geosystems.com</u></font></a><font size=2 color=#808080 face="Arial"><br>
<br>
Social Networks: </font><a href="http://www.facebook.com/LeicaGeosystems?ref=ts"><img src=cid:_1_0CEE2C1C0CED886800405103C1257C07></a><a href=http://twitter.com/#!/LeicaGeosystems><img src=cid:_1_0CEE2E200CED886800405103C1257C07></a><a href="http://www.youtube.com/user/LeicaGeosystemsCH?feature=mhum"><img src=cid:_1_0CEE30240CED886800405103C1257C07></a><font size=2 color=#808080 face="Arial"><br>
</font><font size=2 color=blue face="Arial"><u><br>
</u></font><a href="http://www.leica-geosystems.com/"><img src=cid:_1_0CEE32280CED886800405103C1257C07></a><font size=2 color=#808080 face="Arial"><br>
</font>