Skip to content

Commit 897f62f

Browse files
authored
Merge pull request #2910 from augusto2112/ts-swift-typeref-get-instance-type
[lldb] Implement TypeSystemSwiftTypeRef::GetInstanceType
2 parents 23071fb + c92c174 commit 897f62f

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2823,8 +2823,34 @@ TypeSystemSwiftTypeRef::GetReferentType(opaque_compiler_type_t type) {
28232823

28242824
CompilerType
28252825
TypeSystemSwiftTypeRef::GetInstanceType(opaque_compiler_type_t type) {
2826-
return m_swift_ast_context->GetInstanceType(ReconstructType(type));
2826+
auto impl = [&]() -> CompilerType {
2827+
using namespace swift::Demangle;
2828+
Demangler dem;
2829+
NodePointer node = DemangleCanonicalType(dem, type);
2830+
2831+
if (!node)
2832+
return {};
2833+
if (ContainsUnresolvedTypeAlias(node)) {
2834+
// If we couldn't resolve all type aliases, we might be in a REPL session
2835+
// where getting to the debug information necessary for resolving that
2836+
// type alias isn't possible, or the user might have defined the
2837+
// type alias in the REPL. In these cases, fallback to asking the AST
2838+
// for the canonical type.
2839+
return m_swift_ast_context->GetInstanceType(ReconstructType(type));
2840+
}
2841+
2842+
if (node->getKind() == Node::Kind::Metatype) {
2843+
for (NodePointer child : *node)
2844+
if (child->getKind() == Node::Kind::Type)
2845+
return RemangleAsType(dem, child);
2846+
return {};
2847+
}
2848+
return {this, type};
2849+
};
2850+
VALIDATE_AND_RETURN(impl, GetInstanceType, type, (ReconstructType(type)),
2851+
(ReconstructType(type)));
28272852
}
2853+
28282854
TypeSystemSwift::TypeAllocationStrategy
28292855
TypeSystemSwiftTypeRef::GetAllocationStrategy(opaque_compiler_type_t type) {
28302856
return m_swift_ast_context->GetAllocationStrategy(ReconstructType(type));

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,4 +638,33 @@ TEST_F(TestTypeSystemSwiftTypeRef, GetNumTemplateArguments) {
638638
CompilerType t = GetCompilerType(b.Mangle(n));
639639
ASSERT_EQ(t.GetNumTemplateArguments(), 1);
640640
}
641-
}
641+
}
642+
643+
TEST_F(TestTypeSystemSwiftTypeRef, GetInstanceType) {
644+
using namespace swift::Demangle;
645+
Demangler dem;
646+
NodeBuilder b(dem);
647+
{
648+
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")))));
655+
656+
CompilerType t = GetCompilerType(b.Mangle(n));
657+
CompilerType instance_type = m_swift_ts.GetInstanceType(t.GetOpaqueQualType());
658+
ASSERT_EQ(instance_type.GetMangledTypeName(), "$sSSD");
659+
};
660+
{
661+
NodePointer n = b.GlobalType(
662+
b.Node(Node::Kind::Structure,
663+
b.Node(Node::Kind::Module, "Swift"),
664+
b.Node(Node::Kind::Identifier, "String")));
665+
666+
CompilerType t = GetCompilerType(b.Mangle(n));
667+
CompilerType instance_type = m_swift_ts.GetInstanceType(t.GetOpaqueQualType());
668+
ASSERT_EQ(instance_type.GetMangledTypeName(), "$sSSD");
669+
};
670+
};

0 commit comments

Comments
 (0)