[Lldb-commits] [lldb] r246884 - Add a --language (-l) option to type category {enable|disable} to allow people to turn on and off formatters for a given language

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 4 15:07:49 PDT 2015


Author: enrico
Date: Fri Sep  4 17:07:48 2015
New Revision: 246884

URL: http://llvm.org/viewvc/llvm-project?rev=246884&view=rev
Log:
Add a --language (-l) option to type category {enable|disable} to allow people to turn on and off formatters for a given language


Modified:
    lldb/trunk/include/lldb/DataFormatters/DataVisualization.h
    lldb/trunk/include/lldb/DataFormatters/FormatManager.h
    lldb/trunk/source/Commands/CommandObjectType.cpp
    lldb/trunk/source/DataFormatters/DataVisualization.cpp
    lldb/trunk/test/functionalities/type_completion/TestTypeCompletion.py

Modified: lldb/trunk/include/lldb/DataFormatters/DataVisualization.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/DataVisualization.h?rev=246884&r1=246883&r2=246884&view=diff
==============================================================================
--- lldb/trunk/include/lldb/DataFormatters/DataVisualization.h (original)
+++ lldb/trunk/include/lldb/DataFormatters/DataVisualization.h Fri Sep  4 17:07:48 2015
@@ -134,7 +134,13 @@ public:
                 TypeCategoryMap::Position = TypeCategoryMap::Default);
         
         static void
+        Enable (lldb::LanguageType lang_type);
+        
+        static void
         Disable (const ConstString& category);
+        
+        static void
+        Disable (lldb::LanguageType lang_type);
 
         static void
         Enable (const lldb::TypeCategoryImplSP& category,

Modified: lldb/trunk/include/lldb/DataFormatters/FormatManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatManager.h?rev=246884&r1=246883&r2=246884&view=diff
==============================================================================
--- lldb/trunk/include/lldb/DataFormatters/FormatManager.h (original)
+++ lldb/trunk/include/lldb/DataFormatters/FormatManager.h Fri Sep  4 17:07:48 2015
@@ -258,6 +258,9 @@ public:
     
     static ConstString
     GetTypeForCache (ValueObject&, lldb::DynamicValueType);
+    
+    LanguageCategory*
+    GetCategoryForLanguage (lldb::LanguageType lang_type);
 
 private:
     
@@ -272,9 +275,6 @@ private:
                         bool did_strip_typedef,
                         bool root_level = false);
     
-    LanguageCategory*
-    GetCategoryForLanguage (lldb::LanguageType lang_type);
-    
     FormatCache m_format_cache;
     NamedSummariesMap m_named_summaries_map;
     std::atomic<uint32_t> m_last_revision;

Modified: lldb/trunk/source/Commands/CommandObjectType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectType.cpp?rev=246884&r1=246883&r2=246884&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectType.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectType.cpp Fri Sep  4 17:07:48 2015
@@ -30,6 +30,7 @@
 #include "lldb/Interpreter/CommandReturnObject.h"
 #include "lldb/Interpreter/Options.h"
 #include "lldb/Interpreter/OptionGroupFormat.h"
+#include "lldb/Target/Language.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/StackFrame.h"
 #include "lldb/Target/Target.h"
@@ -2460,12 +2461,79 @@ CommandObjectTypeSummaryList::CommandOpt
 
 class CommandObjectTypeCategoryEnable : public CommandObjectParsed
 {
+    class CommandOptions : public Options
+    {
+    public:
+        
+        CommandOptions (CommandInterpreter &interpreter) :
+        Options (interpreter)
+        {
+        }
+        
+        virtual
+        ~CommandOptions (){}
+        
+        virtual Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        {
+            Error error;
+            const int short_option = m_getopt_table[option_idx].val;
+            
+            switch (short_option)
+            {
+                case 'l':
+                    if (option_arg)
+                    {
+                        m_language = Language::GetLanguageTypeFromString(option_arg);
+                        if (m_language == lldb::eLanguageTypeUnknown)
+                            error.SetErrorStringWithFormat ("unrecognized language '%s'", option_arg);
+                    }
+                    break;
+                default:
+                    error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+                    break;
+            }
+            
+            return error;
+        }
+        
+        void
+        OptionParsingStarting ()
+        {
+            m_language = lldb::eLanguageTypeUnknown;
+        }
+        
+        const OptionDefinition*
+        GetDefinitions ()
+        {
+            return g_option_table;
+        }
+        
+        // Options table: Required for subclasses of Options.
+        
+        static OptionDefinition g_option_table[];
+        
+        // Instance variables to hold the values for command options.
+        
+        lldb::LanguageType m_language;
+        
+    };
+    
+    CommandOptions m_options;
+    
+    virtual Options *
+    GetOptions ()
+    {
+        return &m_options;
+    }
+    
 public:
     CommandObjectTypeCategoryEnable (CommandInterpreter &interpreter) :
         CommandObjectParsed (interpreter,
                              "type category enable",
                              "Enable a category as a source of formatters.",
-                             NULL)
+                             NULL),
+        m_options(interpreter)
     {
         CommandArgumentEntry type_arg;
         CommandArgumentData type_style_arg;
@@ -2489,9 +2557,10 @@ protected:
     {
         const size_t argc = command.GetArgumentCount();
         
-        if (argc < 1)
+        if (argc < 1 &&
+            m_options.m_language == lldb::eLanguageTypeUnknown)
         {
-            result.AppendErrorWithFormat ("%s takes 1 or more args.\n", m_cmd_name.c_str());
+            result.AppendErrorWithFormat ("%s takes arguments and/or a language", m_cmd_name.c_str());
             result.SetStatus(eReturnStatusFailed);
             return false;
         }
@@ -2500,7 +2569,7 @@ protected:
         {
             DataVisualization::Categories::EnableStar();
         }
-        else
+        else if (argc > 0)
         {
             for (int i = argc - 1; i >= 0; i--)
             {
@@ -2525,12 +2594,22 @@ protected:
             }
         }
         
+        if (m_options.m_language != lldb::eLanguageTypeUnknown)
+            DataVisualization::Categories::Enable(m_options.m_language);
+        
         result.SetStatus(eReturnStatusSuccessFinishResult);
         return result.Succeeded();
     }
     
 };
 
+OptionDefinition
+CommandObjectTypeCategoryEnable::CommandOptions::g_option_table[] =
+{
+    { LLDB_OPT_SET_ALL, false, "language", 'l', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeLanguage,  "Enable the category for this language."},
+    { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL }
+};
+
 //-------------------------------------------------------------------------
 // CommandObjectTypeCategoryDelete
 //-------------------------------------------------------------------------
@@ -2610,12 +2689,79 @@ protected:
 
 class CommandObjectTypeCategoryDisable : public CommandObjectParsed
 {
+    class CommandOptions : public Options
+    {
+    public:
+        
+        CommandOptions (CommandInterpreter &interpreter) :
+        Options (interpreter)
+        {
+        }
+        
+        virtual
+        ~CommandOptions (){}
+        
+        virtual Error
+        SetOptionValue (uint32_t option_idx, const char *option_arg)
+        {
+            Error error;
+            const int short_option = m_getopt_table[option_idx].val;
+            
+            switch (short_option)
+            {
+                case 'l':
+                    if (option_arg)
+                    {
+                        m_language = Language::GetLanguageTypeFromString(option_arg);
+                        if (m_language == lldb::eLanguageTypeUnknown)
+                            error.SetErrorStringWithFormat ("unrecognized language '%s'", option_arg);
+                    }
+                    break;
+                default:
+                    error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
+                    break;
+            }
+            
+            return error;
+        }
+        
+        void
+        OptionParsingStarting ()
+        {
+            m_language = lldb::eLanguageTypeUnknown;
+        }
+        
+        const OptionDefinition*
+        GetDefinitions ()
+        {
+            return g_option_table;
+        }
+        
+        // Options table: Required for subclasses of Options.
+        
+        static OptionDefinition g_option_table[];
+        
+        // Instance variables to hold the values for command options.
+        
+        lldb::LanguageType m_language;
+        
+    };
+    
+    CommandOptions m_options;
+    
+    virtual Options *
+    GetOptions ()
+    {
+        return &m_options;
+    }
+
 public:
     CommandObjectTypeCategoryDisable (CommandInterpreter &interpreter) :
         CommandObjectParsed (interpreter,
                              "type category disable",
                              "Disable a category as a source of formatters.",
-                             NULL)
+                             NULL),
+        m_options(interpreter)
     {
         CommandArgumentEntry type_arg;
         CommandArgumentData type_style_arg;
@@ -2639,9 +2785,10 @@ protected:
     {
         const size_t argc = command.GetArgumentCount();
         
-        if (argc < 1)
+        if (argc < 1 &&
+            m_options.m_language == lldb::eLanguageTypeUnknown)
         {
-            result.AppendErrorWithFormat ("%s takes 1 or more args.\n", m_cmd_name.c_str());
+            result.AppendErrorWithFormat ("%s takes arguments and/or a language", m_cmd_name.c_str());
             result.SetStatus(eReturnStatusFailed);
             return false;
         }
@@ -2650,7 +2797,7 @@ protected:
         {
             DataVisualization::Categories::DisableStar();
         }
-        else
+        else if (argc > 0)
         {
             // the order is not relevant here
             for (int i = argc - 1; i >= 0; i--)
@@ -2667,6 +2814,9 @@ protected:
                 DataVisualization::Categories::Disable(typeCS);
             }
         }
+        
+        if (m_options.m_language != lldb::eLanguageTypeUnknown)
+            DataVisualization::Categories::Disable(m_options.m_language);
 
         result.SetStatus(eReturnStatusSuccessFinishResult);
         return result.Succeeded();
@@ -2674,6 +2824,13 @@ protected:
     
 };
 
+OptionDefinition
+CommandObjectTypeCategoryDisable::CommandOptions::g_option_table[] =
+{
+    { LLDB_OPT_SET_ALL, false, "language", 'l', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeLanguage,  "Enable the category for this language."},
+    { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL }
+};
+
 //-------------------------------------------------------------------------
 // CommandObjectTypeCategoryList
 //-------------------------------------------------------------------------

Modified: lldb/trunk/source/DataFormatters/DataVisualization.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/DataVisualization.cpp?rev=246884&r1=246883&r2=246884&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/DataVisualization.cpp (original)
+++ lldb/trunk/source/DataFormatters/DataVisualization.cpp Fri Sep  4 17:07:48 2015
@@ -168,6 +168,13 @@ DataVisualization::Categories::Enable (c
 }
 
 void
+DataVisualization::Categories::Enable (lldb::LanguageType lang_type)
+{
+    if (LanguageCategory* lang_category = GetFormatManager().GetCategoryForLanguage(lang_type))
+        lang_category->Enable();
+}
+
+void
 DataVisualization::Categories::Disable (const ConstString& category)
 {
     if (GetFormatManager().GetCategory(category)->IsEnabled() == true)
@@ -175,6 +182,13 @@ DataVisualization::Categories::Disable (
 }
 
 void
+DataVisualization::Categories::Disable (lldb::LanguageType lang_type)
+{
+    if (LanguageCategory* lang_category = GetFormatManager().GetCategoryForLanguage(lang_type))
+        lang_category->Disable();
+}
+
+void
 DataVisualization::Categories::Enable (const lldb::TypeCategoryImplSP& category,
                                        TypeCategoryMap::Position pos)
 {

Modified: lldb/trunk/test/functionalities/type_completion/TestTypeCompletion.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/type_completion/TestTypeCompletion.py?rev=246884&r1=246883&r2=246884&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/type_completion/TestTypeCompletion.py (original)
+++ lldb/trunk/test/functionalities/type_completion/TestTypeCompletion.py Fri Sep  4 17:07:48 2015
@@ -14,14 +14,12 @@ class TypeCompletionTestCase(TestBase):
 
     @skipUnlessDarwin
     @dsym_test
-    @unittest2.expectedFailure("xfail pending a way to disable language categories")
     def test_with_dsym_and_run_command(self):
         """Check that types only get completed when necessary."""
         self.buildDsym()
         self.type_completion_commands()
 
     @dwarf_test
-    @unittest2.expectedFailure("xfail pending a way to disable language categories")
     @expectedFailureIcc # often fails with 'NameAndAddress should be valid'
     # Fails with gcc 4.8.1 with llvm.org/pr15301 LLDB prints incorrect sizes of STL containers
     def test_with_dwarf_and_run_command(self):
@@ -49,11 +47,9 @@ class TypeCompletionTestCase(TestBase):
         # This is the function to remove the custom formats in order to have a
         # clean slate for the next test case.
         def cleanup():
-            self.runCmd('type category enable gnu-libstdc++', check=False)
-            self.runCmd('type category enable libcxx', check=False)
+            self.runCmd('type category enable -l c++', check=False)
 
-        self.runCmd('type category disable gnu-libstdc++', check=False)
-        self.runCmd('type category disable libcxx', check=False)
+        self.runCmd('type category disable -l c++', check=False)
 
         # Execute the cleanup function during test case tear down.
         self.addTearDownHook(cleanup)
@@ -117,8 +113,7 @@ class TypeCompletionTestCase(TestBase):
         self.assertTrue(string.IsValid(), 'std::string should be valid')
         self.assertFalse(string.IsTypeComplete(), 'std::string complete but it should not be')
 
-        self.runCmd('type category enable gnu-libstdc++', check=False)
-        self.runCmd('type category enable libcxx', check=False)
+        self.runCmd('type category enable -l c++', check=False)
         self.runCmd('frame variable guy --show-types')
 
         p_vector = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable('p')




More information about the lldb-commits mailing list