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,9 +749,19 @@ 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 GetTypeName() and
753
+ // / GetDisplayTypeName().
754
+ // /
755
+ // / String divergences are mostly cosmetic in nature and usually
756
+ // / TypeSystemSwiftTypeRef is returning more accurate results. They only really
757
+ // / matter for GetTypeName() and there only if there is a data formatter
758
+ // / matching that name.
746
759
template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
747
760
if (l != r) {
761
+ // Failure. Dump it for easier debugging.
762
+ llvm::dbgs () << " TypeSystemSwiftTypeRef diverges from SwiftASTContext: "
763
+ << l.GetStringRef () << " != " << r.GetStringRef () << " \n " ;
764
+
748
765
// For some reason the Swift type dumper doesn't attach a module
749
766
// name to the AnyObject protocol, and only that one.
750
767
std::string l_prime = std::regex_replace (
@@ -757,8 +774,29 @@ template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
757
774
r.GetStringRef ().contains (" __ObjC." ) || r.GetStringRef ().contains (" -> ()" ))
758
775
return true ;
759
776
760
- // Failure. Dump it for easier debugging.
761
- llvm::dbgs () << l.GetStringRef () << " != " << r.GetStringRef () << " \n " ;
777
+ std::string r_prime =
778
+ std::regex_replace (r.GetStringRef ().str (), std::regex (" NS" ), " " );
779
+ if (l.GetStringRef () == llvm::StringRef (r_prime))
780
+ return true ;
781
+
782
+ // The way it is currently configured, ASTPrinter's always-qualify
783
+ // mode is turned off. In this mode,
784
+ // TypePrinter::shouldPrintFullyQualified() insists on never
785
+ // printing qualifiers for types that come from Clang modules, but
786
+ // the way this is implemented this rule also fires for types from
787
+ // SDK overlays, which are technically Swift modules. Detecting
788
+ // this in TypeSystemSwiftTypeRef is so complicated that it just
789
+ // isn't worth the effort and we accept over-qualified types
790
+ // instead. It would be best to just always qualify types not from
791
+ // the current module.
792
+ l_prime = std::regex_replace (
793
+ l.GetStringRef ().str (), std::regex (" (CoreGraphics|Foundation|)\\ ." ), " " );
794
+ if (llvm::StringRef (l_prime) == r.GetStringRef ())
795
+ return true ;
796
+
797
+ #ifndef STRICT_VALIDATION
798
+ return true ;
799
+ #endif
762
800
}
763
801
return l == r;
764
802
}
@@ -1040,19 +1078,33 @@ ConstString TypeSystemSwiftTypeRef::GetTypeName(opaque_compiler_type_t type) {
1040
1078
return GetAPINotesManager (source, id);
1041
1079
},
1042
1080
[&]() { return m_swift_ast_context->GetClangImporter (); }, Dem,
1043
- AsMangledName (type));
1081
+ AsMangledName (type), true );
1044
1082
std::string remangled = mangleNode (print_node);
1045
- bool simplified = false ;
1046
- return ConstString (
1047
- SwiftLanguageRuntime::DemangleSymbolAsString (remangled, simplified));
1083
+ return ConstString (SwiftLanguageRuntime::DemangleSymbolAsString (
1084
+ remangled, SwiftLanguageRuntime::eTypeName));
1048
1085
};
1049
1086
VALIDATE_AND_RETURN (impl,
1050
1087
m_swift_ast_context->GetTypeName (ReconstructType (type)));
1051
1088
}
1052
1089
ConstString
1053
1090
TypeSystemSwiftTypeRef::GetDisplayTypeName (opaque_compiler_type_t type,
1054
1091
const SymbolContext *sc) {
1055
- return m_swift_ast_context->GetDisplayTypeName (ReconstructType (type), sc);
1092
+ auto impl = [&]() {
1093
+ using namespace swift ::Demangle;
1094
+ Demangler Dem;
1095
+ NodePointer print_node = GetDemangleTreeForPrinting (
1096
+ m_description, GetModule (),
1097
+ [&](ClangExternalASTSourceCallbacks *source, unsigned id) {
1098
+ return GetAPINotesManager (source, id);
1099
+ },
1100
+ [&]() { return m_swift_ast_context->GetClangImporter (); }, Dem,
1101
+ AsMangledName (type), false );
1102
+ std::string remangled = mangleNode (print_node);
1103
+ return ConstString (SwiftLanguageRuntime::DemangleSymbolAsString (
1104
+ remangled, SwiftLanguageRuntime::eDisplayTypeName, sc));
1105
+ };
1106
+ VALIDATE_AND_RETURN (
1107
+ impl, m_swift_ast_context->GetDisplayTypeName (ReconstructType (type), sc));
1056
1108
}
1057
1109
uint32_t TypeSystemSwiftTypeRef::GetTypeInfo (
1058
1110
opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type) {
0 commit comments