[lldb] Fix indentation when printing stop hooks (#165945)

This commit aggregates the following changes:
1. Fix the format (i.e., indentation) when printing stop hooks via `target
   stop-hook list`.
2. Add `IndentScope Stream::MakeIndentScope()` to make managing (and restoring!)
   of the indentation level on `Stream` instances more ergonomic and less error
   prone.
3. Simplify printing of stop hooks using the new `IndentScope`.
This commit is contained in:
Julian Lettner 2025-11-03 13:29:34 -08:00 committed by GitHub
parent e5d9644bca
commit 25da15f9b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 70 additions and 19 deletions

View File

@ -300,6 +300,12 @@ public:
/// The current indentation level.
unsigned GetIndentLevel() const;
/// Set the current indentation level.
///
/// \param[in] level
/// The new indentation level.
void SetIndentLevel(unsigned level);
/// Indent the current line in the stream.
///
/// Indent the current line using the current indentation level and print an
@ -315,6 +321,20 @@ public:
/// Increment the current indentation level.
void IndentMore(unsigned amount = 2);
struct IndentScope {
IndentScope(Stream &stream)
: m_stream(stream), m_original_indent_level(stream.GetIndentLevel()) {}
~IndentScope() { m_stream.SetIndentLevel(m_original_indent_level); }
private:
Stream &m_stream;
unsigned m_original_indent_level;
};
/// Create an indentation scope that restores the original indent level when
/// the object goes out of scope (RAII).
IndentScope MakeIndentScope(unsigned indent_amount = 2);
/// Output an offset value.
///
/// Put an offset \a uval out to the stream using the printf format in \a
@ -364,12 +384,6 @@ public:
/// address and pointer values.
void SetAddressByteSize(uint32_t addr_size);
/// Set the current indentation level.
///
/// \param[in] level
/// The new indentation level.
void SetIndentLevel(unsigned level);
/// Output a SLEB128 number to the stream.
///
/// Put an SLEB128 \a uval out to the stream using the printf format in \a

View File

@ -3962,9 +3962,7 @@ void Target::StopHook::GetDescription(Stream &s,
return;
}
unsigned indent_level = s.GetIndentLevel();
s.SetIndentLevel(indent_level + 2);
auto indent_scope = s.MakeIndentScope();
s.Printf("Hook: %" PRIu64 "\n", GetID());
if (m_active)
@ -3978,19 +3976,17 @@ void Target::StopHook::GetDescription(Stream &s,
if (m_specifier_sp) {
s.Indent();
s.PutCString("Specifier:\n");
s.SetIndentLevel(indent_level + 4);
auto indent_scope = s.MakeIndentScope();
m_specifier_sp->GetDescription(&s, level);
s.SetIndentLevel(indent_level + 2);
}
if (m_thread_spec_up) {
StreamString tmp;
s.Indent("Thread:\n");
m_thread_spec_up->GetDescription(&tmp, level);
s.SetIndentLevel(indent_level + 4);
auto indent_scope = s.MakeIndentScope();
s.Indent(tmp.GetString());
s.PutCString("\n");
s.SetIndentLevel(indent_level + 2);
}
GetSubclassDescription(s, level);
}
@ -4003,14 +3999,13 @@ void Target::StopHookCommandLine::GetSubclassDescription(
s.PutCString(m_commands.GetStringAtIndex(0));
return;
}
s.Indent("Commands: \n");
s.SetIndentLevel(s.GetIndentLevel() + 4);
s.Indent("Commands:\n");
auto indent_scope = s.MakeIndentScope(4);
uint32_t num_commands = m_commands.GetSize();
for (uint32_t i = 0; i < num_commands; i++) {
s.Indent(m_commands.GetStringAtIndex(i));
s.PutCString("\n");
}
s.SetIndentLevel(s.GetIndentLevel() - 4);
}
// Target::StopHookCommandLine
@ -4145,7 +4140,7 @@ void Target::StopHookScripted::GetSubclassDescription(
return;
s.Indent("Args:\n");
s.SetIndentLevel(s.GetIndentLevel() + 4);
auto indent_scope = s.MakeIndentScope(4);
auto print_one_element = [&s](llvm::StringRef key,
StructuredData::Object *object) {
@ -4155,8 +4150,6 @@ void Target::StopHookScripted::GetSubclassDescription(
};
as_dict->ForEach(print_one_element);
s.SetIndentLevel(s.GetIndentLevel() - 4);
}
static constexpr OptionEnumValueElement g_dynamic_value_types[] = {

View File

@ -202,6 +202,14 @@ void Stream::IndentLess(unsigned amount) {
m_indent_level = 0;
}
// Create an indentation scope that restores the original indent level when the
// object goes out of scope (RAII).
Stream::IndentScope Stream::MakeIndentScope(unsigned indent_amount) {
IndentScope indent_scope(*this);
IndentMore(indent_amount);
return indent_scope;
}
// Get the address size in bytes
uint32_t Stream::GetAddressByteSize() const { return m_addr_size; }

View File

@ -0,0 +1,36 @@
# Test format (e.g., indentation) when printing the list of stop hooks.
#
# RUN: %lldb -b -s %s | FileCheck %s --match-full-lines --strict-whitespace
# Create some stop hooks
target stop-hook add -o 'print "Hello"' --auto-continue true --at-initial-stop true
target stop-hook add -o 'print "world,"' -o 'print "nice"' --file 'my_file'
target stop-hook add -o 'print "weather!"' --classname 'MyClass' --thread-name 'my_thread'
# Print hooks
target stop-hook list
# CHECK:(lldb) target stop-hook list
# CHECK:Hook: 1
# CHECK: State: enabled
# CHECK: AutoContinue on
# CHECK: Commands:
# CHECK: print "Hello"
# CHECK-EMPTY:
# CHECK:Hook: 2
# CHECK: State: enabled
# CHECK: Specifier:
# CHECK: File: my_file.
# CHECK: Commands:
# CHECK: print "world,"
# CHECK: print "nice"
# CHECK-EMPTY:
# CHECK:Hook: 3
# CHECK: State: enabled
# CHECK: Specifier:
# CHECK: Class name: MyClass.
# CHECK: Thread:
# CHECK: thread name: "my_thread"
# CHECK: Commands:
# CHECK: print "weather!"
# CHECK-EMPTY: