From e5ee6f04ab2a5fb162454a5b9ccc968c3c9105f1 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Tue, 29 Mar 2016 22:00:08 +0000 Subject: 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. llvm-svn: 264793 --- lldb/source/Expression/ExpressionSourceCode.cpp | 67 ++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 8 deletions(-) (limited to 'lldb/source/Expression/ExpressionSourceCode.cpp') diff --git a/lldb/source/Expression/ExpressionSourceCode.cpp b/lldb/source/Expression/ExpressionSourceCode.cpp index 5777e3b4d6e..4f5305b5c6e 100644 --- a/lldb/source/Expression/ExpressionSourceCode.cpp +++ b/lldb/source/Expression/ExpressionSourceCode.cpp @@ -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; +} + -- cgit v1.2.3