Skip to content

Commit 025ff07

Browse files
authored
Merge pull request #2936 from augusto2112/ts-swift-typeref-typealias
[lldb] Implement TypeSystemSwiftTypeRef::IsTypedefType and TypeSystemSwiftTypeRef::GetTypedefedType
2 parents 2848fe7 + bc24cef commit 025ff07

File tree

2 files changed

+62
-13
lines changed

2 files changed

+62
-13
lines changed

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3148,13 +3148,40 @@ TypeSystemSwiftTypeRef::GetTypeBitAlign(opaque_compiler_type_t type,
31483148
AsMangledName(type));
31493149
return {};
31503150
}
3151+
31513152
bool TypeSystemSwiftTypeRef::IsTypedefType(opaque_compiler_type_t type) {
3152-
return m_swift_ast_context->IsTypedefType(ReconstructType(type));
3153+
auto impl = [&]() {
3154+
using namespace swift::Demangle;
3155+
Demangler dem;
3156+
NodePointer node = GetDemangledType(dem, AsMangledName(type));
3157+
return node && node->getKind() == Node::Kind::TypeAlias;
3158+
};
3159+
3160+
VALIDATE_AND_RETURN(impl, IsTypedefType, type, (ReconstructType(type)),
3161+
(ReconstructType(type)));
31533162
}
3163+
31543164
CompilerType
31553165
TypeSystemSwiftTypeRef::GetTypedefedType(opaque_compiler_type_t type) {
3156-
return m_swift_ast_context->GetTypedefedType(ReconstructType(type));
3166+
auto impl = [&]() -> CompilerType {
3167+
using namespace swift::Demangle;
3168+
Demangler dem;
3169+
NodePointer node = GetDemangledType(dem, AsMangledName(type));
3170+
if (!node || node->getKind() != Node::Kind::TypeAlias)
3171+
return {};
3172+
auto pair = ResolveTypeAlias(m_swift_ast_context, dem, node);
3173+
if (NodePointer resolved = std::get<swift::Demangle::NodePointer>(pair)) {
3174+
NodePointer type_node = dem.createNode(Node::Kind::Type);
3175+
type_node->addChild(resolved, dem);
3176+
return RemangleAsType(dem, type_node);
3177+
}
3178+
return std::get<CompilerType>(pair);
3179+
};
3180+
3181+
VALIDATE_AND_RETURN(impl, GetTypedefedType, type, (ReconstructType(type)),
3182+
(ReconstructType(type)));
31573183
}
3184+
31583185
CompilerType
31593186
TypeSystemSwiftTypeRef::GetFullyUnqualifiedType(opaque_compiler_type_t type) {
31603187
return m_swift_ast_context->GetFullyUnqualifiedType(ReconstructType(type));

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -646,25 +646,47 @@ TEST_F(TestTypeSystemSwiftTypeRef, GetInstanceType) {
646646
NodeBuilder b(dem);
647647
{
648648
NodePointer n = b.GlobalType(
649-
b.Node(Node::Kind::Metatype,
650-
b.Node(Node::Kind::MetatypeRepresentation, "@thin"),
651-
b.Node(Node::Kind::Type,
652-
b.Node(Node::Kind::Structure,
653-
b.Node(Node::Kind::Module, "Swift"),
654-
b.Node(Node::Kind::Identifier, "String")))));
649+
b.Node(Node::Kind::Metatype,
650+
b.Node(Node::Kind::MetatypeRepresentation, "@thin"),
651+
b.Node(Node::Kind::Type,
652+
b.Node(Node::Kind::Structure,
653+
b.Node(Node::Kind::Module, "Swift"),
654+
b.Node(Node::Kind::Identifier, "String")))));
655655

656656
CompilerType t = GetCompilerType(b.Mangle(n));
657-
CompilerType instance_type = m_swift_ts.GetInstanceType(t.GetOpaqueQualType());
657+
CompilerType instance_type =
658+
m_swift_ts.GetInstanceType(t.GetOpaqueQualType());
658659
ASSERT_EQ(instance_type.GetMangledTypeName(), "$sSSD");
659660
};
660661
{
661662
NodePointer n = b.GlobalType(
662-
b.Node(Node::Kind::Structure,
663-
b.Node(Node::Kind::Module, "Swift"),
664-
b.Node(Node::Kind::Identifier, "String")));
663+
b.Node(Node::Kind::Structure, b.Node(Node::Kind::Module, "Swift"),
664+
b.Node(Node::Kind::Identifier, "String")));
665665

666666
CompilerType t = GetCompilerType(b.Mangle(n));
667-
CompilerType instance_type = m_swift_ts.GetInstanceType(t.GetOpaqueQualType());
667+
CompilerType instance_type =
668+
m_swift_ts.GetInstanceType(t.GetOpaqueQualType());
668669
ASSERT_EQ(instance_type.GetMangledTypeName(), "$sSSD");
669670
};
670671
};
672+
673+
TEST_F(TestTypeSystemSwiftTypeRef, IsTypedefType) {
674+
using namespace swift::Demangle;
675+
Demangler dem;
676+
NodeBuilder b(dem);
677+
{
678+
NodePointer n = b.GlobalType(
679+
b.Node(Node::Kind::TypeAlias, b.Node(Node::Kind::Module, "module"),
680+
b.Node(Node::Kind::Identifier, "Alias")));
681+
CompilerType t = GetCompilerType(b.Mangle(n));
682+
ASSERT_TRUE(t.IsTypedefType());
683+
};
684+
{
685+
NodePointer n = b.GlobalType(
686+
b.Node(Node::Kind::Structure, b.Node(Node::Kind::Module, "module"),
687+
b.Node(Node::Kind::Identifier, "SomeNotAliasedType")));
688+
CompilerType t = GetCompilerType(b.Mangle(n));
689+
ASSERT_FALSE(t.IsTypedefType());
690+
};
691+
};
692+

0 commit comments

Comments
 (0)