[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