[Lldb-commits] [lldb] r255687 - Enable the 'type X list' formatters commands to list formatters in language categories
Enrico Granata via lldb-commits
lldb-commits at lists.llvm.org
Tue Dec 15 14:20:19 PST 2015
Author: enrico
Date: Tue Dec 15 16:20:19 2015
New Revision: 255687
URL: http://llvm.org/viewvc/llvm-project?rev=255687&view=rev
Log:
Enable the 'type X list' formatters commands to list formatters in language categories
Modified:
lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-categories/TestDataFormatterCategories.py
lldb/trunk/source/Commands/CommandObjectType.cpp
Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-categories/TestDataFormatterCategories.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-categories/TestDataFormatterCategories.py?rev=255687&r1=255686&r2=255687&view=diff
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-categories/TestDataFormatterCategories.py (original)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/data-formatter-categories/TestDataFormatterCategories.py Tue Dec 15 16:20:19 2015
@@ -320,7 +320,10 @@ class CategoriesDataFormatterTestCase(Te
# Now delete all categories
self.runCmd("type category delete CircleCategory RectangleStarCategory BaseCategory RectangleCategory")
- # last of all, check that a deleted category with filter does not blow us up
+ # check that a deleted category with filter does not blow us up
self.expect('frame variable r2',
substrs = ['w = 9',
'h = 16'])
+
+ # and also validate that one can print formatters for a language
+ self.expect('type summary list -l c++', substrs=['vector', 'map', 'list', 'string'])
Modified: lldb/trunk/source/Commands/CommandObjectType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectType.cpp?rev=255687&r1=255686&r2=255687&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectType.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectType.cpp Tue Dec 15 16:20:19 2015
@@ -32,6 +32,7 @@
#include "lldb/Interpreter/OptionGroupFormat.h"
#include "lldb/Interpreter/OptionValueBoolean.h"
#include "lldb/Interpreter/OptionValueLanguage.h"
+#include "lldb/Interpreter/OptionValueString.h"
#include "lldb/Target/Language.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/StackFrame.h"
@@ -1263,7 +1264,9 @@ class CommandObjectTypeFormatterList : p
public:
CommandOptions (CommandInterpreter &interpreter) :
- Options (interpreter)
+ Options (interpreter),
+ m_category_regex("",""),
+ m_category_language(lldb::eLanguageTypeUnknown, lldb::eLanguageTypeUnknown)
{
}
@@ -1278,7 +1281,10 @@ class CommandObjectTypeFormatterList : p
switch (short_option)
{
case 'w':
- m_category_regex = std::string(option_arg);
+ m_category_regex.SetCurrentValue(option_arg);
+ break;
+ case 'l':
+ error = m_category_language.SetValueFromString(option_arg);
break;
default:
error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
@@ -1291,7 +1297,8 @@ class CommandObjectTypeFormatterList : p
void
OptionParsingStarting () override
{
- m_category_regex = "";
+ m_category_regex.Clear();
+ m_category_language.Clear();
}
const OptionDefinition*
@@ -1299,7 +1306,8 @@ class CommandObjectTypeFormatterList : p
{
static OptionDefinition g_option_table[] =
{
- { LLDB_OPT_SET_ALL, false, "category-regex", 'w', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeName, "Only show categories matching this filter."},
+ { LLDB_OPT_SET_1, false, "category-regex", 'w', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeName, "Only show categories matching this filter."},
+ { LLDB_OPT_SET_2, false, "language", 'l', OptionParser::eRequiredArgument, NULL, NULL, 0, eArgTypeLanguage, "Only show the category for a specific language."},
{ 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL }
};
@@ -1312,8 +1320,8 @@ class CommandObjectTypeFormatterList : p
// Instance variables to hold the values for command options.
- std::string m_category_regex;
-
+ OptionValueString m_category_regex;
+ OptionValueLanguage m_category_language;
};
CommandOptions m_options;
@@ -1363,12 +1371,12 @@ protected:
std::unique_ptr<RegularExpression> category_regex;
std::unique_ptr<RegularExpression> formatter_regex;
- if (m_options.m_category_regex.size() > 0)
+ if (m_options.m_category_regex.OptionWasSet())
{
category_regex.reset(new RegularExpression());
- if (!category_regex->Compile(m_options.m_category_regex.c_str()))
+ if (!category_regex->Compile(m_options.m_category_regex.GetCurrentValue()))
{
- result.AppendErrorWithFormat("syntax error in category regular expression '%s'", m_options.m_category_regex.c_str());
+ result.AppendErrorWithFormat("syntax error in category regular expression '%s'", m_options.m_category_regex.GetCurrentValue());
result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1386,29 +1394,13 @@ protected:
}
}
- DataVisualization::Categories::ForEach( [this, &command, &result, &category_regex, &formatter_regex] (const lldb::TypeCategoryImplSP& category) -> bool {
- if (category_regex)
- {
- bool escape = true;
- if (0 == strcmp(category->GetName(), category_regex->GetText()))
- {
- escape = false;
- }
- else if (category_regex->Execute(category->GetName()))
- {
- escape = false;
- }
-
- if (escape)
- return true;
- }
-
+ auto category_closure = [&result, &formatter_regex] (const lldb::TypeCategoryImplSP& category) -> void {
result.GetOutputStream().Printf("-----------------------\nCategory: %s\n-----------------------\n", category->GetName());
typedef const std::shared_ptr<FormatterType> Bar;
typedef std::function<bool(ConstString,Bar)> Func1Type;
typedef std::function<bool(RegularExpressionSP,Bar)> Func2Type;
-
+
TypeCategoryImpl::ForEachCallbacks<FormatterType> foreach;
foreach.SetExact([&result, &formatter_regex] (ConstString name, const FormatterSharedPointer& format_sp) -> bool {
if (formatter_regex)
@@ -1426,12 +1418,12 @@ protected:
if (escape)
return true;
}
-
+
result.GetOutputStream().Printf ("%s: %s\n", name.AsCString(), format_sp->GetDescription().c_str());
return true;
});
-
+
foreach.SetWithRegex( [&result, &formatter_regex] (RegularExpressionSP regex_sp, const FormatterSharedPointer& format_sp) -> bool {
if (formatter_regex)
{
@@ -1453,14 +1445,44 @@ protected:
return true;
});
-
+
category->ForEach(foreach);
+ };
+
+ if (m_options.m_category_language.OptionWasSet())
+ {
+ lldb::TypeCategoryImplSP category_sp;
+ DataVisualization::Categories::GetCategory(m_options.m_category_language.GetCurrentValue(), category_sp);
+ if (category_sp)
+ category_closure(category_sp);
+ }
+ else
+ {
+ DataVisualization::Categories::ForEach( [this, &command, &result, &category_regex, &formatter_regex, &category_closure] (const lldb::TypeCategoryImplSP& category) -> bool {
+ if (category_regex)
+ {
+ bool escape = true;
+ if (0 == strcmp(category->GetName(), category_regex->GetText()))
+ {
+ escape = false;
+ }
+ else if (category_regex->Execute(category->GetName()))
+ {
+ escape = false;
+ }
+
+ if (escape)
+ return true;
+ }
+
+ category_closure(category);
+
+ return true;
+ });
- return true;
- });
+ FormatterSpecificList(result);
+ }
- FormatterSpecificList(result);
-
result.SetStatus(eReturnStatusSuccessFinishResult);
return result.Succeeded();
}
More information about the lldb-commits
mailing list