12
12
13
13
#include " lldb/Symbol/SwiftASTContext.h"
14
14
15
+ #include " lldb/Symbol/CompileUnit.h"
15
16
#include " lldb/Symbol/TypeList.h"
16
17
#include " lldb/Symbol/TypeMap.h"
17
18
#include " lldb/Target/SwiftLanguageRuntime.h"
@@ -385,13 +386,15 @@ GetNodeForPrinting(const std::string &m_description, lldb_private::Module &M,
385
386
GetClangImporterFn get_clangimporter,
386
387
swift::Demangle::Demangler &Dem,
387
388
swift::Demangle::NodePointer node,
389
+ bool resolve_objc_module,
388
390
bool desugar = true ) {
389
391
if (!node)
390
392
return node;
391
393
using namespace swift ::Demangle;
392
394
auto getNodeForPrinting = [&](NodePointer node) -> NodePointer {
393
395
return GetNodeForPrinting (m_description, M, get_apinotes_manager,
394
- get_clangimporter, Dem, node, desugar);
396
+ get_clangimporter, Dem, node, resolve_objc_module,
397
+ desugar);
395
398
};
396
399
397
400
NodePointer canonical = nullptr ;
@@ -415,13 +418,17 @@ GetNodeForPrinting(const std::string &m_description, lldb_private::Module &M,
415
418
llvm::SmallVector<CompilerContext, 4 > DeclCtx;
416
419
clang_type->GetDeclContext (DeclCtx);
417
420
StringRef toplevel_module;
418
- for (auto &Context : DeclCtx)
419
- if (Context.kind == CompilerContextKind::Module) {
420
- toplevel_module = Context.name .GetStringRef ();
421
+ if (resolve_objc_module) {
422
+ for (auto &Context : DeclCtx)
423
+ if (Context.kind == CompilerContextKind::Module) {
424
+ toplevel_module = Context.name .GetStringRef ();
425
+ break ;
426
+ }
427
+ if (toplevel_module.empty ())
421
428
break ;
422
- }
423
- if ( toplevel_module. empty ())
424
- break ;
429
+ } else {
430
+ toplevel_module = swift::MANGLING_MODULE_OBJC;
431
+ }
425
432
426
433
// Create a new node with the Clang module instead of "__C".
427
434
NodePointer renamed = Dem.createNode (kind);
@@ -630,13 +637,13 @@ static swift::Demangle::NodePointer GetDemangleTreeForPrinting(
630
637
const std::string &m_description, lldb_private::Module *Module,
631
638
GetAPINotesManagerFn get_apinotes_manager,
632
639
GetClangImporterFn get_clangimporter, swift::Demangle::Demangler &Dem,
633
- const char *mangled_name) {
640
+ const char *mangled_name, bool resolve_objc_module ) {
634
641
NodePointer node = Dem.demangleSymbol (mangled_name);
635
642
if (!Module)
636
643
return node;
637
644
NodePointer canonical =
638
645
GetNodeForPrinting (m_description, *Module, get_apinotes_manager,
639
- get_clangimporter, Dem, node);
646
+ get_clangimporter, Dem, node, resolve_objc_module );
640
647
return canonical;
641
648
}
642
649
@@ -742,7 +749,7 @@ template <typename T> bool Equivalent(T l, T r) { return l == r; }
742
749
template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
743
750
return l.GetMangledTypeName () == r.GetMangledTypeName ();
744
751
} // namespace
745
- // This one is particularly taylored for GetName().
752
+ // / This one is particularly taylored for GetName() and GetDisplayName ().
746
753
template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
747
754
if (l != r) {
748
755
// For some reason the Swift type dumper doesn't attach a module
@@ -757,6 +764,26 @@ template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
757
764
r.GetStringRef ().contains (" __ObjC." ) || r.GetStringRef ().contains (" -> ()" ))
758
765
return true ;
759
766
767
+ std::string r_prime =
768
+ std::regex_replace (r.GetStringRef ().str (), std::regex (" NS" ), " " );
769
+ if (l.GetStringRef () == llvm::StringRef (r_prime))
770
+ return true ;
771
+
772
+ // The way it is currently configured, ASTPrinter's always-qualify
773
+ // mode is turned off. In this mode,
774
+ // TypePrinter::shouldPrintFullyQualified() insists on never
775
+ // printing qualifiers for types that come from Clang modules, but
776
+ // the way this is implemented this rule also fires for types from
777
+ // SDK overlays, which are technically Swift modules. Detecting
778
+ // this in TypeSystemSwiftTypeRef is so complicated that it just
779
+ // isn't worth the effort and we accept over-qualified types
780
+ // instead. It would be best to just always qualify types not from
781
+ // the current module.
782
+ l_prime = std::regex_replace (
783
+ l.GetStringRef ().str (), std::regex (" (CoreGraphics|Foundation|)\\ ." ), " " );
784
+ if (llvm::StringRef (l_prime) == r.GetStringRef ())
785
+ return true ;
786
+
760
787
// Failure. Dump it for easier debugging.
761
788
llvm::dbgs () << l.GetStringRef () << " != " << r.GetStringRef () << " \n " ;
762
789
}
@@ -1040,19 +1067,33 @@ ConstString TypeSystemSwiftTypeRef::GetTypeName(opaque_compiler_type_t type) {
1040
1067
return GetAPINotesManager (source, id);
1041
1068
},
1042
1069
[&]() { return m_swift_ast_context->GetClangImporter (); }, Dem,
1043
- AsMangledName (type));
1070
+ AsMangledName (type), true );
1044
1071
std::string remangled = mangleNode (print_node);
1045
- bool simplified = false ;
1046
- return ConstString (
1047
- SwiftLanguageRuntime::DemangleSymbolAsString (remangled, simplified));
1072
+ return ConstString (SwiftLanguageRuntime::DemangleSymbolAsString (
1073
+ remangled, SwiftLanguageRuntime::eTypeName));
1048
1074
};
1049
1075
VALIDATE_AND_RETURN (impl,
1050
1076
m_swift_ast_context->GetTypeName (ReconstructType (type)));
1051
1077
}
1052
1078
ConstString
1053
1079
TypeSystemSwiftTypeRef::GetDisplayTypeName (opaque_compiler_type_t type,
1054
1080
const SymbolContext *sc) {
1055
- return m_swift_ast_context->GetDisplayTypeName (ReconstructType (type), sc);
1081
+ auto impl = [&]() {
1082
+ using namespace swift ::Demangle;
1083
+ Demangler Dem;
1084
+ NodePointer print_node = GetDemangleTreeForPrinting (
1085
+ m_description, GetModule (),
1086
+ [&](ClangExternalASTSourceCallbacks *source, unsigned id) {
1087
+ return GetAPINotesManager (source, id);
1088
+ },
1089
+ [&]() { return m_swift_ast_context->GetClangImporter (); }, Dem,
1090
+ AsMangledName (type), false );
1091
+ std::string remangled = mangleNode (print_node);
1092
+ return ConstString (SwiftLanguageRuntime::DemangleSymbolAsString (
1093
+ remangled, SwiftLanguageRuntime::eDisplayTypeName, sc));
1094
+ };
1095
+ VALIDATE_AND_RETURN (
1096
+ impl, m_swift_ast_context->GetDisplayTypeName (ReconstructType (type), sc));
1056
1097
}
1057
1098
uint32_t TypeSystemSwiftTypeRef::GetTypeInfo (
1058
1099
opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type) {
0 commit comments