@@ -23,6 +23,7 @@ using namespace lldb;
23
23
using namespace lldb_private ;
24
24
using namespace llvm ;
25
25
26
+ namespace lldb_private {
26
27
struct TestTypeSystemSwiftTypeRef : public testing ::Test {
27
28
std::shared_ptr<TypeSystemSwiftTypeRef> m_swift_ts;
28
29
@@ -32,7 +33,13 @@ struct TestTypeSystemSwiftTypeRef : public testing::Test {
32
33
ConstString internalized (mangled_name);
33
34
return m_swift_ts->GetTypeFromMangledTypename (internalized);
34
35
}
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
+ }
35
41
};
42
+ } // namespace lldb_private
36
43
37
44
// / Helper class to conveniently construct demangle tree hierarchies.
38
45
class NodeBuilder {
@@ -79,6 +86,15 @@ class NodeBuilder {
79
86
Node (Node::Kind::Module, swift::STDLIB_NAME),
80
87
Node (Node::Kind::Identifier, swift::BUILTIN_TYPE_NAME_FLOAT)));
81
88
}
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
+ }
82
98
NodePointer GlobalTypeMangling (NodePointer type) {
83
99
assert (type && type->getKind () == Node::Kind::Type);
84
100
return Node (Node::Kind::Global, Node (Node::Kind::TypeMangling, type));
@@ -1025,3 +1041,42 @@ TEST_F(TestTypeSystemSwiftTypeRef, Error) {
1025
1041
ASSERT_TRUE (m_swift_ts->ContainsError (opaque));
1026
1042
}
1027
1043
}
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