//===--- DemangleWrappers.cpp - Swift Name Demangling ---------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/Basic/DemangleWrappers.h" #include "swift/Basic/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ErrorHandling.h" using namespace swift; using namespace demangle_wrappers; static StringRef getNodeKindString(swift::Demangle::Node::Kind k) { switch (k) { #define NODE(ID) \ case Node::Kind::ID: \ return #ID; #include "swift/Basic/DemangleNodes.def" } llvm_unreachable("bad node kind"); } static void printNode(llvm::raw_ostream &Out, const Node *node, unsigned depth) { // Indent two spaces per depth. Out.indent(depth * 2); if (!node) { Out << "<>"; return; } Out << "kind=" << getNodeKindString(node->getKind()); if (node->hasText()) { Out << ", text=\"" << node->getText() << '\"'; } if (node->hasIndex()) { Out << ", index=" << node->getIndex(); } Out << '\n'; for (auto &child : *node) { printNode(Out, child.get(), depth + 1); } } void NodeDumper::dump() const { print(llvm::errs()); } void NodeDumper::print(llvm::raw_ostream &Out) const { printNode(Out, Root.get(), 0); } namespace { /// A pretty-stack-trace node for demangling trees. class PrettyStackTraceNode : public llvm::PrettyStackTraceEntry { const char *Action; Node *TheNode; public: PrettyStackTraceNode(const char *action, Node *node) : Action(action), TheNode(node) {} void print(llvm::raw_ostream &out) const override { out << "While " << Action << ' '; if (!TheNode) { out << "<>\n"; } else { out << "demangling tree:\n"; printNode(out, TheNode, 4); } } }; } // end unnamed namespace NodePointer swift::demangle_wrappers::demangleSymbolAsNode(llvm::StringRef MangledName, const DemangleOptions &Options) { PrettyStackTraceStringAction prettyStackTrace("demangling string", MangledName); return swift::Demangle::demangleSymbolAsNode(MangledName.data(), MangledName.size(), Options); } std::string nodeToString(NodePointer Root, const DemangleOptions &Options) { PrettyStackTraceNode trace("printing", Root.get()); return swift::Demangle::nodeToString(Root, Options); } std::string swift::demangle_wrappers::demangleSymbolAsString( llvm::StringRef MangledName, const DemangleOptions &Options) { PrettyStackTraceStringAction prettyStackTrace("demangling string", MangledName); return swift::Demangle::demangleSymbolAsString(MangledName.data(), MangledName.size(), Options); } std::string swift::demangle_wrappers::demangleTypeAsString( llvm::StringRef MangledName, const DemangleOptions &Options) { PrettyStackTraceStringAction prettyStackTrace("demangling type string", MangledName); return swift::Demangle::demangleTypeAsString(MangledName.data(), MangledName.size(), Options); }