<div style="font-family: arial, helvetica, sans-serif"><font size="2"><div class="gmail_quote">On Wed, Jun 20, 2012 at 12:39 PM, Felix Schmitt <span dir="ltr"><<a href="mailto:felix.schmitt@zih.tu-dresden.de" target="_blank">felix.schmitt@zih.tu-dresden.de</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Manuel Klimek <klimek@...> writes:<br>
<br>
><br>
> On Tue, Jun 19, 2012 at 3:22 PM, Felix Schmitt <felix.schmitt <at><br>
<a href="http://zih.tu-dresden.de" target="_blank">zih.tu-dresden.de</a>> wrote:<br>
<div><div class="h5">><br>
> Manuel Klimek <klimek <at> ...> writes:<br>
> ><br>
> > On Tue, Jun 19, 2012 at 2:34 PM, Felix Schmitt<br>
><br>
> <felix.schmitt <at> <a href="http://zih.tu-dresden.de" target="_blank">zih.tu-dresden.de</a>> wrote:<br>
> > Hi,<br>
> > I got the following problem:<br>
> > I need to traverse the AST (currently using<br>
> RecursiveASTVisitor) and get the<br>
> > file name for every function declaration.<br>
> > Currently, I only get the filename for function<br>
> declarations in my main file but<br>
> > how do I get these for functions in #included files?<br>
> > My relevant code looks like this (srcMgr is the<br>
> SourceManager):<br>
> > bool CMyASTVisitor::VisitFunctionDecl(FunctionDecl*<br>
> decl)<br>
> > {<br>
> > ...<br>
> > const FileEntry* file_entry =<br>
> > srcMgr.getFileEntryForID(srcMgr.getFileID(decl-<br>
> >getLocStart()));<br>
> > if (file_entry == NULL)<br>
> >    std::cout << "no file entry" << std::endl;<br>
> > ...<br>
> > }<br>
> > Is there a way to get these filenames?<br>
> ><br>
> ><br>
> > Why does file_entry->getName() not work?<br>
> ><br>
> Because file_entry is NULL if the declaration found is<br>
> not in<br>
> the main file but from an included file in the main file.<br>
><br>
><br>
> That's news to me - the only place where I've found<br>
file_entry to be NULL is<br>
for token-pasted code, for example from macro expansions.<br>
><br>
<br>
</div></div>You are right, but this happened to be the case for me<br>
(I tested with /usr/include/math.h, which does a lot of<br>
nasty stuff). The solution is using this code instead:<br>
<br>
<br>
SourceLocation loc = srcMgr.getFileLoc(decl->getLocation());<br></blockquote><div><br></div><div>Yep, if that's your problem getFileLoc or getExpansionLoc are what you want.</div><div><br></div><div>Cheers,</div><div>
/Manuel</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
std::pair<FileID, unsigned> loc_info =<br>
  srcMgr.getDecomposedLoc(loc);<br>
FileID file_id = loc_info.first;<br>
const FileEntry* file_entry =<br>
  srcMgr.getFileEntryForID(file_id);<br>
<br>
Thx for your help,<br>
Felix<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></font></div>