本文整理汇总了C++中mangle::ASTMangler::mangleDeclAsUSR方法的典型用法代码示例。如果您正苦于以下问题:C++ ASTMangler::mangleDeclAsUSR方法的具体用法?C++ ASTMangler::mangleDeclAsUSR怎么用?C++ ASTMangler::mangleDeclAsUSR使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类mangle::ASTMangler
的用法示例。
在下文中一共展示了ASTMangler::mangleDeclAsUSR方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: printDeclUSR
bool ide::printDeclUSR(const ValueDecl *D, raw_ostream &OS) {
if (!D->hasName() && !isa<ParamDecl>(D) && !isa<AccessorDecl>(D))
return true; // Ignore.
if (D->getModuleContext()->isBuiltinModule())
return true; // Ignore.
if (isa<ModuleDecl>(D))
return true; // Ignore.
auto interpretAsClangNode = [](const ValueDecl *D)->ClangNode {
ClangNode ClangN = D->getClangNode();
if (auto ClangD = ClangN.getAsDecl()) {
// NSErrorDomain causes the clang enum to be imported like this:
//
// struct MyError {
// enum Code : Int32 {
// case errFirst
// case errSecond
// }
// static var errFirst: MyError.Code { get }
// static var errSecond: MyError.Code { get }
// }
//
// The clang enum constants are associated with both the static vars and
// the enum cases.
// But we want unique USRs for the above symbols, so use the clang USR
// for the enum cases, and the Swift USR for the vars.
//
if (auto *ClangEnumConst = dyn_cast<clang::EnumConstantDecl>(ClangD)) {
if (auto *ClangEnum = dyn_cast<clang::EnumDecl>(ClangEnumConst->getDeclContext())) {
if (ClangEnum->hasAttr<clang::NSErrorDomainAttr>() && isa<VarDecl>(D))
return ClangNode();
}
}
}
return ClangN;
};
if (ClangNode ClangN = interpretAsClangNode(D)) {
llvm::SmallString<128> Buf;
if (auto ClangD = ClangN.getAsDecl()) {
bool Ignore = clang::index::generateUSRForDecl(ClangD, Buf);
if (!Ignore)
OS << Buf.str();
return Ignore;
}
auto &Importer = *D->getASTContext().getClangModuleLoader();
auto ClangMacroInfo = ClangN.getAsMacro();
bool Ignore = clang::index::generateUSRForMacro(
D->getBaseName().getIdentifier().str(),
ClangMacroInfo->getDefinitionLoc(),
Importer.getClangASTContext().getSourceManager(), Buf);
if (!Ignore)
OS << Buf.str();
return Ignore;
}
if (shouldUseObjCUSR(D)) {
return printObjCUSR(D, OS);
}
if (!D->hasInterfaceType())
return true;
// Invalid code.
if (D->getInterfaceType().findIf([](Type t) -> bool {
return t->is<ModuleType>();
}))
return true;
Mangle::ASTMangler NewMangler;
std::string Mangled = NewMangler.mangleDeclAsUSR(D, getUSRSpacePrefix());
OS << Mangled;
return false;
}