Skip to content

Commit 293bf8e

Browse files
committed
Implement TypeSystemSwiftTypeRef::GetTypeClass (NFC)
and add a unit test for it.
1 parent 63182b1 commit 293bf8e

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
@@ -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)