Skip to content

Commit 5efa8c0

Browse files
committed
[lldb] Use Desugar function in GetCanonicalNode and remove duped code
1 parent e072303 commit 5efa8c0

File tree

1 file changed

+40
-108
lines changed

1 file changed

+40
-108
lines changed

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

Lines changed: 40 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -552,104 +552,70 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform(
552552
return fn(node);
553553
}
554554

555+
/// Desugar a sugared type.
556+
static swift::Demangle::NodePointer
557+
Desugar(swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
558+
swift::Demangle::Node::Kind bound_kind,
559+
swift::Demangle::Node::Kind kind, llvm::StringRef name) {
560+
LLDB_SCOPED_TIMER();
561+
562+
using namespace swift::Demangle;
563+
NodePointer desugared = dem.createNode(bound_kind);
564+
NodePointer type = dem.createNode(Node::Kind::Type);
565+
{
566+
NodePointer concrete = dem.createNode(kind);
567+
NodePointer swift =
568+
dem.createNodeWithAllocatedText(Node::Kind::Module, swift::STDLIB_NAME);
569+
concrete->addChild(swift, dem);
570+
NodePointer ident =
571+
dem.createNodeWithAllocatedText(Node::Kind::Identifier, name);
572+
concrete->addChild(ident, dem);
573+
type->addChild(concrete, dem);
574+
}
575+
NodePointer type_list = dem.createNode(Node::Kind::TypeList);
576+
577+
assert(node->getNumChildren() >= 1 && node->getNumChildren() <= 2 &&
578+
"Sugared types should only have 1 or 2 children");
579+
for (NodePointer child : *node) {
580+
NodePointer type = dem.createNode(Node::Kind::Type);
581+
type->addChild(child, dem);
582+
type_list->addChild(type, dem);
583+
}
584+
desugared->addChild(type, dem);
585+
desugared->addChild(type_list, dem);
586+
return desugared;
587+
}
588+
555589
/// Iteratively resolve all type aliases in \p node by looking up their
556590
/// desugared types in the debug info of module \p M.
557591
static swift::Demangle::NodePointer GetCanonicalNode(
558592
TypeSystemSwiftTypeRef *module_holder, SwiftASTContext *target_holder,
559593
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node) {
560594
using namespace swift::Demangle;
561595
return TypeSystemSwiftTypeRef::Transform(dem, node, [&](NodePointer node) {
562-
NodePointer canonical = nullptr;
563596
auto kind = node->getKind();
564597
switch (kind) {
565598
case Node::Kind::SugaredOptional:
566599
// FIXME: Factor these three cases out.
567600
assert(node->getNumChildren() == 1);
568601
if (node->getNumChildren() != 1)
569602
return node;
570-
571-
canonical = dem.createNode(Node::Kind::BoundGenericEnum);
572-
{
573-
NodePointer type = dem.createNode(Node::Kind::Type);
574-
NodePointer e = dem.createNode(Node::Kind::Enum);
575-
NodePointer module = dem.createNodeWithAllocatedText(
576-
Node::Kind::Module, swift::STDLIB_NAME);
577-
e->addChild(module, dem);
578-
NodePointer optional =
579-
dem.createNodeWithAllocatedText(Node::Kind::Identifier, "Optional");
580-
e->addChild(optional, dem);
581-
type->addChild(e, dem);
582-
canonical->addChild(type, dem);
583-
}
584-
{
585-
NodePointer typelist = dem.createNode(Node::Kind::TypeList);
586-
NodePointer type = dem.createNode(Node::Kind::Type);
587-
type->addChild(node->getFirstChild(), dem);
588-
typelist->addChild(type, dem);
589-
canonical->addChild(typelist, dem);
590-
}
591-
return canonical;
603+
return Desugar(dem, node, Node::Kind::BoundGenericEnum, Node::Kind::Enum,
604+
"Optional");
592605
case Node::Kind::SugaredArray: {
593606
assert(node->getNumChildren() == 1);
594607
if (node->getNumChildren() != 1)
595608
return node;
596-
597-
canonical = dem.createNode(Node::Kind::BoundGenericStructure);
598-
{
599-
NodePointer type = dem.createNode(Node::Kind::Type);
600-
NodePointer structure = dem.createNode(Node::Kind::Structure);
601-
NodePointer module = dem.createNodeWithAllocatedText(
602-
Node::Kind::Module, swift::STDLIB_NAME);
603-
structure->addChild(module, dem);
604-
NodePointer array =
605-
dem.createNodeWithAllocatedText(Node::Kind::Identifier, "Array");
606-
structure->addChild(array, dem);
607-
type->addChild(structure, dem);
608-
canonical->addChild(type, dem);
609-
}
610-
{
611-
NodePointer typelist = dem.createNode(Node::Kind::TypeList);
612-
NodePointer type = dem.createNode(Node::Kind::Type);
613-
type->addChild(node->getFirstChild(), dem);
614-
typelist->addChild(type, dem);
615-
canonical->addChild(typelist, dem);
616-
}
617-
return canonical;
609+
return Desugar(dem, node, Node::Kind::BoundGenericStructure,
610+
Node::Kind::Structure, "Array");
618611
}
619612
case Node::Kind::SugaredDictionary:
620613
// FIXME: This isnt covered by any test.
621614
assert(node->getNumChildren() == 2);
622615
if (node->getNumChildren() != 2)
623616
return node;
624-
625-
canonical = dem.createNode(Node::Kind::BoundGenericStructure);
626-
{
627-
NodePointer type = dem.createNode(Node::Kind::Type);
628-
NodePointer structure = dem.createNode(Node::Kind::Structure);
629-
NodePointer module = dem.createNodeWithAllocatedText(
630-
Node::Kind::Module, swift::STDLIB_NAME);
631-
structure->addChild(module, dem);
632-
NodePointer dict = dem.createNodeWithAllocatedText(
633-
Node::Kind::Identifier, "Dictionary");
634-
structure->addChild(dict, dem);
635-
type->addChild(structure, dem);
636-
canonical->addChild(type, dem);
637-
}
638-
{
639-
NodePointer typelist = dem.createNode(Node::Kind::TypeList);
640-
{
641-
NodePointer type = dem.createNode(Node::Kind::Type);
642-
type->addChild(node->getChild(0), dem);
643-
typelist->addChild(type, dem);
644-
}
645-
{
646-
NodePointer type = dem.createNode(Node::Kind::Type);
647-
type->addChild(node->getChild(1), dem);
648-
typelist->addChild(type, dem);
649-
}
650-
canonical->addChild(typelist, dem);
651-
}
652-
return canonical;
617+
return Desugar(dem, node, Node::Kind::BoundGenericStructure,
618+
Node::Kind::Structure, "Dictionary");
653619
case Node::Kind::SugaredParen:
654620
assert(node->getNumChildren() == 1);
655621
if (node->getNumChildren() != 1)
@@ -739,40 +705,6 @@ clang::api_notes::APINotesManager *TypeSystemSwiftTypeRef::GetAPINotesManager(
739705
return apinotes_manager.get();
740706
}
741707

742-
/// Desugar a sugared type.
743-
static swift::Demangle::NodePointer
744-
Desugar(swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
745-
swift::Demangle::Node::Kind bound_kind,
746-
swift::Demangle::Node::Kind kind, llvm::StringRef name) {
747-
LLDB_SCOPED_TIMER();
748-
749-
using namespace swift::Demangle;
750-
NodePointer desugared = dem.createNode(bound_kind);
751-
NodePointer type = dem.createNode(Node::Kind::Type);
752-
{
753-
NodePointer concrete = dem.createNode(kind);
754-
NodePointer swift =
755-
dem.createNodeWithAllocatedText(Node::Kind::Module, swift::STDLIB_NAME);
756-
concrete->addChild(swift, dem);
757-
NodePointer ident =
758-
dem.createNodeWithAllocatedText(Node::Kind::Identifier, name);
759-
concrete->addChild(ident, dem);
760-
type->addChild(concrete, dem);
761-
}
762-
NodePointer type_list = dem.createNode(Node::Kind::TypeList);
763-
764-
assert(node->getNumChildren() >= 1 && node->getNumChildren() <= 2 &&
765-
"Sugared types should only have 1 or 2 children");
766-
for (NodePointer child : *node) {
767-
NodePointer type = dem.createNode(Node::Kind::Type);
768-
type->addChild(child, dem);
769-
type_list->addChild(type, dem);
770-
}
771-
desugared->addChild(type, dem);
772-
desugared->addChild(type_list, dem);
773-
return desugared;
774-
}
775-
776708
/// Helper for \p GetSwiftName.
777709
template <typename ContextInfo>
778710
std::string ExtractSwiftName(

0 commit comments

Comments
 (0)