Hey guys,
I am new to clang and I am trying to get the specialized name of template classes and functions. For example, the std::map container is an STL class with template parameters. map<string, int> should be expanded as something similar to std::map<std::__cxx11::basic_string<char, std::char_traits, std::allocator >, int>. I have written a simple clang tool to get the function name and the class name of functions, here is a piece of code:
map<string, set> func_set;
DeclarationMatcher methodMatcher = cxxMethodDecl().bind(“methods”);
class MethodPrinter : public MatchFinder::MatchCallback {
public :
virtual void run(const MatchFinder::MatchResult &Result) {
if (const CXXMethodDecl *md = Result.Nodes.getNodeAsclang::CXXMethodDecl(“methods”)) {
string f_name = md->getNameAsString();
string c_name = md->getParent()->getNameAsString();
if (auto tsd = dyn_cast(md->getParent()))
c_name = tsd->getNameAsString();
func_set[c_name].insert(f_name);
}
}
};
This piece of code is getting me started, but not quite there. The getNameAsString() method just gives a very simple name, without the template parameters specialized. I am wondering if there is a way to do that.
Any help is appreciated!
Jason