Question on navigating to cc files from header files in MatchCallback::run

Hello all,

I’m trying to get the .cc file’s translation unit from the .h file that I’ve currently matched with a MatchCallback, I am doing this by name where I’ve matched a class declaration D defined in D.hh and I need to run a RecursiveASTVisitor on D.cc. So far I’ve figured out how to get a FileEntry object and I’m stuck trying to figure out how to get a TranslationUnitDecl that I can then run the ASTVisitor on.

This is my code so far inside my MatchCallback::run method , any advice on how to parse this .cc file from the .hh file? I would like to avoid building another FrontendAction and ASTConsumer, but let me know if this is the only way to accomplish this. Any help would be appreciated.

ASTContext *context = Result.Context;
SourceManager &source_manager = context->getSourceManager();
FileManager &file_manager = source_manager->getFileManager();
const FileEntry *file_entry = file_manager.getFile(class_name + “.cc”);
// … Need code here to get a TranslationUnitDecl from file_entry.

I think that you’re doing it wrong, but then again I know very little about this so this is all just guessing. I don’t think that FileManager and SourceManager will magically parse your file, you can obtain FileEntry but that’s just a low level class that wraps some file system stuff… I think that you need to do the same thing you’re doing with your header file, how are you feeding that into RecurisiveASTVisitor? clang::tooling::runToolOnCode seems to be the way to go, you just need to pass it the contents of your .cc file. You might be able to get it by calling SourceManager::getMemoryBufferForFile, but I’m not sure if you have to use clang’s infrastucture for this at all.

So to give more context to the question, I have a match that is generated on the header file and I’m trying to jump to the mapped .cc file that actually defines that class. I’m pretty new to clang development so I might not be doing this the best way, but I have a custom ASTFrontendAction for matching the header file pattern that I have defined that then calls a custom subclassed MatchFinder::MatchCallback.

I will try using runToolOnCode and define a new FrontEndAction for the operation that I will run on the cc file. Is there also an easy way to convert an llvm::MemoryBuffer to a Twine? I noticed runToolOnCode requires a Twine, not a MemoryBuffer. I was thinking of doing MemoryBuffer::getBuffer() and constructing a Twine out of this, but is there a simpler way?

I’ve made a stackoverflow question here if that’s helpful: http://stackoverflow.com/questions/24791674/clang-get-a-translation-unit-from-file-path

In article <CAK0=dHd42P7h++J6LUQB4Z-Em6AWwYoh90aDOV-WL9pq4t9iyA@mail.gmail.com>,
    Lucas Nunno <lnunno@cs.unm.edu> writes:

So to give more context to the question, I have a match that is generated
on the header file and I'm trying to jump to the mapped .cc file that
actually defines that class.

What if there is no such source file? For instance, I might be
linking against a binary library and including it's header.

I think to really do what you want you need a global view of the entire
compilation process and not just information you get from a single
translation unit that includes a header file.

The compilation database may be of some help here, but you still have
the problem of linking against libraries for which you have headers
but no source files.