Skip to content

Commit 9667e70

Browse files
committed
Factor out TypeSystemSwiftTypeRef::GetSwiftified() (NFC)
(cherry picked from commit d00080a)
1 parent 04b9f7d commit 9667e70

File tree

2 files changed

+73
-62
lines changed

2 files changed

+73
-62
lines changed

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

Lines changed: 66 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,70 @@ static StringRef GetObjCTypeName(swift::Demangle::NodePointer node) {
486486
return {};
487487
}
488488

489+
swift::Demangle::NodePointer
490+
TypeSystemSwiftTypeRef::GetSwiftified(swift::Demangle::Demangler &Dem,
491+
swift::Demangle::NodePointer node,
492+
bool resolve_objc_module) {
493+
StringRef ident = GetObjCTypeName(node);
494+
if (ident.empty())
495+
return node;
496+
auto *Module = GetModule();
497+
if (!Module)
498+
return node;
499+
500+
// This is an imported Objective-C type; look it up in the
501+
// debug info.
502+
TypeSP clang_type = LookupClangType(*Module, ident);
503+
if (!clang_type)
504+
return node;
505+
506+
// Extract the toplevel Clang module name from the debug info.
507+
llvm::SmallVector<CompilerContext, 4> DeclCtx;
508+
clang_type->GetDeclContext(DeclCtx);
509+
StringRef toplevel_module;
510+
if (resolve_objc_module) {
511+
for (auto &Context : DeclCtx)
512+
if (Context.kind == CompilerContextKind::Module) {
513+
toplevel_module = Context.name.GetStringRef();
514+
break;
515+
}
516+
if (toplevel_module.empty())
517+
return node;
518+
} else {
519+
toplevel_module = swift::MANGLING_MODULE_OBJC;
520+
}
521+
522+
// Create a new node with the Clang module instead of "__C".
523+
NodePointer renamed = Dem.createNode(node->getKind());
524+
NodePointer module = Dem.createNode(Node::Kind::Module, toplevel_module);
525+
renamed->addChild(module, Dem);
526+
527+
// This order is significant, because of `typedef tag`.
528+
swift::ClangTypeKind kinds[] = {swift::ClangTypeKind::Typedef,
529+
swift::ClangTypeKind::Tag,
530+
swift::ClangTypeKind::ObjCProtocol};
531+
clang::NamedDecl *clang_decl = nullptr;
532+
CompilerType compiler_type = clang_type->GetForwardCompilerType();
533+
auto *clang_ts =
534+
llvm::dyn_cast_or_null<TypeSystemClang>(compiler_type.GetTypeSystem());
535+
if (!clang_ts)
536+
return node;
537+
clang::QualType qual_type = ClangUtil::GetQualType(compiler_type);
538+
for (auto kind : kinds) {
539+
clang_decl = llvm::dyn_cast_or_null<clang::NamedDecl>(
540+
GetDeclForTypeAndKind(qual_type, kind));
541+
if (clang_decl)
542+
break;
543+
}
544+
if (!clang_decl)
545+
return node;
546+
547+
std::string swift_name = GetSwiftName(clang_decl, *clang_ts);
548+
NodePointer identifier = Dem.createNode(Node::Kind::Identifier, swift_name);
549+
renamed->addChild(identifier, Dem);
550+
return renamed;
551+
}
552+
489553
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetNodeForPrintingImpl(
490554
swift::Demangle::Demangler &Dem, swift::Demangle::NodePointer node,
491555
bool resolve_objc_module, bool desugar) {
@@ -501,68 +565,8 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetNodeForPrintingImpl(
501565
switch (kind) {
502566
case Node::Kind::Class:
503567
case Node::Kind::Structure:
504-
case Node::Kind::TypeAlias: {
505-
StringRef ident = GetObjCTypeName(node);
506-
if (ident.empty())
507-
return node;
508-
509-
auto *Module = GetModule();
510-
if (!Module)
511-
return node;
512-
513-
// This is an imported Objective-C type; look it up in the
514-
// debug info.
515-
TypeSP clang_type = LookupClangType(*Module, ident);
516-
if (!clang_type)
517-
return node;
518-
519-
// Extract the toplevel Clang module name from the debug info.
520-
llvm::SmallVector<CompilerContext, 4> DeclCtx;
521-
clang_type->GetDeclContext(DeclCtx);
522-
StringRef toplevel_module;
523-
if (resolve_objc_module) {
524-
for (auto &Context : DeclCtx)
525-
if (Context.kind == CompilerContextKind::Module) {
526-
toplevel_module = Context.name.GetStringRef();
527-
break;
528-
}
529-
if (toplevel_module.empty())
530-
break;
531-
} else {
532-
toplevel_module = swift::MANGLING_MODULE_OBJC;
533-
}
534-
535-
// Create a new node with the Clang module instead of "__C".
536-
NodePointer renamed = Dem.createNode(kind);
537-
NodePointer module =
538-
Dem.createNode(Node::Kind::Module, toplevel_module);
539-
renamed->addChild(module, Dem);
540-
541-
// This order is significant, because of `typedef tag`.
542-
swift::ClangTypeKind kinds[] = {swift::ClangTypeKind::Typedef,
543-
swift::ClangTypeKind::Tag,
544-
swift::ClangTypeKind::ObjCProtocol};
545-
clang::NamedDecl *clang_decl = nullptr;
546-
CompilerType compiler_type = clang_type->GetForwardCompilerType();
547-
auto *clang_ts =
548-
llvm::dyn_cast_or_null<TypeSystemClang>(compiler_type.GetTypeSystem());
549-
if (!clang_ts)
550-
break;
551-
clang::QualType qual_type = ClangUtil::GetQualType(compiler_type);
552-
for (auto kind : kinds) {
553-
clang_decl = llvm::dyn_cast_or_null<clang::NamedDecl>(
554-
GetDeclForTypeAndKind(qual_type, kind));
555-
if (clang_decl)
556-
break;
557-
}
558-
if (!clang_decl)
559-
break;
560-
561-
std::string swift_name = GetSwiftName(clang_decl, *clang_ts);
562-
NodePointer identifier = Dem.createNode(Node::Kind::Identifier, swift_name);
563-
renamed->addChild(identifier, Dem);
564-
return renamed;
565-
}
568+
case Node::Kind::TypeAlias:
569+
return GetSwiftified(Dem, node, resolve_objc_module);
566570

567571
//
568572
// The remaining cases are all about bug-for-bug compatibility

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,13 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
285285
DemangleCanonicalType(swift::Demangle::Demangler &Dem,
286286
lldb::opaque_compiler_type_t type);
287287

288+
/// If \p node is a Struct/Class/Typedef in the __C module, return a
289+
/// Swiftified node by looking up the name in the corresponding APINotes and
290+
/// optionally putting it into the correctly named module.
291+
swift::Demangle::NodePointer GetSwiftified(swift::Demangle::Demangler &Dem,
292+
swift::Demangle::NodePointer node,
293+
bool resolve_objc_module);
294+
288295
/// Replace all "__C" module names with their actual Clang module
289296
/// names. This is the recursion step of \p
290297
/// GetDemangleTreeForPrinting(). Don't call it directly.

0 commit comments

Comments
 (0)