Skip to content

Commit b05c88f

Browse files
Merge pull request #1504 from adrian-prantl/gettypeclass
GettypeclaImplement TypeSystemSwiftTypeRef::GetTypeClass (NFC)
2 parents 322f19d + 293bf8e commit b05c88f

File tree

3 files changed

+114
-40
lines changed

3 files changed

+114
-40
lines changed

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

Lines changed: 14 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5546,18 +5546,11 @@ lldb::TypeClass SwiftASTContext::GetTypeClass(opaque_compiler_type_t type) {
55465546
swift::CanType swift_can_type(GetCanonicalSwiftType(type));
55475547
const swift::TypeKind type_kind = swift_can_type->getKind();
55485548
switch (type_kind) {
5549-
case swift::TypeKind::Error:
5550-
return lldb::eTypeClassOther;
55515549
case swift::TypeKind::BuiltinInteger:
5552-
return lldb::eTypeClassBuiltin;
55535550
case swift::TypeKind::BuiltinFloat:
5554-
return lldb::eTypeClassBuiltin;
55555551
case swift::TypeKind::BuiltinRawPointer:
5556-
return lldb::eTypeClassBuiltin;
55575552
case swift::TypeKind::BuiltinNativeObject:
5558-
return lldb::eTypeClassBuiltin;
55595553
case swift::TypeKind::BuiltinUnsafeValueBuffer:
5560-
return lldb::eTypeClassBuiltin;
55615554
case swift::TypeKind::BuiltinBridgeObject:
55625555
return lldb::eTypeClassBuiltin;
55635556
case swift::TypeKind::BuiltinVector:
@@ -5569,56 +5562,39 @@ lldb::TypeClass SwiftASTContext::GetTypeClass(opaque_compiler_type_t type) {
55695562
case swift::TypeKind::WeakStorage:
55705563
return ToCompilerType(swift_can_type->getReferenceStorageReferent())
55715564
.GetTypeClass();
5572-
case swift::TypeKind::GenericTypeParam:
5573-
return lldb::eTypeClassOther;
5574-
case swift::TypeKind::DependentMember:
5575-
return lldb::eTypeClassOther;
55765565
case swift::TypeKind::Enum:
5566+
case swift::TypeKind::BoundGenericEnum:
55775567
return lldb::eTypeClassUnion;
55785568
case swift::TypeKind::Struct:
5569+
case swift::TypeKind::BoundGenericStruct:
55795570
return lldb::eTypeClassStruct;
55805571
case swift::TypeKind::Class:
5572+
case swift::TypeKind::BoundGenericClass:
55815573
return lldb::eTypeClassClass;
5574+
case swift::TypeKind::GenericTypeParam:
5575+
case swift::TypeKind::DependentMember:
55825576
case swift::TypeKind::Protocol:
5583-
return lldb::eTypeClassOther;
5577+
case swift::TypeKind::ProtocolComposition:
55845578
case swift::TypeKind::Metatype:
5585-
return lldb::eTypeClassOther;
55865579
case swift::TypeKind::Module:
5587-
return lldb::eTypeClassOther;
55885580
case swift::TypeKind::PrimaryArchetype:
55895581
case swift::TypeKind::OpenedArchetype:
55905582
case swift::TypeKind::NestedArchetype:
5591-
return lldb::eTypeClassOther;
5592-
case swift::TypeKind::Function:
5593-
return lldb::eTypeClassFunction;
5594-
case swift::TypeKind::GenericFunction:
5595-
return lldb::eTypeClassFunction;
5596-
case swift::TypeKind::ProtocolComposition:
5597-
return lldb::eTypeClassOther;
5598-
case swift::TypeKind::LValue:
5599-
return lldb::eTypeClassReference;
56005583
case swift::TypeKind::UnboundGeneric:
5601-
return lldb::eTypeClassOther;
5602-
case swift::TypeKind::BoundGenericClass:
5603-
return lldb::eTypeClassClass;
5604-
case swift::TypeKind::BoundGenericEnum:
5605-
return lldb::eTypeClassUnion;
5606-
case swift::TypeKind::BoundGenericStruct:
5607-
return lldb::eTypeClassStruct;
56085584
case swift::TypeKind::TypeVariable:
5609-
return lldb::eTypeClassOther;
56105585
case swift::TypeKind::ExistentialMetatype:
5611-
return lldb::eTypeClassOther;
5612-
case swift::TypeKind::DynamicSelf:
5613-
return lldb::eTypeClassOther;
56145586
case swift::TypeKind::SILBox:
5615-
return lldb::eTypeClassOther;
5616-
case swift::TypeKind::SILFunction:
5617-
return lldb::eTypeClassFunction;
5587+
case swift::TypeKind::DynamicSelf:
56185588
case swift::TypeKind::SILBlockStorage:
5619-
return lldb::eTypeClassOther;
56205589
case swift::TypeKind::Unresolved:
5590+
case swift::TypeKind::Error:
56215591
return lldb::eTypeClassOther;
5592+
case swift::TypeKind::Function:
5593+
case swift::TypeKind::GenericFunction:
5594+
case swift::TypeKind::SILFunction:
5595+
return lldb::eTypeClassFunction;
5596+
case swift::TypeKind::LValue:
5597+
return lldb::eTypeClassReference;
56225598

56235599
case swift::TypeKind::Optional:
56245600
case swift::TypeKind::TypeAlias:

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &Dem,
755755
else if (node->getText() == swift::BUILTIN_TYPE_NAME_BRIDGEOBJECT)
756756
swift_flags |=
757757
eTypeHasChildren | eTypeIsPointer | eTypeIsScalar | eTypeIsObjC;
758-
else if (node->getText() == swift::BUILTIN_TYPE_NAME_VEC)
758+
else if (node->getText().startswith(swift::BUILTIN_TYPE_NAME_VEC))
759759
swift_flags |= eTypeHasChildren | eTypeIsVector;
760760
}
761761
break;
@@ -1461,7 +1461,31 @@ uint32_t TypeSystemSwiftTypeRef::GetTypeInfo(
14611461
}
14621462
lldb::TypeClass
14631463
TypeSystemSwiftTypeRef::GetTypeClass(opaque_compiler_type_t type) {
1464-
return m_swift_ast_context->GetTypeClass(ReconstructType(type));
1464+
auto impl = [&]() {
1465+
uint32_t flags = GetTypeInfo(type, nullptr);
1466+
// The ordering is significant since GetTypeInfo() returns many flags.
1467+
if ((flags & eTypeIsScalar))
1468+
return eTypeClassBuiltin;
1469+
if ((flags & eTypeIsVector))
1470+
return eTypeClassVector;
1471+
if ((flags & eTypeIsTuple))
1472+
return eTypeClassArray;
1473+
if ((flags & eTypeIsEnumeration))
1474+
return eTypeClassUnion;
1475+
if ((flags & eTypeIsProtocol))
1476+
return eTypeClassOther;
1477+
if ((flags & eTypeIsStructUnion))
1478+
return eTypeClassStruct;
1479+
if ((flags & eTypeIsClass))
1480+
return eTypeClassClass;
1481+
if ((flags & eTypeIsReference))
1482+
return eTypeClassReference;
1483+
// This only works because we excluded all other options.
1484+
if ((flags & eTypeIsPointer))
1485+
return eTypeClassFunction;
1486+
return eTypeClassOther;
1487+
};
1488+
VALIDATE_AND_RETURN(impl, GetTypeClass, type, (ReconstructType(type)));
14651489
}
14661490

14671491
// Creating related types

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,77 @@ TEST_F(TestTypeSystemSwiftTypeRef, LanguageVersion) {
357357
ASSERT_EQ(int_type.GetMinimumLanguage(), lldb::eLanguageTypeSwift);
358358
}
359359
}
360+
361+
TEST_F(TestTypeSystemSwiftTypeRef, TypeClass) {
362+
using namespace swift::Demangle;
363+
Demangler dem;
364+
NodeBuilder b(dem);
365+
{
366+
NodePointer n = b.GlobalTypeMangling(b.IntType());
367+
CompilerType t = GetCompilerType(b.Mangle(n));
368+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassBuiltin);
369+
}
370+
{
371+
std::string vec = StringRef(swift::BUILTIN_TYPE_NAME_VEC).str() + "4xInt8";
372+
NodePointer n =
373+
b.GlobalType(b.Node(Node::Kind::BuiltinTypeName, vec.c_str()));
374+
CompilerType t = GetCompilerType(b.Mangle(n));
375+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassVector);
376+
}
377+
{
378+
NodePointer n = b.GlobalType(b.Node(Node::Kind::Tuple));
379+
CompilerType t = GetCompilerType(b.Mangle(n));
380+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassArray);
381+
}
382+
{
383+
NodePointer n =
384+
b.GlobalType(b.Node(Node::Kind::Enum, b.Node(Node::Kind::Module, "M"),
385+
b.Node(Node::Kind::Identifier, "E")));
386+
CompilerType t = GetCompilerType(b.Mangle(n));
387+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassUnion);
388+
}
389+
{
390+
NodePointer n = b.GlobalType(b.Node(Node::Kind::Structure,
391+
b.Node(Node::Kind::Module, "M"),
392+
b.Node(Node::Kind::Identifier, "S")));
393+
CompilerType t = GetCompilerType(b.Mangle(n));
394+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassStruct);
395+
}
396+
{
397+
NodePointer n =
398+
b.GlobalType(b.Node(Node::Kind::Class, b.Node(Node::Kind::Module, "M"),
399+
b.Node(Node::Kind::Identifier, "C")));
400+
CompilerType t = GetCompilerType(b.Mangle(n));
401+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassClass);
402+
}
403+
{
404+
NodePointer n = b.GlobalType(b.Node(
405+
Node::Kind::InOut,
406+
b.Node(Node::Kind::Structure,
407+
b.Node(Node::Kind::Module, swift::STDLIB_NAME),
408+
b.Node(Node::Kind::Identifier, swift::BUILTIN_TYPE_NAME_INT))));
409+
CompilerType t = GetCompilerType(b.Mangle(n));
410+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassReference);
411+
}
412+
{
413+
NodePointer n = b.GlobalType(
414+
b.Node(Node::Kind::FunctionType,
415+
b.Node(Node::Kind::ArgumentTuple,
416+
b.Node(Node::Kind::Type, b.Node(Node::Kind::Tuple))),
417+
b.Node(Node::Kind::ReturnType,
418+
b.Node(Node::Kind::Type, b.Node(Node::Kind::Tuple)))));
419+
CompilerType t = GetCompilerType(b.Mangle(n));
420+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassFunction);
421+
}
422+
{
423+
NodePointer n = b.GlobalType(b.Node(
424+
Node::Kind::ProtocolList,
425+
b.Node(Node::Kind::TypeList,
426+
b.Node(Node::Kind::Type,
427+
b.Node(Node::Kind::Protocol,
428+
b.Node(Node::Kind::Module, swift::STDLIB_NAME),
429+
b.Node(Node::Kind::Identifier, "Error"))))));
430+
CompilerType t = GetCompilerType(b.Mangle(n));
431+
ASSERT_EQ(t.GetTypeClass(), lldb::eTypeClassOther);
432+
}
433+
}

0 commit comments

Comments
 (0)