summaryrefslogtreecommitdiff
path: root/lldb
diff options
context:
space:
mode:
authorJulian Lettner <yln@users.noreply.github.com>2025-11-03 13:29:34 -0800
committerGitHub <noreply@github.com>2025-11-03 13:29:34 -0800
commit25da15f9b1f910cb5d350381c1c8a287cbe4cf0f (patch)
tree66555b88a3d3f7512f7e0c9665da00dd66b56461 /lldb
parente5d9644bca214587a22401693eee90b2934d5827 (diff)
[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`.
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Utility/Stream.h26
-rw-r--r--lldb/source/Target/Target.cpp19
-rw-r--r--lldb/source/Utility/Stream.cpp8
-rw-r--r--lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test36
4 files changed, 70 insertions, 19 deletions
diff --git a/lldb/include/lldb/Utility/Stream.h b/lldb/include/lldb/Utility/Stream.h
index 82774d56922a..13455552131d 100644
--- a/lldb/include/lldb/Utility/Stream.h
+++ b/lldb/include/lldb/Utility/Stream.h
@@ -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
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 1e43094421f0..a23091ad09c6 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -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[] = {
diff --git a/lldb/source/Utility/Stream.cpp b/lldb/source/Utility/Stream.cpp
index 89dce9fb0e1f..e9632c3e1fc1 100644
--- a/lldb/source/Utility/Stream.cpp
+++ b/lldb/source/Utility/Stream.cpp
@@ -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; }
diff --git a/lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test b/lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test
new file mode 100644
index 000000000000..a9557801cc13
--- /dev/null
+++ b/lldb/test/Shell/ExecControl/StopHook/stop-hook-list-format.test
@@ -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: