Updated all commands that use a "--format" / "-f" options to use the new
OptionGroupFormat. Updated OptionGroupFormat to be able to also use the
"--size" and "--count" options. Commands that use a OptionGroupFormat instance
can choose which of the options they want by initializing OptionGroupFormat
accordingly. Clients can either get only the "--format", "--format" + "--size",
or "--format" + "--size" + "--count". This is in preparation for upcoming
chnages where there are alternate ways (GDB format specification) to set a
format. 



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@142911 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Commands/CommandObjectExpression.cpp b/source/Commands/CommandObjectExpression.cpp
index 2bacdbb..dde97b2 100644
--- a/source/Commands/CommandObjectExpression.cpp
+++ b/source/Commands/CommandObjectExpression.cpp
@@ -37,11 +37,9 @@
 using namespace lldb;
 using namespace lldb_private;
 
-CommandObjectExpression::CommandOptions::CommandOptions (CommandInterpreter &interpreter) :
-    Options(interpreter)
+CommandObjectExpression::CommandOptions::CommandOptions () :
+    OptionGroup()
 {
-    // Keep only one place to reset the values to their defaults
-    OptionParsingStarting();
 }
 
 
@@ -49,12 +47,29 @@
 {
 }
 
+OptionDefinition
+CommandObjectExpression::CommandOptions::g_option_table[] =
+{
+    { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "dynamic-value",      'd', required_argument, NULL, 0, eArgTypeBoolean,    "Upcast the value resulting from the expression to its dynamic type if available."},
+    { LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "unwind-on-error",    'u', required_argument, NULL, 0, eArgTypeBoolean,    "Clean up program state if the expression causes a crash, breakpoint hit or signal."},
+    { LLDB_OPT_SET_2                 , false, "object-description", 'o', no_argument,       NULL, 0, eArgTypeNone,       "Print the object description of the value resulting from the expression."},
+};
+
+
+uint32_t
+CommandObjectExpression::CommandOptions::GetNumDefinitions ()
+{
+    return sizeof(g_option_table)/sizeof(OptionDefinition);
+}
+
 Error
-CommandObjectExpression::CommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
+CommandObjectExpression::CommandOptions::SetOptionValue (CommandInterpreter &interpreter,
+                                                         uint32_t option_idx,
+                                                         const char *option_arg)
 {
     Error error;
 
-    char short_option = (char) m_getopt_table[option_idx].val;
+    const char short_option = (char) g_option_table[option_idx].short_option;
 
     switch (short_option)
     {
@@ -65,14 +80,6 @@
       //}
       //break;
 
-    case 'g':
-        debug = true;
-        break;
-
-    case 'f':
-        error = Args::StringToFormat(option_arg, format, NULL);
-        break;
-        
     case 'o':
         print_object = true;
         break;
@@ -111,13 +118,10 @@
 }
 
 void
-CommandObjectExpression::CommandOptions::OptionParsingStarting ()
+CommandObjectExpression::CommandOptions::OptionParsingStarting (CommandInterpreter &interpreter)
 {
-    //language.Clear();
-    debug = false;
-    format = eFormatDefault;
-    print_object = false;
     use_dynamic = eLazyBoolCalculate;
+    print_object = false;
     unwind_on_error = true;
     show_types = true;
     show_summary = true;
@@ -134,7 +138,9 @@
                    "expression",
                    "Evaluate a C/ObjC/C++ expression in the current program context, using variables currently in scope.",
                    NULL),
-    m_options (interpreter),
+    m_option_group (interpreter),
+    m_format_options (eFormatDefault),
+    m_command_options (),
     m_expr_line_count (0),
     m_expr_lines ()
 {
@@ -157,6 +163,11 @@
 
     // Push the data for the first argument into the m_arguments vector.
     m_arguments.push_back (arg);
+    
+    // Add the "--format" and "--count" options to group 1 and 3
+    m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT, LLDB_OPT_SET_1);
+    m_option_group.Append (&m_command_options);
+    m_option_group.Finalize();
 }
 
 CommandObjectExpression::~CommandObjectExpression ()
@@ -166,7 +177,7 @@
 Options *
 CommandObjectExpression::GetOptions ()
 {
-    return &m_options;
+    return &m_option_group;
 }
 
 
@@ -281,7 +292,7 @@
         bool keep_in_memory = true;
         lldb::DynamicValueType use_dynamic;
         // If use dynamic is not set, get it from the target:
-        switch (m_options.use_dynamic)
+        switch (m_command_options.use_dynamic)
         {
         case eLazyBoolCalculate:
             use_dynamic = target->GetPreferDynamicValue();
@@ -297,12 +308,12 @@
         exe_results = target->EvaluateExpression (expr, 
                                                   m_exe_ctx.GetFramePtr(),
                                                   eExecutionPolicyOnlyWhenNeeded,
-                                                  m_options.unwind_on_error,
+                                                  m_command_options.unwind_on_error,
                                                   keep_in_memory, 
                                                   use_dynamic, 
                                                   result_valobj_sp);
         
-        if (exe_results == eExecutionInterrupted && !m_options.unwind_on_error)
+        if (exe_results == eExecutionInterrupted && !m_command_options.unwind_on_error)
         {
             uint32_t start_frame = 0;
             uint32_t num_frames = 1;
@@ -334,8 +345,9 @@
         {
             if (result_valobj_sp->GetError().Success())
             {
-                if (m_options.format != eFormatDefault)
-                    result_valobj_sp->SetFormat (m_options.format);
+                Format format = m_format_options.GetFormat();
+                if (format != eFormatDefault)
+                    result_valobj_sp->SetFormat (format);
 
                 ValueObject::DumpValueObject (*(output_stream),
                                               result_valobj_sp.get(),   // Variable object to dump
@@ -343,9 +355,9 @@
                                               0,                        // Pointer depth to traverse (zero means stop at pointers)
                                               0,                        // Current depth, this is the top most, so zero...
                                               UINT32_MAX,               // Max depth to go when dumping concrete types, dump everything...
-                                              m_options.show_types,     // Show types when dumping?
+                                              m_command_options.show_types,     // Show types when dumping?
                                               false,                    // Show locations of variables, no since this is a host address which we don't care to see
-                                              m_options.print_object,   // Print the objective C object?
+                                              m_command_options.print_object,   // Print the objective C object?
                                               use_dynamic,
                                               true,                     // Use synthetic children if available
                                               true,                     // Scope is already checked. Const results are always in scope.
@@ -406,7 +418,7 @@
 {
     m_exe_ctx = m_interpreter.GetExecutionContext();
 
-    m_options.NotifyOptionParsingStarting();
+    m_option_group.NotifyOptionParsingStarting();
 
     const char * expr = NULL;
 
@@ -471,7 +483,7 @@
             if (!ParseOptions (args, result))
                 return false;
             
-            Error error (m_options.NotifyOptionParsingFinished());
+            Error error (m_option_group.NotifyOptionParsingFinished());
             if (error.Fail())
             {
                 result.AppendError (error.AsCString());
@@ -491,16 +503,3 @@
     return false;
 }
 
-OptionDefinition
-CommandObjectExpression::CommandOptions::g_option_table[] =
-{
-//{ LLDB_OPT_SET_ALL, false, "language",   'l', required_argument, NULL, 0, "[c|c++|objc|objc++]",          "Sets the language to use when parsing the expression."},
-//{ LLDB_OPT_SET_1, false, "format",     'f', required_argument, NULL, 0, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]",  "Specify the format that the expression output should use."},
-{ LLDB_OPT_SET_1,   false, "format",             'f', required_argument, NULL, 0, eArgTypeExprFormat, "Specify the format that the expression output should use."},
-{ LLDB_OPT_SET_2,   false, "object-description", 'o', no_argument,       NULL, 0, eArgTypeNone,       "Print the object description of the value resulting from the expression."},
-{ LLDB_OPT_SET_2,   false, "dynamic-value",      'd', required_argument, NULL, 0, eArgTypeBoolean,    "Upcast the value resulting from the expression to its dynamic type if available."},
-{ LLDB_OPT_SET_ALL, false, "unwind-on-error",    'u', required_argument, NULL, 0, eArgTypeBoolean,    "Clean up program state if the expression causes a crash, breakpoint hit or signal."},
-{ LLDB_OPT_SET_ALL, false, "debug",              'g', no_argument,       NULL, 0, eArgTypeNone,       "Enable verbose debug logging of the expression parsing and evaluation."},
-{ 0,                false, NULL,                 0,   0,                 NULL, 0, eArgTypeNone,       NULL }
-};
-