@@ -486,6 +486,70 @@ static StringRef GetObjCTypeName(swift::Demangle::NodePointer node) {
486
486
return {};
487
487
}
488
488
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
+
489
553
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetNodeForPrintingImpl (
490
554
swift::Demangle::Demangler &Dem, swift::Demangle::NodePointer node,
491
555
bool resolve_objc_module, bool desugar) {
@@ -501,68 +565,8 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetNodeForPrintingImpl(
501
565
switch (kind) {
502
566
case Node::Kind::Class:
503
567
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);
566
570
567
571
//
568
572
// The remaining cases are all about bug-for-bug compatibility
0 commit comments