[cfe-dev] Obtaining file name for functions from included files

Felix Schmitt felix.schmitt at zih.tu-dresden.de
Wed Jun 20 03:39:58 PDT 2012


Manuel Klimek <klimek at ...> writes:

> 
> On Tue, Jun 19, 2012 at 3:22 PM, Felix Schmitt <felix.schmitt <at>
zih.tu-dresden.de> wrote:
> 
> Manuel Klimek <klimek <at> ...> writes:
> >
> > On Tue, Jun 19, 2012 at 2:34 PM, Felix Schmitt
> 
> <felix.schmitt <at> zih.tu-dresden.de> wrote:
> > Hi,
> > I got the following problem:
> > I need to traverse the AST (currently using
> RecursiveASTVisitor) and get the
> > file name for every function declaration.
> > Currently, I only get the filename for function
> declarations in my main file but
> > how do I get these for functions in #included files?
> > My relevant code looks like this (srcMgr is the
> SourceManager):
> > bool CMyASTVisitor::VisitFunctionDecl(FunctionDecl*
> decl)
> > {
> > ...
> > const FileEntry* file_entry =
> > srcMgr.getFileEntryForID(srcMgr.getFileID(decl-
> >getLocStart()));
> > if (file_entry == NULL)
> >    std::cout << "no file entry" << std::endl;
> > ...
> > }
> > Is there a way to get these filenames?
> >
> >
> > Why does file_entry->getName() not work?
> >
> Because file_entry is NULL if the declaration found is
> not in
> the main file but from an included file in the main file.
> 
> 
> That's news to me - the only place where I've found 
file_entry to be NULL is
for token-pasted code, for example from macro expansions.
> 

You are right, but this happened to be the case for me 
(I tested with /usr/include/math.h, which does a lot of 
nasty stuff). The solution is using this code instead:


SourceLocation loc = srcMgr.getFileLoc(decl->getLocation());
std::pair<FileID, unsigned> loc_info = 
  srcMgr.getDecomposedLoc(loc);
FileID file_id = loc_info.first;
const FileEntry* file_entry = 
  srcMgr.getFileEntryForID(file_id);

Thx for your help,
Felix 





More information about the cfe-dev mailing list