blob: adc5b58d69b67ee85e3164f444cd06fe4a55659b [file] [log] [blame]
//===--- 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 << "<<NULL>>";
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 << "<<null demangling node>>\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);
}