From 1b13cb921bef73e32d20405ea4cc8520cd635f5a Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 10 Dec 2013 23:18:06 +0000 Subject: [PATCH] ObjectiveC. Provide a property-dot syntax for fixit when selector in objc_bridge_related attribute names a property. // rdar://15517899 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196984 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprObjC.cpp | 28 +++++++++++++------ .../fixit-objc-bridge-related-property.m | 23 +++++++++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 test/FixIt/fixit-objc-bridge-related-property.m diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index aeb934c381..c73a0b1387 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -3467,16 +3467,28 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, else { // Implicit conversion from ObjC type to CF object is needed. if (InstanceMethod) { - // Provide a fixit: [ObjectExpr InstanceMethod]; - std::string ExpressionString = " "; - ExpressionString += InstanceMethod->getSelector().getAsString(); - ExpressionString += "]"; + std::string ExpressionString; SourceLocation SrcExprEndLoc = PP.getLocForEndOfToken(SrcExpr->getLocEnd()); + if (InstanceMethod->isPropertyAccessor()) + if (const ObjCPropertyDecl *PDecl = InstanceMethod->findPropertyDecl()) { + // fixit: ObjectExpr.propertyname when it is aproperty accessor. + ExpressionString = "."; + ExpressionString += PDecl->getNameAsString(); + Diag(Loc, diag::err_objc_bridged_related_known_method) + << SrcType << DestType << InstanceMethod->getSelector() << true + << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString); + } + if (ExpressionString.empty()) { + // Provide a fixit: [ObjectExpr InstanceMethod] + ExpressionString = " "; + ExpressionString += InstanceMethod->getSelector().getAsString(); + ExpressionString += "]"; - Diag(Loc, diag::err_objc_bridged_related_known_method) - << SrcType << DestType << InstanceMethod->getSelector() << true - << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[") - << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString); + Diag(Loc, diag::err_objc_bridged_related_known_method) + << SrcType << DestType << InstanceMethod->getSelector() << true + << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[") + << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString); + } } else Diag(Loc, diag::err_objc_bridged_related_unknown_method) diff --git a/test/FixIt/fixit-objc-bridge-related-property.m b/test/FixIt/fixit-objc-bridge-related-property.m new file mode 100644 index 0000000000..5b13645d49 --- /dev/null +++ b/test/FixIt/fixit-objc-bridge-related-property.m @@ -0,0 +1,23 @@ +// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -fdiagnostics-parseable-fixits -x objective-c %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-arc -fdiagnostics-parseable-fixits -x objective-c %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -fdiagnostics-parseable-fixits -x objective-c++ %s 2>&1 | FileCheck %s +// rdar://15517899 + +typedef struct __attribute__((objc_bridge_related(NSColor,colorWithCGColor:,CGColor))) CGColor *CGColorRef; + +@interface NSColor ++ (NSColor *)colorWithCGColor:(CGColorRef)cgColor; +@property CGColorRef CGColor; +@end + +@interface NSTextField +- (void)setBackgroundColor:(NSColor *)color; +- (NSColor *)backgroundColor; +@end + +CGColorRef Test(NSTextField *textField, CGColorRef newColor) { + newColor = textField.backgroundColor; + return textField.backgroundColor; +} +// CHECK:{19:38-19:38}:".CGColor" +// CHECK:{20:34-20:34}:".CGColor" -- 2.40.0