Followup to D134378.
With PrintingPolicy::SuppressScope, we'd also not print the scope in template params. The intention was only to skip the scope for the class because we expect template params to be fully qualified when comparing them for simple template names.
Instead, use `NamedDecl::getNameForDiagnostic` if we're dealing with a tag, which is what we actually use when emitting debug info in clang. That already has an option to suppress the scope on the base name.
Reviewed By: dblaikie
Differential Revision: https://reviews.llvm.org/D137583
return printing_policy;
}
-std::string TypeSystemClang::GetTypeNameForDecl(const NamedDecl *named_decl) {
+std::string TypeSystemClang::GetTypeNameForDecl(const NamedDecl *named_decl,
+ bool qualified) {
clang::PrintingPolicy printing_policy = GetTypePrintingPolicy();
std::string result;
llvm::raw_string_ostream os(result);
- named_decl->printQualifiedName(os, printing_policy);
+ named_decl->getNameForDiagnostic(os, printing_policy, qualified);
return result;
}
}
ConstString TypeSystemClang::GetTypeName(lldb::opaque_compiler_type_t type,
- bool BaseOnly) {
+ bool base_only) {
if (!type)
return ConstString();
return ConstString(GetTypeNameForDecl(typedef_decl));
}
- clang::PrintingPolicy printing_policy(GetTypePrintingPolicy());
- printing_policy.SuppressScope = BaseOnly;
- return ConstString(qual_type.getAsString(printing_policy));
+ // For consistency, this follows the same code path that clang uses to emit
+ // debug info. This also handles when we don't want any scopes preceding the
+ // name.
+ if (auto *named_decl = qual_type->getAsTagDecl())
+ return ConstString(GetTypeNameForDecl(named_decl, !base_only));
+
+ return ConstString(qual_type.getAsString(GetTypePrintingPolicy()));
}
ConstString
// Accessors
ConstString GetTypeName(lldb::opaque_compiler_type_t type,
- bool BaseOnly) override;
+ bool base_only) override;
ConstString GetDisplayTypeName(lldb::opaque_compiler_type_t type) override;
clang::PrintingPolicy GetTypePrintingPolicy();
/// Returns the internal type name for the given NamedDecl using the
/// type printing policy.
- std::string GetTypeNameForDecl(const clang::NamedDecl *named_decl);
+ std::string GetTypeNameForDecl(const clang::NamedDecl *named_decl,
+ bool qualified = true);
const clang::ClassTemplateSpecializationDecl *
GetAsTemplateSpecialization(lldb::opaque_compiler_type_t type);
self.expect("image lookup -A -t 'Foo<int>::Nested<int>'", DATA_TYPES_DISPLAYED_CORRECTLY, error=True)
self.expect("image lookup -A -t 'Nested<char>'", DATA_TYPES_DISPLAYED_CORRECTLY, substrs=["1 match found"])
self.expect("image lookup -A -t '::Nested<char>'", DATA_TYPES_DISPLAYED_CORRECTLY, error=True)
+ self.expect("image lookup -A -t 'Foo<int>::Nested<ns::Bar>'", DATA_TYPES_DISPLAYED_CORRECTLY, substrs=["1 match found"])
self.expect_expr("t1", result_type="Foo<char>")
self.expect_expr("t1", result_type="Foo<char>")
self.expect_expr("p6", result_type="FooPack<int, int>")
self.expect_expr("p7", result_type="FooPack<int, int, int>")
self.expect_expr("n1", result_type="Foo<int>::Nested<char>")
+ self.expect_expr("n2", result_type="Foo<int>::Nested<ns::Bar>")
@skipIf(compiler=no_match("clang"))
@skipIf(compiler_version=["<", "15.0"])
+namespace ns {
+struct Bar {};
+} // namespace ns
+
template <class T> struct Foo {
T t;
template <class U> class Nested {
FooPack<int, int, int> p7;
Foo<int>::Nested<char> n1;
+ Foo<int>::Nested<ns::Bar> n2;
// Set breakpoint here
}