Change "frame var" over to using OptionGroups (and thus the OptionGroupVariableObjectDisplay).
Change the boolean "use_dynamic" over to a tri-state, no-dynamic, dynamic-w/o running target,
and dynamic with running target.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@130832 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Commands/CommandObjectFrame.cpp b/source/Commands/CommandObjectFrame.cpp
index 6521416..33e735a 100644
--- a/source/Commands/CommandObjectFrame.cpp
+++ b/source/Commands/CommandObjectFrame.cpp
@@ -25,6 +25,7 @@
 #include "lldb/Interpreter/CommandInterpreter.h"
 #include "lldb/Interpreter/CommandReturnObject.h"
 #include "lldb/Interpreter/Options.h"
+#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
 #include "lldb/Symbol/ClangASTType.h"
 #include "lldb/Symbol/ClangASTContext.h"
 #include "lldb/Symbol/ObjectFile.h"
@@ -285,73 +286,46 @@
 {
 public:
 
-    class CommandOptions : public Options
+    class OptionGroupFrameVariable : public OptionGroup
     {
     public:
 
-        CommandOptions (CommandInterpreter &interpreter) :
-            Options(interpreter)
+        OptionGroupFrameVariable ()
         {
-            OptionParsingStarting ();
         }
 
         virtual
-        ~CommandOptions ()
+        ~OptionGroupFrameVariable ()
         {
         }
 
+        virtual uint32_t
+        GetNumDefinitions ();
+
+        virtual const OptionDefinition*
+        GetDefinitions ()
+        {
+            return g_option_table;
+        }
+    
         virtual Error
-        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        SetOptionValue (CommandInterpreter &interpreter,
+                        uint32_t option_idx, 
+                        const char *option_arg)
         {
             Error error;
-            bool success;
-            char short_option = (char) m_getopt_table[option_idx].val;
+            char short_option = (char) g_option_table[option_idx].short_option;
             switch (short_option)
             {
-            case 'o':   use_objc     = true;  break;
-            case 'd':
-                {
-                    bool success;
-                    bool result;
-                    result = Args::StringToBoolean(option_arg, true, &success);
-                    if (!success)
-                        error.SetErrorStringWithFormat("Invalid dynamic value setting: \"%s\".\n", option_arg);
-                    else
-                    {
-                        if (result)
-                            use_dynamic  = eLazyBoolYes;  
-                        else
-                            use_dynamic = eLazyBoolNo;
-                    }
-                }
-                break;
             case 'r':   use_regex    = true;  break;
             case 'a':   show_args    = false; break;
             case 'l':   show_locals  = false; break;
             case 'g':   show_globals = true;  break;
-            case 't':   show_types   = true;  break;
-            case 'y':   show_summary = false; break;
-            case 'L':   show_location= true;  break;
             case 'c':   show_decl    = true;  break;
-            case 'D':   debug        = true;  break;
             case 'f':   error = Args::StringToFormat(option_arg, format, NULL); break;
-            case 'F':   flat_output  = true;  break;
-            case 'A':
-                max_depth = Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success);
-                if (!success)
-                    error.SetErrorStringWithFormat("Invalid max depth '%s'.\n", option_arg);
-                break;
-
-            case 'p':
-                ptr_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
-                if (!success)
-                    error.SetErrorStringWithFormat("Invalid pointer depth '%s'.\n", option_arg);
-                break;
-
             case 'G':
                 globals.push_back(ConstString (option_arg));
                 break;
-
             case 's':
                 show_scope = true;
                 break;
@@ -364,52 +338,29 @@
             return error;
         }
 
-        void
-        OptionParsingStarting ()
+        virtual void
+        OptionParsingStarting (CommandInterpreter &interpreter)
         {
-            use_objc      = false;
-            use_regex     = false;
             show_args     = true;
-            show_locals   = true;
-            show_globals  = false;
-            show_types    = false;
-            show_scope    = false;
-            show_summary  = true;
-            show_location = false;
             show_decl     = false;
-            debug         = false;
-            flat_output   = false;
-            use_dynamic   = eLazyBoolCalculate;
-            max_depth     = UINT32_MAX;
-            ptr_depth     = 0;
             format        = eFormatDefault;
+            show_globals  = false;
+            show_locals   = true;
+            use_regex     = false;
+            show_scope    = false;
             globals.clear();
         }
 
-        const OptionDefinition*
-        GetDefinitions ()
-        {
-            return g_option_table;
-        }
-
         // Options table: Required for subclasses of Options.
 
         static OptionDefinition g_option_table[];
-        bool use_objc:1,
-             use_regex:1,
+        
+        bool use_regex:1,
              show_args:1,
              show_locals:1,
              show_globals:1,
-             show_types:1,
              show_scope:1,
-             show_summary:1,
-             show_location:1,
-             show_decl:1,
-             debug:1,
-             flat_output:1;
-        LazyBool     use_dynamic;
-        uint32_t max_depth; // The depth to print when dumping concrete (not pointers) aggreate values
-        uint32_t ptr_depth; // The default depth that is dumped when we find pointers
+             show_decl:1;
         lldb::Format format; // The format to use when dumping variables or children of variables
         std::vector<ConstString> globals;
         // Instance variables to hold the values for command options.
@@ -426,7 +377,9 @@
                        "'var->child.x'.",
                        NULL,
                        eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
-        m_options (interpreter)
+        m_option_group (interpreter),
+        m_frame_var_options(),
+        m_varobj_options()
     {
         CommandArgumentEntry arg;
         CommandArgumentData var_name_arg;
@@ -440,6 +393,10 @@
         
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
+        
+        m_option_group.Append (&m_frame_var_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+        m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+        m_option_group.Finalize();
     }
 
     virtual
@@ -451,7 +408,7 @@
     Options *
     GetOptions ()
     {
-        return &m_options;
+        return &m_option_group;
     }
 
 
@@ -479,40 +436,19 @@
             VariableSP var_sp;
             ValueObjectSP valobj_sp;
 
-            bool use_dynamic;
-            
-            // If use dynamic is not set, get it from the target:
-            switch (m_options.use_dynamic)
-            {
-            case eLazyBoolCalculate:
-                {   
-                    if (exe_ctx.target->GetPreferDynamicValue())
-                        use_dynamic = true;
-                    else
-                        use_dynamic = false;
-                }
-                break;
-            case eLazyBoolYes:
-                use_dynamic = true;
-                break;
-            case eLazyBoolNo:
-                use_dynamic = false;
-                break;
-            }
-            
             const char *name_cstr = NULL;
             size_t idx;
-            if (!m_options.globals.empty())
+            if (!m_frame_var_options.globals.empty())
             {
                 uint32_t fail_count = 0;
                 if (exe_ctx.target)
                 {
-                    const size_t num_globals = m_options.globals.size();
+                    const size_t num_globals = m_frame_var_options.globals.size();
                     for (idx = 0; idx < num_globals; ++idx)
                     {
                         VariableList global_var_list;
                         const uint32_t num_matching_globals 
-                                = exe_ctx.target->GetImages().FindGlobalVariables (m_options.globals[idx], 
+                                = exe_ctx.target->GetImages().FindGlobalVariables (m_frame_var_options.globals[idx], 
                                                                                    true, 
                                                                                    UINT32_MAX, 
                                                                                    global_var_list);
@@ -521,7 +457,7 @@
                         {
                             ++fail_count;
                             result.GetErrorStream().Printf ("error: can't find global variable '%s'\n", 
-                                                            m_options.globals[idx].AsCString());
+                                                            m_frame_var_options.globals[idx].AsCString());
                         }
                         else
                         {
@@ -530,16 +466,18 @@
                                 var_sp = global_var_list.GetVariableAtIndex(global_idx);
                                 if (var_sp)
                                 {
-                                    valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, use_dynamic);
+                                    valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, 
+                                                                                               m_varobj_options.use_dynamic);
                                     if (!valobj_sp)
-                                        valobj_sp = exe_ctx.frame->TrackGlobalVariable (var_sp, use_dynamic);
+                                        valobj_sp = exe_ctx.frame->TrackGlobalVariable (var_sp, 
+                                                                                        m_varobj_options.use_dynamic);
 
                                     if (valobj_sp)
                                     {
-                                        if (m_options.format != eFormatDefault)
-                                            valobj_sp->SetFormat (m_options.format);
+                                        if (m_frame_var_options.format != eFormatDefault)
+                                            valobj_sp->SetFormat (m_frame_var_options.format);
 
-                                        if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+                                        if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
                                         {
                                             var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                             s.PutCString (": ");
@@ -548,15 +486,15 @@
                                         ValueObject::DumpValueObject (result.GetOutputStream(), 
                                                                       valobj_sp.get(), 
                                                                       name_cstr, 
-                                                                      m_options.ptr_depth, 
+                                                                      m_varobj_options.ptr_depth, 
                                                                       0, 
-                                                                      m_options.max_depth, 
-                                                                      m_options.show_types,
-                                                                      m_options.show_location,
-                                                                      m_options.use_objc,
-                                                                      use_dynamic,
+                                                                      m_varobj_options.max_depth, 
+                                                                      m_varobj_options.show_types,
+                                                                      m_varobj_options.show_location,
+                                                                      m_varobj_options.use_objc,
+                                                                      m_varobj_options.use_dynamic,
                                                                       false,
-                                                                      m_options.flat_output);                                        
+                                                                      m_varobj_options.flat_output);                                        
                                     }
                                 }
                             }
@@ -576,9 +514,9 @@
                     // variable objects from them...
                     for (idx = 0; (name_cstr = command.GetArgumentAtIndex(idx)) != NULL; ++idx)
                     {
-                        uint32_t ptr_depth = m_options.ptr_depth;
+                        uint32_t ptr_depth = m_varobj_options.ptr_depth;
                         
-                        if (m_options.use_regex)
+                        if (m_frame_var_options.use_regex)
                         {
                             const uint32_t regex_start_index = regex_var_list.GetSize();
                             RegularExpression regex (name_cstr);
@@ -597,13 +535,13 @@
                                         var_sp = regex_var_list.GetVariableAtIndex (regex_idx);
                                         if (var_sp)
                                         {
-                                            valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, use_dynamic);
+                                            valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, m_varobj_options.use_dynamic);
                                             if (valobj_sp)
                                             {                                        
-                                                if (m_options.format != eFormatDefault)
-                                                    valobj_sp->SetFormat (m_options.format);
+                                                if (m_frame_var_options.format != eFormatDefault)
+                                                    valobj_sp->SetFormat (m_frame_var_options.format);
                                                 
-                                                if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+                                                if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
                                                 {
                                                     var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                                     s.PutCString (": ");
@@ -612,15 +550,15 @@
                                                 ValueObject::DumpValueObject (result.GetOutputStream(), 
                                                                               valobj_sp.get(), 
                                                                               var_sp->GetName().AsCString(), 
-                                                                              m_options.ptr_depth, 
+                                                                              m_varobj_options.ptr_depth, 
                                                                               0, 
-                                                                              m_options.max_depth, 
-                                                                              m_options.show_types,
-                                                                              m_options.show_location,
-                                                                              m_options.use_objc,
-                                                                              use_dynamic, 
+                                                                              m_varobj_options.max_depth, 
+                                                                              m_varobj_options.show_types,
+                                                                              m_varobj_options.show_location,
+                                                                              m_varobj_options.use_objc,
+                                                                              m_varobj_options.use_dynamic, 
                                                                               false,
-                                                                              m_options.flat_output);                                        
+                                                                              m_varobj_options.flat_output);                                        
                                             }
                                         }
                                     }
@@ -643,16 +581,17 @@
                         {
                             Error error;
                             uint32_t expr_path_options = StackFrame::eExpressionPathOptionCheckPtrVsMember;
-                            if (use_dynamic)
-                                expr_path_options |= StackFrame::eExpressionPathOptionsDynamicValue;
-                                
-                            valobj_sp = exe_ctx.frame->GetValueForVariableExpressionPath (name_cstr, expr_path_options, error);
+                            lldb::VariableSP var_sp;
+                            valobj_sp = exe_ctx.frame->GetValueForVariableExpressionPath (name_cstr, 
+                                                                                          m_varobj_options.use_dynamic, 
+                                                                                          expr_path_options,
+                                                                                          var_sp,
+                                                                                          error);
                             if (valobj_sp)
                             {
-                                if (m_options.format != eFormatDefault)
-                                    valobj_sp->SetFormat (m_options.format);
-                                
-                                if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+                                if (m_frame_var_options.format != eFormatDefault)
+                                    valobj_sp->SetFormat (m_frame_var_options.format);
+                                if (m_frame_var_options.show_decl && var_sp && var_sp->GetDeclaration ().GetFile())
                                 {
                                     var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                     s.PutCString (": ");
@@ -662,13 +601,13 @@
                                                               valobj_sp->GetParent() ? name_cstr : NULL, 
                                                               ptr_depth, 
                                                               0, 
-                                                              m_options.max_depth, 
-                                                              m_options.show_types,
-                                                              m_options.show_location,
-                                                              m_options.use_objc,
-                                                              use_dynamic,
+                                                              m_varobj_options.max_depth, 
+                                                              m_varobj_options.show_types,
+                                                              m_varobj_options.show_location,
+                                                              m_varobj_options.use_objc,
+                                                              m_varobj_options.use_dynamic,
                                                               false,
-                                                              m_options.flat_output);
+                                                              m_varobj_options.flat_output);
                             }
                             else
                             {
@@ -696,26 +635,26 @@
                             switch (var_sp->GetScope())
                             {
                             case eValueTypeVariableGlobal:
-                                dump_variable = m_options.show_globals;
-                                if (dump_variable && m_options.show_scope)
+                                dump_variable = m_frame_var_options.show_globals;
+                                if (dump_variable && m_frame_var_options.show_scope)
                                     s.PutCString("GLOBAL: ");
                                 break;
 
                             case eValueTypeVariableStatic:
-                                dump_variable = m_options.show_globals;
-                                if (dump_variable && m_options.show_scope)
+                                dump_variable = m_frame_var_options.show_globals;
+                                if (dump_variable && m_frame_var_options.show_scope)
                                     s.PutCString("STATIC: ");
                                 break;
                                 
                             case eValueTypeVariableArgument:
-                                dump_variable = m_options.show_args;
-                                if (dump_variable && m_options.show_scope)
+                                dump_variable = m_frame_var_options.show_args;
+                                if (dump_variable && m_frame_var_options.show_scope)
                                     s.PutCString("   ARG: ");
                                 break;
                                 
                             case eValueTypeVariableLocal:
-                                dump_variable = m_options.show_locals;
-                                if (dump_variable && m_options.show_scope)
+                                dump_variable = m_frame_var_options.show_locals;
+                                if (dump_variable && m_frame_var_options.show_scope)
                                     s.PutCString(" LOCAL: ");
                                 break;
 
@@ -729,17 +668,18 @@
                                 // Use the variable object code to make sure we are
                                 // using the same APIs as the the public API will be
                                 // using...
-                                valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, use_dynamic);
+                                valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, 
+                                                                                           m_varobj_options.use_dynamic);
                                 if (valobj_sp)
                                 {
-                                    if (m_options.format != eFormatDefault)
-                                        valobj_sp->SetFormat (m_options.format);
+                                    if (m_frame_var_options.format != eFormatDefault)
+                                        valobj_sp->SetFormat (m_frame_var_options.format);
                                     
                                     // When dumping all variables, don't print any variables
                                     // that are not in scope to avoid extra unneeded output
                                     if (valobj_sp->IsInScope ())
                                     {
-                                        if (m_options.show_decl && var_sp->GetDeclaration ().GetFile())
+                                        if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
                                         {
                                             var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                             s.PutCString (": ");
@@ -747,15 +687,15 @@
                                         ValueObject::DumpValueObject (result.GetOutputStream(), 
                                                                       valobj_sp.get(), 
                                                                       name_cstr, 
-                                                                      m_options.ptr_depth, 
+                                                                      m_varobj_options.ptr_depth, 
                                                                       0, 
-                                                                      m_options.max_depth, 
-                                                                      m_options.show_types,
-                                                                      m_options.show_location,
-                                                                      m_options.use_objc,
-                                                                      use_dynamic, 
+                                                                      m_varobj_options.max_depth, 
+                                                                      m_varobj_options.show_types,
+                                                                      m_varobj_options.show_location,
+                                                                      m_varobj_options.use_objc,
+                                                                      m_varobj_options.use_dynamic, 
                                                                       false,
-                                                                      m_options.flat_output);                                        
+                                                                      m_varobj_options.flat_output);                                        
                                     }
                                 }
                             }
@@ -769,31 +709,32 @@
     }
 protected:
 
-    CommandOptions m_options;
+    OptionGroupOptions m_option_group;
+    OptionGroupFrameVariable m_frame_var_options;
+    OptionGroupValueObjectDisplay m_varobj_options;
 };
 
 OptionDefinition
-CommandObjectFrameVariable::CommandOptions::g_option_table[] =
+CommandObjectFrameVariable::OptionGroupFrameVariable::g_option_table[] =
 {
-{ LLDB_OPT_SET_1, false, "aggregate-depth", 'A', required_argument, NULL, 0, eArgTypeCount,   "Set the max recurse depth when dumping aggregate types (default is infinity)."},
 { LLDB_OPT_SET_1, false, "no-args",         'a', no_argument,       NULL, 0, eArgTypeNone,    "Omit function arguments."},
 { LLDB_OPT_SET_1, false, "show-declaration",'c', no_argument,       NULL, 0, eArgTypeNone,    "Show variable declaration information (source file and line where the variable was declared)."},
-{ LLDB_OPT_SET_1, false, "debug",           'D', no_argument,       NULL, 0, eArgTypeNone,    "Enable verbose debug information."},
-{ LLDB_OPT_SET_1, false, "dynamic-type",    'd', required_argument, NULL, 0, eArgTypeBoolean, "Show the object as its full dynamic type, not its static type, if available."},
 { LLDB_OPT_SET_1, false, "format",          'f', required_argument, NULL, 0, eArgTypeExprFormat,  "Specify the format that the variable output should use."},
-{ 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."},
 { LLDB_OPT_SET_1, false, "show-globals",    'g', no_argument,       NULL, 0, eArgTypeNone,    "Show the current frame source file global and static variables."},
 { LLDB_OPT_SET_1, false, "find-global",     'G', required_argument, NULL, 0, eArgTypeVarName, "Find a global variable by name (which might not be in the current stack frame source file)."},
-{ LLDB_OPT_SET_1, false, "location",        'L', no_argument,       NULL, 0, eArgTypeNone,    "Show variable location information."},
 { LLDB_OPT_SET_1, false, "no-locals",       'l', no_argument,       NULL, 0, eArgTypeNone,    "Omit local variables."},
-{ LLDB_OPT_SET_1, false, "objc",            'o', no_argument,       NULL, 0, eArgTypeNone,    "When looking up a variable by name, print as an Objective-C object."},
-{ 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)."},
 { LLDB_OPT_SET_1, false, "regex",           'r', no_argument,       NULL, 0, eArgTypeRegularExpression,    "The <variable-name> argument for name lookups are regular expressions."},
 { LLDB_OPT_SET_1, false, "scope",           's', no_argument,       NULL, 0, eArgTypeNone,    "Show variable scope (argument, local, global, static)."},
-{ LLDB_OPT_SET_1, false, "show-types",      't', no_argument,       NULL, 0, eArgTypeNone,    "Show variable types when dumping values."},
-{ LLDB_OPT_SET_1, false, "no-summary",      'y', no_argument,       NULL, 0, eArgTypeNone,    "Omit summary information."},
 { 0, false, NULL, 0, 0, NULL, NULL, eArgTypeNone, NULL }
 };
+
+uint32_t
+CommandObjectFrameVariable::OptionGroupFrameVariable::GetNumDefinitions ()
+{
+    return sizeof(CommandObjectFrameVariable::OptionGroupFrameVariable::g_option_table)/sizeof(OptionDefinition);
+}
+        
+
 #pragma mark CommandObjectMultiwordFrame
 
 //-------------------------------------------------------------------------