Skip to content

Commit cf0cef7

Browse files
authored
Merge pull request #2892 from augusto2112/get-num-template-args-swifttyperef
[lldb] Implement TypeSystemSwiftTypeRef::GetNumTemplateArguments
2 parents 0917dc9 + 9df8052 commit cf0cef7

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2616,8 +2616,37 @@ size_t TypeSystemSwiftTypeRef::GetIndexOfChildMemberWithName(
26162616

26172617
size_t
26182618
TypeSystemSwiftTypeRef::GetNumTemplateArguments(opaque_compiler_type_t type) {
2619-
return m_swift_ast_context->GetNumTemplateArguments(ReconstructType(type));
2619+
auto impl = [&]() -> size_t {
2620+
using namespace swift::Demangle;
2621+
Demangler dem;
2622+
NodePointer node = DemangleCanonicalType(dem, type);
2623+
2624+
if (!node)
2625+
return 0;
2626+
2627+
switch (node->getKind()) {
2628+
case Node::Kind::BoundGenericClass:
2629+
case Node::Kind::BoundGenericEnum:
2630+
case Node::Kind::BoundGenericStructure:
2631+
case Node::Kind::BoundGenericProtocol:
2632+
case Node::Kind::BoundGenericOtherNominalType:
2633+
case Node::Kind::BoundGenericTypeAlias:
2634+
case Node::Kind::BoundGenericFunction: {
2635+
if (node->getNumChildren() > 1) {
2636+
NodePointer child = node->getChild(1);
2637+
if (child && child->getKind() == Node::Kind::TypeList)
2638+
return child->getNumChildren();
2639+
}
2640+
} break;
2641+
default:
2642+
break;
2643+
}
2644+
return 0;
2645+
};
2646+
VALIDATE_AND_RETURN(impl, GetNumTemplateArguments, type,
2647+
(ReconstructType(type)), (ReconstructType(type)));
26202648
}
2649+
26212650
CompilerType
26222651
TypeSystemSwiftTypeRef::GetTypeForFormatters(opaque_compiler_type_t type) {
26232652
return m_swift_ast_context->GetTypeForFormatters(ReconstructType(type));

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,3 +577,65 @@ TEST_F(TestTypeSystemSwiftTypeRef, ImportedType) {
577577
TEST_F(TestTypeSystemSwiftTypeRef, RawPointer) {
578578
ASSERT_EQ(m_swift_ts.GetRawPointerType().GetMangledTypeName(), "$sBpD");
579579
}
580+
581+
TEST_F(TestTypeSystemSwiftTypeRef, GetNumTemplateArguments) {
582+
using namespace swift::Demangle;
583+
Demangler dem;
584+
NodeBuilder b(dem);
585+
{
586+
NodePointer n = b.GlobalType(b.Node(
587+
Node::Kind::BoundGenericClass,
588+
b.Node(Node::Kind::Type,
589+
b.Node(Node::Kind::Class, b.Node(Node::Kind::Module, "module"),
590+
b.Node(Node::Kind::Identifier, "Foo"))),
591+
b.Node(Node::Kind::TypeList,
592+
b.Node(Node::Kind::Type,
593+
b.Node(Node::Kind::DependentGenericParamType,
594+
b.NodeWithIndex(Node::Kind::Index, 0),
595+
b.NodeWithIndex(Node::Kind::Index, 0))),
596+
b.Node(Node::Kind::Type,
597+
b.Node(Node::Kind::DependentGenericParamType,
598+
b.NodeWithIndex(Node::Kind::Index, 0),
599+
b.NodeWithIndex(Node::Kind::Index, 1))),
600+
b.Node(Node::Kind::Type,
601+
b.Node(Node::Kind::DependentGenericParamType,
602+
b.NodeWithIndex(Node::Kind::Index, 0),
603+
b.NodeWithIndex(Node::Kind::Index, 2))))));
604+
CompilerType t = GetCompilerType(b.Mangle(n));
605+
ASSERT_EQ(t.GetNumTemplateArguments(), 3);
606+
}
607+
608+
{
609+
NodePointer n = b.GlobalType(b.Node(
610+
Node::Kind::BoundGenericStructure,
611+
b.Node(Node::Kind::Type,
612+
b.Node(Node::Kind::Structure, b.Node(Node::Kind::Module, "module"),
613+
b.Node(Node::Kind::Identifier, "Foo"))),
614+
b.Node(Node::Kind::TypeList,
615+
b.Node(Node::Kind::Type,
616+
b.Node(Node::Kind::DependentGenericParamType,
617+
b.NodeWithIndex(Node::Kind::Index, 0),
618+
b.NodeWithIndex(Node::Kind::Index, 0))),
619+
b.Node(Node::Kind::Type,
620+
b.Node(Node::Kind::DependentGenericParamType,
621+
b.NodeWithIndex(Node::Kind::Index, 0),
622+
b.NodeWithIndex(Node::Kind::Index, 1))))));
623+
CompilerType t = GetCompilerType(b.Mangle(n));
624+
ASSERT_EQ(t.GetNumTemplateArguments(), 2);
625+
}
626+
627+
{
628+
NodePointer n = b.GlobalType(b.Node(
629+
Node::Kind::BoundGenericEnum,
630+
b.Node(Node::Kind::Type,
631+
b.Node(Node::Kind::Enum, b.Node(Node::Kind::Module, "module"),
632+
b.Node(Node::Kind::Identifier, "Foo"))),
633+
b.Node(Node::Kind::TypeList,
634+
b.Node(Node::Kind::Type,
635+
b.Node(Node::Kind::DependentGenericParamType,
636+
b.NodeWithIndex(Node::Kind::Index, 0),
637+
b.NodeWithIndex(Node::Kind::Index, 0))))));
638+
CompilerType t = GetCompilerType(b.Mangle(n));
639+
ASSERT_EQ(t.GetNumTemplateArguments(), 1);
640+
}
641+
}

0 commit comments

Comments
 (0)