@@ -23,6 +23,7 @@ using namespace lldb;
2323using namespace lldb_private ;
2424using namespace llvm ;
2525
26+ namespace lldb_private {
2627struct TestTypeSystemSwiftTypeRef : public testing ::Test {
2728 std::shared_ptr<TypeSystemSwiftTypeRef> m_swift_ts;
2829
@@ -32,7 +33,13 @@ struct TestTypeSystemSwiftTypeRef : public testing::Test {
3233 ConstString internalized (mangled_name);
3334 return m_swift_ts->GetTypeFromMangledTypename (internalized);
3435 }
36+ swift::Demangle::NodePointer
37+ DemangleCanonicalOutermostType (swift::Demangle::Demangler &dem,
38+ lldb::opaque_compiler_type_t type) {
39+ return m_swift_ts->DemangleCanonicalOutermostType (dem, type);
40+ }
3541};
42+ } // namespace lldb_private
3643
3744// / Helper class to conveniently construct demangle tree hierarchies.
3845class NodeBuilder {
@@ -79,6 +86,15 @@ class NodeBuilder {
7986 Node (Node::Kind::Module, swift::STDLIB_NAME),
8087 Node (Node::Kind::Identifier, swift::BUILTIN_TYPE_NAME_FLOAT)));
8188 }
89+ NodePointer DesugaredOptionalType (NodePointer type) {
90+ return Node (Node::Kind::Type,
91+ Node (Node::Kind::BoundGenericEnum,
92+ Node (Node::Kind::Type,
93+ Node (Node::Kind::Enum,
94+ Node (Node::Kind::Module, swift::STDLIB_NAME),
95+ Node (Node::Kind::Identifier, " Optional" ))),
96+ Node (Node::Kind::TypeList, type)));
97+ }
8298 NodePointer GlobalTypeMangling (NodePointer type) {
8399 assert (type && type->getKind () == Node::Kind::Type);
84100 return Node (Node::Kind::Global, Node (Node::Kind::TypeMangling, type));
@@ -1025,3 +1041,42 @@ TEST_F(TestTypeSystemSwiftTypeRef, Error) {
10251041 ASSERT_TRUE (m_swift_ts->ContainsError (opaque));
10261042 }
10271043}
1044+
1045+ TEST_F (TestTypeSystemSwiftTypeRef, Canonicalize) {
1046+ using namespace swift ::Demangle;
1047+ Demangler dem;
1048+ NodeBuilder b (dem);
1049+ {
1050+ {
1051+ NodePointer n0 =
1052+ b.GlobalType (b.Node (Node::Kind::SugaredOptional, b.IntType ()));
1053+ NodePointer n1 =
1054+ b.GlobalTypeMangling (b.DesugaredOptionalType (b.IntType ()));
1055+ CompilerType sugared = GetCompilerType (b.Mangle (n0));
1056+ CompilerType desugared = GetCompilerType (b.Mangle (n1));
1057+ ASSERT_EQ (sugared.GetCanonicalType ().GetMangledTypeName (),
1058+ desugared.GetMangledTypeName ());
1059+ }
1060+ {
1061+ NodePointer n0 = b.GlobalType (
1062+ b.Node (Node::Kind::SugaredOptional,
1063+ b.Node (Node::Kind::Type,
1064+ b.Node (Node::Kind::SugaredOptional, b.IntType ()))));
1065+ NodePointer n1 = b.GlobalTypeMangling (
1066+ b.DesugaredOptionalType (b.DesugaredOptionalType (b.IntType ())));
1067+ CompilerType sugared = GetCompilerType (b.Mangle (n0));
1068+ CompilerType desugared = GetCompilerType (b.Mangle (n1));
1069+ ASSERT_EQ (sugared.GetCanonicalType ().GetMangledTypeName (),
1070+ desugared.GetMangledTypeName ());
1071+
1072+ NodePointer n2 = b.GlobalType (
1073+ DemangleCanonicalOutermostType (dem, sugared.GetOpaqueQualType ()));
1074+ NodePointer n3 = b.GlobalTypeMangling (b.DesugaredOptionalType (
1075+ b.Node (Node::Kind::SugaredOptional, b.IntType ())));
1076+ CompilerType single_desugared2 = GetCompilerType (b.Mangle (n2));
1077+ CompilerType single_desugared3 = GetCompilerType (b.Mangle (n3));
1078+ ASSERT_EQ (single_desugared2.GetMangledTypeName (),
1079+ single_desugared3.GetMangledTypeName ());
1080+ }
1081+ }
1082+ }
0 commit comments