Figure out what the fixed expression is, and print it. Added another target setting to

quietly apply fixits for those who really trust clang's fixits.

Also, moved the retry into ClangUserExpression::Evaluate, where I can make a whole new ClangUserExpression 
to do the work.  Reusing any of the parts of a UserExpression in situ isn't supported at present.

<rdar://problem/25351938>

llvm-svn: 264793
This commit is contained in:
Jim Ingham
2016-03-29 22:00:08 +00:00
parent bd54f5bd25
commit e5ee6f04ab
13 changed files with 220 additions and 71 deletions

View File

@@ -61,6 +61,9 @@ extern "C"
}
)";
static const char *c_start_marker = " /*LLDB_BODY_START*/\n ";
static const char *c_end_marker = ";\n /*LLDB_BODY_END*/\n";
namespace {
class AddMacroState
@@ -301,6 +304,22 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
target_specific_defines,
m_prefix.c_str());
// First construct a tagged form of the user expression so we can find it later:
std::string tagged_body;
switch (wrapping_language)
{
default:
tagged_body = m_body;
break;
case lldb::eLanguageTypeC:
case lldb::eLanguageTypeC_plus_plus:
case lldb::eLanguageTypeObjC:
tagged_body.append(c_start_marker);
tagged_body.append(m_body);
tagged_body.append(c_end_marker);
break;
}
switch (wrapping_language)
{
default:
@@ -310,23 +329,23 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
"%s(void *$__lldb_arg) \n"
"{ \n"
" %s; \n"
" %s; \n"
"%s"
"} \n",
m_name.c_str(),
lldb_local_var_decls.GetData(),
m_body.c_str());
tagged_body.c_str());
break;
case lldb::eLanguageTypeC_plus_plus:
wrap_stream.Printf("void \n"
"$__lldb_class::%s(void *$__lldb_arg) %s\n"
"{ \n"
" %s; \n"
" %s; \n"
"%s"
"} \n",
m_name.c_str(),
(const_object ? "const" : ""),
lldb_local_var_decls.GetData(),
m_body.c_str());
tagged_body.c_str());
break;
case lldb::eLanguageTypeObjC:
if (static_method)
@@ -337,12 +356,12 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
"@implementation $__lldb_objc_class ($__lldb_category) \n"
"+(void)%s:(void *)$__lldb_arg \n"
"{ \n"
" %s; \n"
"%s"
"} \n"
"@end \n",
m_name.c_str(),
m_name.c_str(),
m_body.c_str());
tagged_body.c_str());
}
else
{
@@ -352,12 +371,12 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
"@implementation $__lldb_objc_class ($__lldb_category) \n"
"-(void)%s:(void *)$__lldb_arg \n"
"{ \n"
" %s; \n"
"%s"
"} \n"
"@end \n",
m_name.c_str(),
m_name.c_str(),
m_body.c_str());
tagged_body.c_str());
}
break;
}
@@ -371,3 +390,35 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
return true;
}
bool
ExpressionSourceCode::GetOriginalBodyBounds(std::string transformed_text,
lldb::LanguageType wrapping_language,
size_t &start_loc,
size_t &end_loc)
{
const char *start_marker;
const char *end_marker;
switch (wrapping_language)
{
default:
return false;
case lldb::eLanguageTypeC:
case lldb::eLanguageTypeC_plus_plus:
case lldb::eLanguageTypeObjC:
start_marker = c_start_marker;
end_marker = c_end_marker;
break;
}
start_loc = transformed_text.find(start_marker);
if (start_loc == std::string::npos)
return false;
start_loc += strlen(start_marker);
end_loc = transformed_text.find(end_marker);
if (end_loc == std::string::npos)
return false;
return true;
}