Skip to content

Commit cf7cb6b

Browse files
committed
[lldb] Consider local decls when getting base name of a node
1 parent e1da6a4 commit cf7cb6b

File tree

4 files changed

+66
-32
lines changed

4 files changed

+66
-32
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,36 +1167,6 @@ SwiftLanguageRuntimeImpl::GetNumFields(CompilerType type,
11671167
}
11681168
}
11691169

1170-
/// Return the base name of the topmost nominal type.
1171-
static llvm::StringRef GetBaseName(swift::Demangle::NodePointer node) {
1172-
if (!node)
1173-
return {};
1174-
using namespace swift::Demangle;
1175-
switch (node->getKind()) {
1176-
case Node::Kind::Structure:
1177-
case Node::Kind::Class: {
1178-
if (node->getNumChildren() != 2)
1179-
return {};
1180-
NodePointer ident = node->getChild(1);
1181-
if (ident && ident->hasText())
1182-
return ident->getText();
1183-
if (ident->getKind() == Node::Kind::PrivateDeclName) {
1184-
if (ident->getNumChildren() != 2)
1185-
return {};
1186-
ident = ident->getChild(1);
1187-
if (ident && ident->hasText())
1188-
return ident->getText();
1189-
}
1190-
return {};
1191-
}
1192-
default:
1193-
// Visit the child nodes.
1194-
for (NodePointer child : *node)
1195-
return GetBaseName(child);
1196-
return {};
1197-
}
1198-
}
1199-
12001170
static CompilerType
12011171
GetTypeFromTypeRef(TypeSystemSwiftTypeRef &ts,
12021172
const swift::reflection::TypeRef *type_ref) {
@@ -1488,7 +1458,8 @@ CompilerType SwiftLanguageRuntimeImpl::GetChildCompilerTypeAtIndex(
14881458
Demangler dem;
14891459
auto mangled = type.GetMangledTypeName().GetStringRef();
14901460
NodePointer type_node = dem.demangleSymbol(mangled);
1491-
llvm::StringRef type_name = GetBaseName(ts->CanonicalizeSugar(dem, type_node));
1461+
llvm::StringRef type_name = TypeSystemSwiftTypeRef::GetBaseName(
1462+
ts->CanonicalizeSugar(dem, type_node));
14921463
llvm::SmallVector<SuperClassType, 2> supers;
14931464
ForEachSuperClassType(*valobj, [&](SuperClassType sc) -> bool {
14941465
if (!found_start) {
@@ -1497,7 +1468,7 @@ CompilerType SwiftLanguageRuntimeImpl::GetChildCompilerTypeAtIndex(
14971468
// reach the requested type.
14981469
if (auto *tr = sc.get_typeref()) {
14991470
NodePointer base_class = tr->getDemangling(dem);
1500-
if (GetBaseName(base_class) != type_name)
1471+
if (TypeSystemSwiftTypeRef::GetBaseName(base_class) != type_name)
15011472
return false;
15021473
found_start = true;
15031474
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,38 @@ TypeSystemSwiftTypeRef::CanonicalizeSugar(swift::Demangle::Demangler &dem,
106106
});
107107
}
108108

109+
llvm::StringRef
110+
TypeSystemSwiftTypeRef::GetBaseName(swift::Demangle::NodePointer node) {
111+
if (!node)
112+
return {};
113+
114+
using namespace swift::Demangle;
115+
switch (node->getKind()) {
116+
case Node::Kind::Structure:
117+
case Node::Kind::Class: {
118+
if (node->getNumChildren() != 2)
119+
return {};
120+
NodePointer ident = node->getChild(1);
121+
if (ident && ident->hasText())
122+
return ident->getText();
123+
if (ident->getKind() == Node::Kind::PrivateDeclName ||
124+
ident->getKind() == Node::Kind::LocalDeclName) {
125+
if (ident->getNumChildren() != 2)
126+
return {};
127+
ident = ident->getChild(1);
128+
if (ident && ident->hasText())
129+
return ident->getText();
130+
}
131+
return {};
132+
}
133+
default:
134+
// Visit the child nodes.
135+
for (NodePointer child : *node)
136+
return GetBaseName(child);
137+
return {};
138+
}
139+
}
140+
109141
/// Create a mangled name for a type alias node.
110142
static ConstString GetTypeAlias(swift::Demangle::Demangler &dem,
111143
swift::Demangle::NodePointer node) {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,9 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
279279
swift::Demangle::Demangler &dem,
280280
llvm::StringRef mangled_name);
281281

282+
/// Return the base name of the topmost nominal type.
283+
static llvm::StringRef GetBaseName(swift::Demangle::NodePointer node);
284+
282285
/// Use API notes to determine the swiftified name of \p clang_decl.
283286
std::string GetSwiftName(const clang::Decl *clang_decl,
284287
TypeSystemClang &clang_typesystem) override;

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,3 +705,31 @@ TEST_F(TestTypeSystemSwiftTypeRef, IsTypedefType) {
705705
};
706706
}
707707

708+
TEST_F(TestTypeSystemSwiftTypeRef, GetBaseName) {
709+
using namespace swift::Demangle;
710+
Demangler dem;
711+
NodeBuilder b(dem);
712+
{
713+
NodePointer n =
714+
b.Node(Node::Kind::Class,
715+
b.Node(Node::Kind::Function,
716+
b.Node(Node::Kind::Module, "a"),
717+
b.Node(Node::Kind::Identifier, "main"),
718+
b.Node(Node::Kind::Type,
719+
b.Node(Node::Kind::FunctionType,
720+
b.Node(Node::Kind::ArgumentTuple,
721+
b.Node(Node::Kind::Type,
722+
b.Node(Node::Kind::Tuple)))),
723+
b.Node(Node::Kind::ReturnType,
724+
b.Node(Node::Kind::Type,
725+
b.Node(Node::Kind::Structure,
726+
b.Node(Node::Kind::Module, "Swift"),
727+
b.Node(Node::Kind::Identifier, "Int")))))),
728+
b.Node(Node::Kind::LocalDeclName,
729+
b.NodeWithIndex(Node::Kind::Number, 0),
730+
b.Node(Node::Kind::Identifier, "Base")));
731+
auto name = TypeSystemSwiftTypeRef::GetBaseName(n);
732+
ASSERT_EQ(name, "Base");
733+
}
734+
}
735+

0 commit comments

Comments
 (0)