Skip to content

Commit 60eae58

Browse files
committed
Implement TypeSystemSwiftTypeRef::GetTypeClass (NFC)
and add a unit test for it. (cherry picked from commit 293bf8e)
1 parent 5a504c7 commit 60eae58

File tree

2 files changed

+100
-2
lines changed

2 files changed

+100
-2
lines changed

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

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

14651489
// 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)