Files
swift-mirror/lib/SwiftDemangle/SwiftDemangle.cpp
David Farler b460aa0c86 Further shorten demangled names in simplified mode
Break up "Simplified" demangling mode (shortened demangled descriptions
for the sake of displaying in UI with small areas) into more
fine-grained options instead of an opaque "Simplified" option and
provide a static preset of options for displaying stack traces in
Xcode UI and other tools, for example.

- Don't print unmangled suffixes
- Don't print module names
- Shorten various generic specialization descriptions as just
  "specialized"
- Don't display long protocol conformances
- Truncate where clauses
- Don't display so-called "entity" types
- Shorten "partial apply *"
- Shorten thunk phrases
- Shorten value witness phrases
- Truncate archetype references

rdar://problem/21753651

Swift SVN r30247
2015-07-16 03:35:46 +00:00

67 lines
2.6 KiB
C++

//===--- SwiftDemangle.cpp - Public demangling interface ------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 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
//
//===----------------------------------------------------------------------===//
//
// Functions in the libswiftDemangle library, which provides external
// access to Swift's demangler.
//
//===----------------------------------------------------------------------===//
#include "swift/Basic/DemangleWrappers.h"
#include "swift/SwiftDemangle/SwiftDemangle.h"
/// \returns true if \p MangledName starts with Swift prefix, "_T".
static bool isSwiftPrefixed(const char *MangledName) {
return (MangledName[0] == '_' && MangledName[1] == 'T');
}
size_t swift_demangle_getDemangledName_Options(const char *MangledName,
char *OutputBuffer, size_t Length,
swift::Demangle::DemangleOptions DemangleOptions) {
assert(MangledName != nullptr && "null input");
assert(OutputBuffer != nullptr || Length == 0);
if (!isSwiftPrefixed(MangledName))
return 0; // Not a mangled name
std::string Result = swift::demangle_wrappers::demangleSymbolAsString(
MangledName, DemangleOptions);
if (Result == MangledName)
return 0; // Not a mangled name
// Copy the result to an output buffer.
return strlcpy(OutputBuffer, Result.c_str(), Length);
}
size_t swift_demangle_getDemangledName(const char *MangledName,
char *OutputBuffer,
size_t Length) {
swift::Demangle::DemangleOptions DemangleOptions;
DemangleOptions.SynthesizeSugarOnTypes = true;
return swift_demangle_getDemangledName_Options(MangledName, OutputBuffer,
Length, DemangleOptions);
}
size_t swift_demangle_getSimplifiedDemangledName(const char *MangledName,
char *OutputBuffer,
size_t Length) {
auto Opts = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions();
return swift_demangle_getDemangledName_Options(MangledName, OutputBuffer,
Length, Opts);
}
size_t fnd_get_demangled_name(const char *MangledName, char *OutputBuffer,
size_t Length) {
return swift_demangle_getDemangledName(MangledName, OutputBuffer, Length);
}