Skip to content

Commit 03cbcd5

Browse files
Merge pull request #2055 from adrian-prantl/70734497-next
Various GetTypeInfo improvements
2 parents b44aa5e + cb4826e commit 03cbcd5

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,21 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetDemangleTreeForPrinting(
720720
return canonical;
721721
}
722722

723+
/// Determine wether this demangle tree contains an unresolved type alias.
724+
static bool ContainsGenericTypeParameter(swift::Demangle::NodePointer node) {
725+
if (!node)
726+
return false;
727+
728+
if (node->getKind() == swift::Demangle::Node::Kind::DependentGenericParamType)
729+
return true;
730+
731+
for (swift::Demangle::NodePointer child : *node)
732+
if (ContainsGenericTypeParameter(child))
733+
return true;
734+
735+
return false;
736+
}
737+
723738
/// Collect TypeInfo flags from a demangle tree. For most attributes
724739
/// this can stop scanning at the outmost type, however in order to
725740
/// determine whether a node is generic or not, it needs to visit all
@@ -770,7 +785,6 @@ static uint32_t collectTypeInfo(SwiftASTContext *module_holder,
770785
}
771786
else
772787
switch (node->getKind()) {
773-
774788
case Node::Kind::SugaredOptional:
775789
swift_flags |= eTypeIsGeneric | eTypeIsBound | eTypeHasChildren |
776790
eTypeHasValue | eTypeIsEnumeration;
@@ -818,8 +832,8 @@ static uint32_t collectTypeInfo(SwiftASTContext *module_holder,
818832
node->getText() == swift::BUILTIN_TYPE_NAME_UNKNOWNOBJECT)
819833
swift_flags |=
820834
eTypeHasChildren | eTypeIsPointer | eTypeIsScalar | eTypeIsObjC;
821-
else if (node->getText() == swift::BUILTIN_TYPE_NAME_FLOAT ||
822-
node->getText() == swift::BUILTIN_TYPE_NAME_FLOAT_PPC)
835+
else if (node->getText().startswith(swift::BUILTIN_TYPE_NAME_FLOAT) ||
836+
node->getText().startswith(swift::BUILTIN_TYPE_NAME_FLOAT_PPC))
823837
swift_flags |= eTypeIsFloat | eTypeIsScalar;
824838
else if (node->getText().startswith(swift::BUILTIN_TYPE_NAME_VEC))
825839
swift_flags |= eTypeHasChildren | eTypeIsVector;
@@ -841,8 +855,7 @@ static uint32_t collectTypeInfo(SwiftASTContext *module_holder,
841855
if (node->getNumChildren() != 2)
842856
break;
843857
// Bug-for-bug compatibility.
844-
if (!(collectTypeInfo(module_holder, dem, node->getChild(1)) &
845-
eTypeIsGenericTypeParam))
858+
if (!ContainsGenericTypeParameter(node->getChild(1)))
846859
swift_flags |= eTypeHasValue | eTypeHasChildren;
847860
auto module = node->getChild(0);
848861
if (module->hasText() &&

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,49 @@ TEST_F(TestTypeSystemSwiftTypeRef, Function) {
196196
}
197197
}
198198

199+
TEST_F(TestTypeSystemSwiftTypeRef, GetTypeInfo) {
200+
using namespace swift::Demangle;
201+
Demangler dem;
202+
NodeBuilder b(dem);
203+
{
204+
std::string float32;
205+
llvm::raw_string_ostream(float32) << swift::BUILTIN_TYPE_NAME_FLOAT << "32";
206+
NodePointer n = b.GlobalType(b.Node(Node::Kind::BuiltinTypeName, float32));
207+
CompilerType p = GetCompilerType(b.Mangle(n));
208+
ASSERT_EQ(p.GetTypeInfo() & (eTypeIsFloat | eTypeIsScalar),
209+
eTypeIsFloat | eTypeIsScalar);
210+
}
211+
{
212+
NodePointer n = b.GlobalType(b.Node(
213+
Node::Kind::BoundGenericEnum,
214+
b.Node(Node::Kind::Type,
215+
b.Node(Node::Kind::Enum,
216+
b.Node(Node::Kind::Module, swift::STDLIB_NAME),
217+
b.Node(Node::Kind::Identifier, "Optional"))),
218+
b.Node(
219+
Node::Kind::TypeList,
220+
b.Node(
221+
Node::Kind::Type,
222+
b.Node(
223+
Node::Kind::BoundGenericStructure,
224+
b.Node(
225+
Node::Kind::Type,
226+
b.Node(Node::Kind::Structure,
227+
b.Node(Node::Kind::Module, swift::STDLIB_NAME),
228+
b.Node(Node::Kind::Identifier,
229+
"UnsafeMutablePointer"))),
230+
b.Node(Node::Kind::TypeList,
231+
b.Node(Node::Kind::Type,
232+
b.Node(Node::Kind::DependentGenericParamType,
233+
b.NodeWithIndex(Node::Kind::Index, 0),
234+
b.NodeWithIndex(Node::Kind::Index,
235+
0)))))))));
236+
CompilerType p = GetCompilerType(b.Mangle(n));
237+
ASSERT_EQ(p.GetTypeInfo(), (eTypeIsEnumeration | eTypeIsSwift |
238+
eTypeIsGeneric | eTypeIsBound));
239+
}
240+
}
241+
199242
TEST_F(TestTypeSystemSwiftTypeRef, Pointer) {
200243
using namespace swift::Demangle;
201244
Demangler dem;

0 commit comments

Comments
 (0)