Skip to content

Commit c7692c0

Browse files
Merge pull request #2049 from adrian-prantl/tuple-elem
Add a TypeSystemSwiftTypeRef::GetTupleElementName() method.
2 parents 46170cc + adb23f8 commit c7692c0

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,30 @@ ResolveTypeAlias(SwiftASTContext *module_holder,
203203
return {n, {}};
204204
}
205205

206+
std::string
207+
TypeSystemSwiftTypeRef::GetTupleElementName(lldb::opaque_compiler_type_t type,
208+
size_t idx) {
209+
using namespace swift::Demangle;
210+
Demangler dem;
211+
NodePointer node = TypeSystemSwiftTypeRef::DemangleCanonicalType(dem, type);
212+
if (!node || node->getKind() != Node::Kind::Tuple)
213+
return "";
214+
if (node->getNumChildren() < idx)
215+
return "";
216+
NodePointer child = node->getChild(idx);
217+
if (child->getNumChildren() != 1 &&
218+
child->getKind() != Node::Kind::TupleElement)
219+
return "";
220+
for (NodePointer name : *child) {
221+
if (name->getKind() != Node::Kind::TupleElementName)
222+
continue;
223+
return name->getText().str();
224+
}
225+
std::string name;
226+
llvm::raw_string_ostream(name) << idx;
227+
return name;
228+
}
229+
206230
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform(
207231
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
208232
std::function<swift::Demangle::NodePointer(swift::Demangle::NodePointer)>

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
258258
bool print_help_if_available, bool print_extensions_if_available,
259259
lldb::DescriptionLevel level = lldb::eDescriptionLevelFull) override;
260260

261+
/// Return the nth tuple element's name, if it has one.
262+
std::string GetTupleElementName(lldb::opaque_compiler_type_t type,
263+
size_t idx);
264+
261265
/// Recursively transform the demangle tree starting a \p node by
262266
/// doing a post-order traversal and replacing each node with
263267
/// fn(node).

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,20 @@ TEST_F(TestTypeSystemSwiftTypeRef, Tuple) {
402402
ASSERT_EQ(float_int_tuple.GetMangledTypeName(),
403403
"$ss0019BuiltinFPIEEE_CJEEdV1f_s0016BuiltinInt_gCJAcV1itD");
404404
}
405+
{
406+
NodePointer n = b.GlobalType(
407+
b.Node(Node::Kind::Tuple,
408+
b.Node(Node::Kind::TupleElement,
409+
b.Node(Node::Kind::TupleElementName, "x"), b.IntType()),
410+
b.Node(Node::Kind::TupleElement, b.IntType()),
411+
b.Node(Node::Kind::TupleElement,
412+
b.Node(Node::Kind::TupleElementName, "z"), b.IntType())));
413+
CompilerType t = GetCompilerType(b.Mangle(n));
414+
lldb::opaque_compiler_type_t o = t.GetOpaqueQualType();
415+
ASSERT_EQ(m_swift_ts.GetTupleElementName(o, 0), "x");
416+
ASSERT_EQ(m_swift_ts.GetTupleElementName(o, 1), "1");
417+
ASSERT_EQ(m_swift_ts.GetTupleElementName(o, 2), "z");
418+
}
405419
}
406420

407421
TEST_F(TestTypeSystemSwiftTypeRef, TypeClass) {

0 commit comments

Comments
 (0)