| //===-- ValueObjectPrinter.h ---------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef lldb_ValueObjectPrinter_h_ |
| #define lldb_ValueObjectPrinter_h_ |
| |
| // C Includes |
| // C++ Includes |
| |
| // Other libraries and framework includes |
| // Project includes |
| #include "lldb/lldb-private.h" |
| #include "lldb/lldb-public.h" |
| |
| #include "lldb/Core/Stream.h" |
| #include "lldb/Core/ValueObject.h" |
| #include "lldb/DataFormatters/TypeSummary.h" |
| |
| namespace lldb_private { |
| |
| struct DumpValueObjectOptions |
| { |
| uint32_t m_max_ptr_depth; |
| uint32_t m_max_depth; |
| bool m_show_types; |
| bool m_show_location; |
| bool m_use_objc; |
| lldb::DynamicValueType m_use_dynamic; |
| bool m_use_synthetic; |
| bool m_scope_already_checked; |
| bool m_flat_output; |
| uint32_t m_omit_summary_depth; |
| bool m_ignore_cap; |
| lldb::Format m_format; |
| lldb::TypeSummaryImplSP m_summary_sp; |
| std::string m_root_valobj_name; |
| bool m_hide_root_type; |
| bool m_hide_name; |
| bool m_hide_value; |
| bool m_be_raw; |
| |
| DumpValueObjectOptions() : |
| m_max_ptr_depth(0), |
| m_max_depth(UINT32_MAX), |
| m_show_types(false), |
| m_show_location(false), |
| m_use_objc(false), |
| m_use_dynamic(lldb::eNoDynamicValues), |
| m_use_synthetic(true), |
| m_scope_already_checked(false), |
| m_flat_output(false), |
| m_omit_summary_depth(0), |
| m_ignore_cap(false), |
| m_format (lldb::eFormatDefault), |
| m_summary_sp(), |
| m_root_valobj_name(), |
| m_hide_root_type(false), // provide a special compact display for "po" |
| m_hide_name(false), // provide a special compact display for "po" |
| m_hide_value(false), // provide a special compact display for "po" |
| m_be_raw(false) |
| {} |
| |
| static const DumpValueObjectOptions |
| DefaultOptions() |
| { |
| static DumpValueObjectOptions g_default_options; |
| |
| return g_default_options; |
| } |
| |
| DumpValueObjectOptions (const DumpValueObjectOptions& rhs) : |
| m_max_ptr_depth(rhs.m_max_ptr_depth), |
| m_max_depth(rhs.m_max_depth), |
| m_show_types(rhs.m_show_types), |
| m_show_location(rhs.m_show_location), |
| m_use_objc(rhs.m_use_objc), |
| m_use_dynamic(rhs.m_use_dynamic), |
| m_use_synthetic(rhs.m_use_synthetic), |
| m_scope_already_checked(rhs.m_scope_already_checked), |
| m_flat_output(rhs.m_flat_output), |
| m_omit_summary_depth(rhs.m_omit_summary_depth), |
| m_ignore_cap(rhs.m_ignore_cap), |
| m_format(rhs.m_format), |
| m_summary_sp(rhs.m_summary_sp), |
| m_root_valobj_name(rhs.m_root_valobj_name), |
| m_hide_root_type(rhs.m_hide_root_type), |
| m_hide_name(rhs.m_hide_name), |
| m_hide_value(rhs.m_hide_value), |
| m_be_raw(rhs.m_be_raw) |
| {} |
| |
| DumpValueObjectOptions& |
| SetMaximumPointerDepth(uint32_t depth = 0) |
| { |
| m_max_ptr_depth = depth; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetMaximumDepth(uint32_t depth = 0) |
| { |
| m_max_depth = depth; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetShowTypes(bool show = false) |
| { |
| m_show_types = show; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetShowLocation(bool show = false) |
| { |
| m_show_location = show; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetUseObjectiveC(bool use = false) |
| { |
| m_use_objc = use; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetShowSummary(bool show = true) |
| { |
| if (show == false) |
| SetOmitSummaryDepth(UINT32_MAX); |
| else |
| SetOmitSummaryDepth(0); |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetUseDynamicType(lldb::DynamicValueType dyn = lldb::eNoDynamicValues) |
| { |
| m_use_dynamic = dyn; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetUseSyntheticValue(bool use_synthetic = true) |
| { |
| m_use_synthetic = use_synthetic; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetScopeChecked(bool check = true) |
| { |
| m_scope_already_checked = check; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetFlatOutput(bool flat = false) |
| { |
| m_flat_output = flat; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetOmitSummaryDepth(uint32_t depth = 0) |
| { |
| m_omit_summary_depth = depth; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetIgnoreCap(bool ignore = false) |
| { |
| m_ignore_cap = ignore; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetRawDisplay(bool raw = false) |
| { |
| if (raw) |
| { |
| SetUseSyntheticValue(false); |
| SetOmitSummaryDepth(UINT32_MAX); |
| SetIgnoreCap(true); |
| SetHideName(false); |
| SetHideValue(false); |
| m_be_raw = true; |
| } |
| else |
| { |
| SetUseSyntheticValue(true); |
| SetOmitSummaryDepth(0); |
| SetIgnoreCap(false); |
| SetHideName(false); |
| SetHideValue(false); |
| m_be_raw = false; |
| } |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetFormat (lldb::Format format = lldb::eFormatDefault) |
| { |
| m_format = format; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetSummary (lldb::TypeSummaryImplSP summary = lldb::TypeSummaryImplSP()) |
| { |
| m_summary_sp = summary; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetRootValueObjectName (const char* name = NULL) |
| { |
| if (name) |
| m_root_valobj_name.assign(name); |
| else |
| m_root_valobj_name.clear(); |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetHideRootType (bool hide_root_type = false) |
| { |
| m_hide_root_type = hide_root_type; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetHideName (bool hide_name = false) |
| { |
| m_hide_name = hide_name; |
| return *this; |
| } |
| |
| DumpValueObjectOptions& |
| SetHideValue (bool hide_value = false) |
| { |
| m_hide_value = hide_value; |
| return *this; |
| } |
| }; |
| |
| class ValueObjectPrinter |
| { |
| public: |
| |
| ValueObjectPrinter (ValueObject* valobj, |
| Stream* s, |
| const DumpValueObjectOptions& options); |
| |
| ~ValueObjectPrinter () {} |
| |
| bool |
| PrintValueObject (); |
| |
| protected: |
| |
| // only this class (and subclasses, if any) should ever be concerned with |
| // the depth mechanism |
| ValueObjectPrinter (ValueObject* valobj, |
| Stream* s, |
| const DumpValueObjectOptions& options, |
| uint32_t ptr_depth, |
| uint32_t curr_depth); |
| |
| // we should actually be using delegating constructors here |
| // but some versions of GCC still have trouble with those |
| void |
| Init (ValueObject* valobj, |
| Stream* s, |
| const DumpValueObjectOptions& options, |
| uint32_t ptr_depth, |
| uint32_t curr_depth); |
| |
| bool |
| GetDynamicValueIfNeeded (); |
| |
| const char* |
| GetDescriptionForDisplay (); |
| |
| const char* |
| GetRootNameForDisplay (const char* if_fail = nullptr); |
| |
| bool |
| ShouldPrintValueObject (); |
| |
| bool |
| IsNil (); |
| |
| bool |
| IsPtr (); |
| |
| bool |
| IsRef (); |
| |
| bool |
| IsAggregate (); |
| |
| bool |
| PrintLocationIfNeeded (); |
| |
| bool |
| PrintTypeIfNeeded (); |
| |
| bool |
| PrintNameIfNeeded (bool show_type); |
| |
| bool |
| CheckScopeIfNeeded (); |
| |
| TypeSummaryImpl* |
| GetSummaryFormatter (); |
| |
| void |
| GetValueSummaryError (std::string& value, |
| std::string& summary, |
| std::string& error); |
| |
| bool |
| PrintValueAndSummaryIfNeeded (bool& value_printed, |
| bool& summary_printed); |
| |
| bool |
| PrintObjectDescriptionIfNeeded (bool value_printed, |
| bool summary_printed); |
| |
| bool |
| ShouldPrintChildren (bool is_failed_description, |
| uint32_t& curr_ptr_depth); |
| |
| ValueObject* |
| GetValueObjectForChildrenGeneration (); |
| |
| void |
| PrintChildrenPreamble (); |
| |
| void |
| PrintChildrenPostamble (bool print_dotdotdot); |
| |
| void |
| PrintChild (lldb::ValueObjectSP child_sp, |
| uint32_t curr_ptr_depth); |
| |
| uint32_t |
| GetMaxNumChildrenToPrint (bool& print_dotdotdot); |
| |
| void |
| PrintChildren (uint32_t curr_ptr_depth); |
| |
| void |
| PrintChildrenIfNeeded (bool value_printed, |
| bool summary_printed); |
| |
| bool |
| PrintChildrenOneLiner (bool hide_names); |
| |
| private: |
| |
| ValueObject *m_orig_valobj; |
| ValueObject *m_valobj; |
| Stream *m_stream; |
| DumpValueObjectOptions options; |
| Flags m_type_flags; |
| ClangASTType m_clang_type; |
| uint32_t m_ptr_depth; |
| uint32_t m_curr_depth; |
| LazyBool m_should_print; |
| LazyBool m_is_nil; |
| LazyBool m_is_ptr; |
| LazyBool m_is_ref; |
| LazyBool m_is_aggregate; |
| std::pair<TypeSummaryImpl*,bool> m_summary_formatter; |
| std::string m_value; |
| std::string m_summary; |
| std::string m_error; |
| |
| friend struct StringSummaryFormat; |
| |
| DISALLOW_COPY_AND_ASSIGN(ValueObjectPrinter); |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // lldb_ValueObjectPrinter_h_ |