1220364Sadrian//===-- OptionGroupValueObjectDisplay.cpp -----------------------*- C++ -*-===//
2220364Sadrian//
3220364Sadrian//                     The LLVM Compiler Infrastructure
4220364Sadrian//
5220364Sadrian// This file is distributed under the University of Illinois Open Source
6220364Sadrian// License. See LICENSE.TXT for details.
7220364Sadrian//
8220364Sadrian//===----------------------------------------------------------------------===//
9220364Sadrian
10220364Sadrian#include "lldb/lldb-python.h"
11220364Sadrian
12220364Sadrian#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
13220364Sadrian
14220364Sadrian// C Includes
15220364Sadrian// C++ Includes
16220364Sadrian// Other libraries and framework includes
17220364Sadrian// Project includes
18220364Sadrian#include "lldb/Target/Target.h"
19220364Sadrian#include "lldb/Interpreter/CommandInterpreter.h"
20220364Sadrian#include "lldb/Utility/Utils.h"
21220364Sadrian
22220364Sadrianusing namespace lldb;
23220364Sadrianusing namespace lldb_private;
24220364Sadrian
25220364SadrianOptionGroupValueObjectDisplay::OptionGroupValueObjectDisplay()
26220364Sadrian{
27220364Sadrian}
28220364Sadrian
29220364SadrianOptionGroupValueObjectDisplay::~OptionGroupValueObjectDisplay ()
30220364Sadrian{
31220364Sadrian}
32220364Sadrian
33220364Sadrianstatic OptionDefinition
34220364Sadriang_option_table[] =
35220364Sadrian{
36220364Sadrian    { LLDB_OPT_SET_1, false, "dynamic-type",       'd', required_argument, g_dynamic_value_types, 0, eArgTypeNone,      "Show the object as its full dynamic type, not its static type, if available."},
37220364Sadrian    { LLDB_OPT_SET_1, false, "synthetic-type",     'S', required_argument, NULL, 0, eArgTypeBoolean,   "Show the object obeying its synthetic provider, if available."},
38220364Sadrian    { LLDB_OPT_SET_1, false, "depth",              'D', required_argument, NULL, 0, eArgTypeCount,     "Set the max recurse depth when dumping aggregate types (default is infinity)."},
39220364Sadrian    { LLDB_OPT_SET_1, false, "flat",               'F', no_argument,       NULL, 0, eArgTypeNone,      "Display results in a flat format that uses expression paths for each variable or member."},
40220364Sadrian    { LLDB_OPT_SET_1, false, "location",           'L', no_argument,       NULL, 0, eArgTypeNone,      "Show variable location information."},
41220364Sadrian    { LLDB_OPT_SET_1, false, "object-description", 'O', no_argument,       NULL, 0, eArgTypeNone,      "Print as an Objective-C object."},
42220364Sadrian    { LLDB_OPT_SET_1, false, "ptr-depth",          'P', required_argument, NULL, 0, eArgTypeCount,     "The number of pointers to be traversed when dumping values (default is zero)."},
43220364Sadrian    { LLDB_OPT_SET_1, false, "show-types",         'T', no_argument,       NULL, 0, eArgTypeNone,      "Show variable types when dumping values."},
44220364Sadrian    { LLDB_OPT_SET_1, false, "no-summary-depth",   'Y', optional_argument, NULL, 0, eArgTypeCount,     "Set the depth at which omitting summary information stops (default is 1)."},
45220364Sadrian    { LLDB_OPT_SET_1, false, "raw-output",         'R', no_argument,       NULL, 0, eArgTypeNone,      "Don't use formatting options."},
46220364Sadrian    { LLDB_OPT_SET_1, false, "show-all-children",  'A', no_argument,       NULL, 0, eArgTypeNone,      "Ignore the upper bound on the number of children to show."},
47220364Sadrian    { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
48220364Sadrian};
49220364Sadrian
50220364Sadrianuint32_t
51220364SadrianOptionGroupValueObjectDisplay::GetNumDefinitions ()
52220364Sadrian{
53220364Sadrian    return llvm::array_lengthof(g_option_table);
54220364Sadrian}
55220364Sadrian
56220364Sadrianconst OptionDefinition *
57220364SadrianOptionGroupValueObjectDisplay::GetDefinitions ()
58220364Sadrian{
59220364Sadrian    return g_option_table;
60220364Sadrian}
61220364Sadrian
62220364Sadrian
63220364SadrianError
64220364SadrianOptionGroupValueObjectDisplay::SetOptionValue (CommandInterpreter &interpreter,
65220364Sadrian                                               uint32_t option_idx,
66220364Sadrian                                               const char *option_arg)
67220364Sadrian{
68220364Sadrian    Error error;
69220366Sadrian    const int short_option = g_option_table[option_idx].short_option;
70220364Sadrian    bool success = false;
71220364Sadrian
72220364Sadrian    switch (short_option)
73220364Sadrian    {
74220364Sadrian        case 'd':
75220364Sadrian            {
76220364Sadrian                int32_t result;
77220364Sadrian                result = Args::StringToOptionEnum (option_arg, g_dynamic_value_types, 2, error);
78220364Sadrian                if (error.Success())
79220364Sadrian                    use_dynamic = (lldb::DynamicValueType) result;
80220366Sadrian            }
81220364Sadrian            break;
82220364Sadrian        case 'T':   show_types   = true;  break;
83220364Sadrian        case 'L':   show_location= true;  break;
84220364Sadrian        case 'F':   flat_output  = true;  break;
85220364Sadrian        case 'O':   use_objc     = true;  break;
86220364Sadrian        case 'R':   be_raw       = true;  break;
87220364Sadrian        case 'A':   ignore_cap   = true;  break;
88220364Sadrian
89220364Sadrian        case 'D':
90220364Sadrian            max_depth = Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success);
91220364Sadrian            if (!success)
92220364Sadrian                error.SetErrorStringWithFormat("invalid max depth '%s'", option_arg);
93220364Sadrian            break;
94220364Sadrian
95220364Sadrian        case 'P':
96220364Sadrian            ptr_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
97220364Sadrian            if (!success)
98220364Sadrian                error.SetErrorStringWithFormat("invalid pointer depth '%s'", option_arg);
99220364Sadrian            break;
100220364Sadrian
101220364Sadrian        case 'Y':
102220364Sadrian            if (option_arg)
103220364Sadrian            {
104220364Sadrian                no_summary_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
105220364Sadrian                if (!success)
106220364Sadrian                    error.SetErrorStringWithFormat("invalid pointer depth '%s'", option_arg);
107220364Sadrian            }
108220364Sadrian            else
109244960Sadrian                no_summary_depth = 1;
110220364Sadrian            break;
111220364Sadrian
112220364Sadrian        case 'S':
113220364Sadrian            use_synth = Args::StringToBoolean(option_arg, true, &success);
114220364Sadrian            if (!success)
115                error.SetErrorStringWithFormat("invalid synthetic-type '%s'", option_arg);
116            break;
117        default:
118            error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
119            break;
120    }
121
122    return error;
123}
124
125void
126OptionGroupValueObjectDisplay::OptionParsingStarting (CommandInterpreter &interpreter)
127{
128    // If these defaults change, be sure to modify AnyOptionWasSet().
129    show_types        = false;
130    no_summary_depth  = 0;
131    show_location     = false;
132    flat_output       = false;
133    use_objc          = false;
134    max_depth         = UINT32_MAX;
135    ptr_depth         = 0;
136    use_synth         = true;
137    be_raw            = false;
138    ignore_cap        = false;
139
140    Target *target = interpreter.GetExecutionContext().GetTargetPtr();
141    if (target != NULL)
142        use_dynamic = target->GetPreferDynamicValue();
143    else
144    {
145        // If we don't have any targets, then dynamic values won't do us much good.
146        use_dynamic = lldb::eNoDynamicValues;
147    }
148}
149
150ValueObject::DumpValueObjectOptions
151OptionGroupValueObjectDisplay::GetAsDumpOptions (bool objc_is_compact,
152                                                 lldb::Format format,
153                                                 lldb::TypeSummaryImplSP summary_sp)
154{
155    ValueObject::DumpValueObjectOptions options;
156    options.SetMaximumPointerDepth(ptr_depth);
157    if (use_objc)
158        options.SetShowSummary(false);
159    else
160        options.SetOmitSummaryDepth(no_summary_depth);
161    options.SetMaximumDepth(max_depth)
162    .SetShowTypes(show_types)
163    .SetShowLocation(show_location)
164    .SetUseObjectiveC(use_objc)
165    .SetUseDynamicType(use_dynamic)
166    .SetUseSyntheticValue(use_synth)
167    .SetFlatOutput(flat_output)
168    .SetIgnoreCap(ignore_cap)
169    .SetFormat(format)
170    .SetSummary(summary_sp);
171
172    if (objc_is_compact)
173        options.SetHideRootType(use_objc)
174        .SetHideName(use_objc)
175        .SetHideValue(use_objc);
176
177    if (be_raw)
178        options.SetRawDisplay(true);
179
180    return options;
181}
182