[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:
parent
e5d9644bca
commit
25da15f9b1
@ -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
|
||||
|
||||
@ -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[] = {
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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:
|
||||
Loading…
x
Reference in New Issue
Block a user