<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Mar 29, 2013 at 1:46 AM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi!<div><br></div><div><div class="gmail_quote"><div class="im">
On Thu, Mar 28, 2013 at 5:29 AM, Abir Basak <span dir="ltr"><<a href="mailto:abirbasak@gmail.com" target="_blank">abirbasak@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir="ltr"><div>I am new to clang ast, and trying to parse some c++ code with it.</div><div><br></div>When I am using TypedefDecl->getSourceRange() for say<div>typedef long double LDBL it returns the whole thing </div>


<div>However when I am using TypeAliasDecl->getSourceRange() for say</div><div>using LDBL = long double</div><div>it only returns the range using LDBL = long. (i.e removes the double part)</div><div>
<br></div><div>I used the code below to extract text from SourceRange</div><div><div>char const* first = sm.getCharacterData(r.getBegin()); </div><div> char const* last = sm.getCharacterData(pp.getLocForEndOfToken(r.getEnd()));</div>


<div> return std::string(first,last);</div></div></div></blockquote><div><br></div></div><div>The problem here is that BuiltinTypeLoc doesn't store the source locations for every keyword in the type, just for (apparently) the first one. Consequently, BuiltinTypeLoc::getLocalSourceRange() always returns a one-keyword range, and TypeAliasDecl::getSourceRange() picks the end of that range as the end of the declaration.<br>

 </div><div class="im"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div>Am I doing something wrong? How can I get the whole source range, and esp the type part of it i.e. long double part, so that I can rearrange it as typedef long double LDBL</div>


</div><div>I am using clang 3.2 with RAV</div></div></blockquote><div><br></div></div><div>We should fix BuiltinTypeLoc to track the end location in the needsExtraLocalData() case. If you want a workaround for this, you could re-lex tokens from the end location until you hit a semicolon (this is imperfect in the presence of macros, but your code isn't robust against macro expansions within the alias declaration anyway, so this may be enough for your purposes) -- or even just scan through the character data until you hit a semicolon if you're not concerned about comments at the end of the declaration.</div>

</div></div>
</blockquote></div><br>Thanks for the explanation.</div><div class="gmail_extra" style>I fixed it by traversing until a semicolon,and getting the full type as text. I guess I can fix it using needsExtraLocalData, like the ASTWriter.cpp does. </div>
<div class="gmail_extra" style> I have a second problem. Given a TypeLoc, how can I find whether it is in base class specifier list?</div><div class="gmail_extra" style> e.g. </div><div class="gmail_extra" style>   struct x{};</div>
<div class="gmail_extra" style>   struct y: x{};</div><div class="gmail_extra" style>   void foo()</div><div class="gmail_extra" style>{</div><div class="gmail_extra" style>   x a;</div><div class="gmail_extra" style>}</div>
<div class="gmail_extra" style>I can do so by traversing RecordDecl, but I like to do it in reverse way, as I want to rewrite that case differently from all other cases.</div><div class="gmail_extra" style><br></div><div class="gmail_extra" style>
Thanks.<br><br>
</div></div>