Pulled in a new version of LLVM/Clang to solve a variety
of problems with Objective-C object completion. To go along with the LLVM/Clang-side fixes, we have a variety of Objective-C improvements. Fixes include: - It is now possible to run expressions when stopped in an Objective-C class method and have "self" act just like "self" would act in the class method itself (i.e., [self classMethod] works without casting the return type if debug info is present). To accomplish this, the expression masquerades as a class method added by a category. - Objective-C objects can now provide methods and properties and methods to Clang on demand (i.e., the ASTImporter sets hasExternalVisibleDecls on Objective-C interface objects). - Objective-C built-in types, which had long been a bone of contention (should we be using "id"? "id*"?), are now fetched correctly using accessor functions on ClangASTContext. We inhibit searches for them in the debug information. There are also a variety of logging fixes, and I made two changes to the test suite: - Enabled a test case for Objective-C properties in the current translation unit. - Added a test case for calling Objective-C class methods when stopped in a class method. llvm-svn: 144607
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
|
||||
using namespace lldb_private;
|
||||
|
||||
bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object) const
|
||||
bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object, bool static_method) const
|
||||
{
|
||||
if (m_wrap)
|
||||
{
|
||||
@@ -59,21 +59,42 @@ bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrappi
|
||||
m_body.c_str());
|
||||
break;
|
||||
case lldb::eLanguageTypeObjC:
|
||||
wrap_stream.Printf("%s \n"
|
||||
"typedef unsigned short unichar; \n"
|
||||
"@interface $__lldb_objc_class ($__lldb_category) \n"
|
||||
"-(void)%s:(void *)$__lldb_arg; \n"
|
||||
"@end \n"
|
||||
"@implementation $__lldb_objc_class ($__lldb_category) \n"
|
||||
"-(void)%s:(void *)$__lldb_arg \n"
|
||||
"{ \n"
|
||||
" %s; \n"
|
||||
"} \n"
|
||||
"@end \n",
|
||||
m_prefix.c_str(),
|
||||
m_name.c_str(),
|
||||
m_name.c_str(),
|
||||
m_body.c_str());
|
||||
if (static_method)
|
||||
{
|
||||
wrap_stream.Printf("%s \n"
|
||||
"typedef unsigned short unichar; \n"
|
||||
"@interface $__lldb_objc_class ($__lldb_category) \n"
|
||||
"+(void)%s:(void *)$__lldb_arg; \n"
|
||||
"@end \n"
|
||||
"@implementation $__lldb_objc_class ($__lldb_category) \n"
|
||||
"+(void)%s:(void *)$__lldb_arg \n"
|
||||
"{ \n"
|
||||
" %s; \n"
|
||||
"} \n"
|
||||
"@end \n",
|
||||
m_prefix.c_str(),
|
||||
m_name.c_str(),
|
||||
m_name.c_str(),
|
||||
m_body.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
wrap_stream.Printf("%s \n"
|
||||
"typedef unsigned short unichar; \n"
|
||||
"@interface $__lldb_objc_class ($__lldb_category) \n"
|
||||
"-(void)%s:(void *)$__lldb_arg; \n"
|
||||
"@end \n"
|
||||
"@implementation $__lldb_objc_class ($__lldb_category) \n"
|
||||
"-(void)%s:(void *)$__lldb_arg \n"
|
||||
"{ \n"
|
||||
" %s; \n"
|
||||
"} \n"
|
||||
"@end \n",
|
||||
m_prefix.c_str(),
|
||||
m_name.c_str(),
|
||||
m_name.c_str(),
|
||||
m_body.c_str());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user