]> granicus.if.org Git - clang/commitdiff
ObjectiveC. Provide a property-dot syntax for fixit
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 10 Dec 2013 23:18:06 +0000 (23:18 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 10 Dec 2013 23:18:06 +0000 (23:18 +0000)
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
test/FixIt/fixit-objc-bridge-related-property.m [new file with mode: 0644]

index aeb934c3811f271463b3026cb96daa0fa0d24bf0..c73a0b1387816298b01a2008d63c9f211ae09853 100644 (file)
@@ -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 (file)
index 0000000..5b13645
--- /dev/null
@@ -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"