diff --git a/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp b/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp index 52c969de0820b..2b8637e3afc37 100644 --- a/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp +++ b/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp @@ -203,6 +203,30 @@ ResolveTypeAlias(SwiftASTContext *module_holder, return {n, {}}; } +std::string +TypeSystemSwiftTypeRef::GetTupleElementName(lldb::opaque_compiler_type_t type, + size_t idx) { + using namespace swift::Demangle; + Demangler dem; + NodePointer node = TypeSystemSwiftTypeRef::DemangleCanonicalType(dem, type); + if (!node || node->getKind() != Node::Kind::Tuple) + return ""; + if (node->getNumChildren() < idx) + return ""; + NodePointer child = node->getChild(idx); + if (child->getNumChildren() != 1 && + child->getKind() != Node::Kind::TupleElement) + return ""; + for (NodePointer name : *child) { + if (name->getKind() != Node::Kind::TupleElementName) + continue; + return name->getText().str(); + } + std::string name; + llvm::raw_string_ostream(name) << idx; + return name; +} + swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform( swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node, std::function diff --git a/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h b/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h index fe580df4c8593..0ea6432cea350 100644 --- a/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h +++ b/lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h @@ -257,6 +257,10 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift { bool print_help_if_available, bool print_extensions_if_available, lldb::DescriptionLevel level = lldb::eDescriptionLevelFull) override; + /// Return the nth tuple element's name, if it has one. + std::string GetTupleElementName(lldb::opaque_compiler_type_t type, + size_t idx); + /// Recursively transform the demangle tree starting a \p node by /// doing a post-order traversal and replacing each node with /// fn(node). diff --git a/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp b/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp index 19d8b54953fae..bea66e6f6808b 100644 --- a/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp +++ b/lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp @@ -402,6 +402,20 @@ TEST_F(TestTypeSystemSwiftTypeRef, Tuple) { ASSERT_EQ(float_int_tuple.GetMangledTypeName(), "$ss0019BuiltinFPIEEE_CJEEdV1f_s0016BuiltinInt_gCJAcV1itD"); } + { + NodePointer n = b.GlobalType( + b.Node(Node::Kind::Tuple, + b.Node(Node::Kind::TupleElement, + b.Node(Node::Kind::TupleElementName, "x"), b.IntType()), + b.Node(Node::Kind::TupleElement, b.IntType()), + b.Node(Node::Kind::TupleElement, + b.Node(Node::Kind::TupleElementName, "z"), b.IntType()))); + CompilerType t = GetCompilerType(b.Mangle(n)); + lldb::opaque_compiler_type_t o = t.GetOpaqueQualType(); + ASSERT_EQ(m_swift_ts.GetTupleElementName(o, 0), "x"); + ASSERT_EQ(m_swift_ts.GetTupleElementName(o, 1), "1"); + ASSERT_EQ(m_swift_ts.GetTupleElementName(o, 2), "z"); + } } TEST_F(TestTypeSystemSwiftTypeRef, TypeClass) {