================ @@ -208,6 +209,152 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream, return true; } +static std::optional<llvm::StringRef> GetDemangledBasename(Function &function) { + auto demangled_name = function.GetName().GetStringRef(); + if (demangled_name.empty()) + return std::nullopt; + + const std::optional<DemangledNameInfo> &info = + function.GetMangled().GetDemangledInfo(); + if (!info) + return std::nullopt; + + // Function without a basename is nonsense. + if (!info->hasBasename()) + return std::nullopt; + + assert(info->BasenameRange.first < demangled_name.size()); + assert(info->BasenameRange.second < demangled_name.size()); + + return demangled_name.substr(info->BasenameRange.first, + info->BasenameRange.second - + info->BasenameRange.first); +} + +static std::optional<llvm::StringRef> +GetDemangledTemplateArguments(Function &function) { + auto demangled_name = function.GetName().GetStringRef(); + if (demangled_name.empty()) + return std::nullopt; + + const std::optional<DemangledNameInfo> &info = + function.GetMangled().GetDemangledInfo(); + if (!info) + return std::nullopt; + + // Function without a basename is nonsense. + if (!info->hasBasename()) + return std::nullopt; + + assert(info->BasenameRange.second < demangled_name.size()); + assert(info->ArgumentsRange.first < demangled_name.size()); + assert(info->ArgumentsRange.first >= info->BasenameRange.second); + + return demangled_name.substr(info->BasenameRange.second, + info->ArgumentsRange.first - + info->BasenameRange.second); +} + +static std::optional<llvm::StringRef> +GetDemangledReturnTypeLHS(Function &function) { + auto demangled_name = function.GetName().GetStringRef(); + if (demangled_name.empty()) + return std::nullopt; + + const std::optional<DemangledNameInfo> &info = + function.GetMangled().GetDemangledInfo(); + if (!info) + return std::nullopt; + + // Function without a basename is nonsense. + if (!info->hasBasename()) + return std::nullopt; + + assert(info->ScopeRange.first < demangled_name.size()); + + return demangled_name.substr(0, info->ScopeRange.first); +} + +static std::optional<llvm::StringRef> +GetDemangledFunctionQualifiers(Function &function) { + auto demangled_name = function.GetName().GetStringRef(); + if (demangled_name.empty()) + return std::nullopt; + + const std::optional<DemangledNameInfo> &info = + function.GetMangled().GetDemangledInfo(); + if (!info) + return std::nullopt; + + // Function without a basename is nonsense. + if (!info->hasBasename()) + return std::nullopt; + + assert(info->QualifiersRange.first <= demangled_name.size()); + assert(info->QualifiersRange.second <= demangled_name.size()); + assert(info->QualifiersRange.second >= info->QualifiersRange.first); + + return demangled_name.substr(info->QualifiersRange.first, + info->QualifiersRange.second - + info->QualifiersRange.first); ---------------- labath wrote:
The only thing that changes here is the DemangledNameInfo field, right? Maybe you could turn deduplicate that using a utility function that takes a member pointer as an argument? https://github.com/llvm/llvm-project/pull/131836 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits