我正在使用Clang来解析一些C ++代码。我想为我遇到的每个FunctionDecl
打印名称和错误名称。
我可以通过将此功能添加到我的RecursiveASTVisitor
:
bool VisitFunctionDecl(FunctionDecl* f) {
auto declName = f->getNameInfo().getName();
auto functionName = declName.getAsString();
std::cout << functionName << std::endl;
return true;
}
我怎样才能打印受损的名字?
我按照塞巴斯蒂安的指示制作了我的工作代码:
const auto getMangledName = [&](FunctionDecl* decl) {
auto mangleContext = context.createMangleContext();
if (!mangleContext->shouldMangleDeclName(decl)) {
return decl->getNameInfo().getName().getAsString();
}
std::string mangledName;
llvm::raw_string_ostream ostream(mangledName);
mangleContext->mangleName(decl, ostream);
ostream.flush();
delete mangleContext;
return mangledName;
};
答案 0 :(得分:5)
受损的名称不是AST的一部分,因为它取决于ABI。要获得受损的名称,您需要创建一个适当的clang::MangleContext
子类(来自clang/AST/Mangle.h
)。目前有MicrosoftMangleContext
用于Visual Studio兼容的修改,ItaniumMangleContext
用于常见的C ++ ABI修改。
在最简单的版本中,您只需调用mangleName
,传入要修改其名称的NamedDecl
,并将raw_ostream
写入已修改的名称。< / p>
对于像lambdas这样的更复杂的事情,你可能还必须在适当的位置调用startNewFunction
,因为它们的重整取决于它们所处的功能。