================ @@ -132,6 +132,84 @@ std::vector<std::string> GetStrings(const llvm::json::Object *obj, return strs; } +/// Create a short summary for a container that contains the summary of its +/// first children, so that the user can get a glimpse of its contents at a +/// glance. +static std::optional<std::string> +GetSyntheticSummaryForContainer(lldb::SBValue &v) { + if (v.TypeIsPointerType() || !v.MightHaveChildren()) + return std::nullopt; + /// As this operation can be potentially slow, we limit the total time spent + /// fetching children to a few ms. + const auto max_evaluation_time = std::chrono::milliseconds(10); + /// We don't want to generate a extremely long summary string, so we limit its + /// length. + const size_t max_length = 32; + + auto start = std::chrono::steady_clock::now(); + std::string summary; + llvm::raw_string_ostream os(summary); + os << "{"; + + llvm::StringRef separator = ""; + + for (size_t i = 0, e = v.GetNumChildren(); i < e; ++i) { + // If we reached the time limit or exceeded the number of characters, we + // dump `...` to signal that there are more elements in the collection. + if (summary.size() > max_length || + (std::chrono::steady_clock::now() - start) > max_evaluation_time) { + os << separator << "..."; + break; + } + lldb::SBValue child = v.GetChildAtIndex(i); + + if (llvm::StringRef name = child.GetName(); !name.empty()) { + llvm::StringRef value; + if (llvm::StringRef summary = child.GetSummary(); !summary.empty()) + value = summary; + else + value = child.GetValue(); + + if (!value.empty()) { + // If the child is an indexed entry, we don't show its index to save + // characters. + if (name.starts_with("[")) + os << separator << value; + else + os << separator << name << ":" << value; + separator = ", "; + } + } + } + os << "}"; + + if (summary == "{...}" || summary == "{}") + return std::nullopt; + return summary; +} + +/// Return whether we should dereference an SBValue in order to generate a more +/// meaningful summary string. +static bool ShouldBeDereferencedForSummary(lldb::SBValue &v) { + if (!v.GetType().IsPointerType() && !v.GetType().IsReferenceType()) ---------------- River707 wrote:
Do we have tests for this `false` cases? https://github.com/llvm/llvm-project/pull/65514 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits