r184086 - Objective-C [qoi]: Provide fixit hint when message with typo

Fariborz Jahanian fjahanian at apple.com
Mon Jun 17 10:10:54 PDT 2013


Author: fjahanian
Date: Mon Jun 17 12:10:54 2013
New Revision: 184086

URL: http://llvm.org/viewvc/llvm-project?rev=184086&view=rev
Log:
Objective-C [qoi]: Provide fixit hint when message with typo
is sent to a receiver object. This is wip. // rdar://7853549

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/include/clang/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/FixIt/selector-fixit.m
    cfe/trunk/test/SemaObjC/call-super-2.m
    cfe/trunk/test/SemaObjC/protocol-id-test-1.m

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Jun 17 12:10:54 2013
@@ -4601,6 +4601,9 @@ def warn_instance_method_on_class_found
 def warn_inst_method_not_found : Warning<
   "instance method %objcinstance0 not found (return type defaults to 'id')">,
   InGroup<MethodAccess>;
+def warn_method_not_found_with_typo : Warning<
+  "%select{instance|class}0 method %1 not found (return type defaults to 'id')"
+  "; did you mean %2?">, InGroup<MethodAccess>;
 def error_no_super_class_message : Error<
   "no @interface declaration found in class messaging of %0">;
 def error_root_class_cannot_use_super : Error<

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Mon Jun 17 12:10:54 2013
@@ -2672,7 +2672,8 @@ public:
                                     warn, /*instance*/false);
   }
 
-  const ObjCMethodDecl *SelectorsForTypoCorrection(Selector Sel);
+  const ObjCMethodDecl *SelectorsForTypoCorrection(Selector Sel,
+                              QualType ObjectType=QualType());
   
   /// DiagnoseMismatchedMethodsInGlobalPool - This routine goes through list of
   /// methods in global pool and issues diagnostic on identical selectors which

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Mon Jun 17 12:10:54 2013
@@ -2295,8 +2295,18 @@ HelperSelectorsForTypoCorrection(
   }
 }
 
+static bool HelperIsMethodInObjCType(Sema &S, Selector Sel,
+                                     QualType ObjectType) {
+  if (ObjectType.isNull())
+    return true;
+  if (S.LookupMethodInObjectType(Sel, ObjectType, true/*Instance method*/))
+    return true;
+  return S.LookupMethodInObjectType(Sel, ObjectType, false/*Class method*/) != 0;
+}
+
 const ObjCMethodDecl *
-Sema::SelectorsForTypoCorrection(Selector Sel) {
+Sema::SelectorsForTypoCorrection(Selector Sel,
+                                 QualType ObjectType) {
   unsigned NumArgs = Sel.getNumArgs();
   SmallVector<const ObjCMethodDecl *, 8> Methods;
   
@@ -2305,12 +2315,14 @@ Sema::SelectorsForTypoCorrection(Selecto
     // instance methods
     for (ObjCMethodList *M = &b->second.first; M; M=M->getNext())
       if (M->Method &&
-          (M->Method->getSelector().getNumArgs() == NumArgs))
+          (M->Method->getSelector().getNumArgs() == NumArgs) &&
+          HelperIsMethodInObjCType(*this, M->Method->getSelector(), ObjectType))
         Methods.push_back(M->Method);
     // class methods
     for (ObjCMethodList *M = &b->second.second; M; M=M->getNext())
       if (M->Method &&
-          (M->Method->getSelector().getNumArgs() == NumArgs))
+          (M->Method->getSelector().getNumArgs() == NumArgs) &&
+          HelperIsMethodInObjCType(*this, M->Method->getSelector(), ObjectType))
         Methods.push_back(M->Method);
   }
   

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Mon Jun 17 12:10:54 2013
@@ -1232,8 +1232,22 @@ bool Sema::CheckMessageArgumentTypes(Qua
       DiagID = isClassMessage ? diag::warn_class_method_not_found
                               : diag::warn_inst_method_not_found;
     if (!getLangOpts().DebuggerSupport) {
-      Diag(SelLoc, DiagID)
-        << Sel << isClassMessage << SourceRange(SelectorLocs.front(), 
+      const ObjCMethodDecl *OMD = 0;
+      if (const ObjCObjectPointerType *ObjCPtr =
+          ReceiverType->getAsObjCInterfacePointerType()) {
+        QualType ObjectType = QualType(ObjCPtr->getInterfaceType(), 0);
+        OMD = SelectorsForTypoCorrection(Sel, ObjectType);
+      }
+      if (OMD) {
+        Selector MatchedSel = OMD->getSelector();
+        SourceRange SelectorRange(SelectorLocs.front(), SelectorLocs.back());
+        Diag(SelLoc, diag::warn_method_not_found_with_typo)
+          << isClassMessage << Sel << MatchedSel
+          << FixItHint::CreateReplacement(SelectorRange, MatchedSel.getAsString());
+      }
+      else
+        Diag(SelLoc, DiagID)
+          << Sel << isClassMessage << SourceRange(SelectorLocs.front(), 
                                                 SelectorLocs.back());
       // Find the class to which we are sending this message.
       if (ReceiverType->isObjCObjectPointerType()) {

Modified: cfe/trunk/test/FixIt/selector-fixit.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/FixIt/selector-fixit.m?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/test/FixIt/selector-fixit.m (original)
+++ cfe/trunk/test/FixIt/selector-fixit.m Mon Jun 17 12:10:54 2013
@@ -28,3 +28,13 @@
 }
 
 @end
+
+// rdar://7853549
+ at interface rdar7853549 : NSObject
+- (int) bounds;
+ at end
+
+ at implementation rdar7853549
+- (int) bounds { return 0; }
+- (void)PrivateMeth { int bounds = [self bonds]; }
+ at end

Modified: cfe/trunk/test/SemaObjC/call-super-2.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/call-super-2.m?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/call-super-2.m (original)
+++ cfe/trunk/test/SemaObjC/call-super-2.m Mon Jun 17 12:10:54 2013
@@ -68,7 +68,7 @@ id objc_getClass(const char *s);
 }
 - (int) instance_func1
 {
-   int i = (size_t)[self instance_func0];     // expected-warning {{instance method '-instance_func0' not found (return type defaults to 'id')}}
+   int i = (size_t)[self instance_func0];     // expected-warning {{instance method 'instance_func0' not found (return type defaults to 'id'); did you mean 'instance_func3'?}}
    return i + (size_t)[super instance_func0]; // expected-warning {{'Object' may not respond to 'instance_func0'}}
 }
 - (int) instance_func2

Modified: cfe/trunk/test/SemaObjC/protocol-id-test-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/protocol-id-test-1.m?rev=184086&r1=184085&r2=184086&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/protocol-id-test-1.m (original)
+++ cfe/trunk/test/SemaObjC/protocol-id-test-1.m Mon Jun 17 12:10:54 2013
@@ -12,5 +12,5 @@
 @end
 
 @implementation INTF
-- (void)IMeth {INTF<P> *pi;  [pi Meth]; } // expected-warning {{method '-Meth' not found (return type defaults to 'id')}}
+- (void)IMeth {INTF<P> *pi;  [pi Meth]; } // expected-warning {{instance method 'Meth' not found (return type defaults to 'id'); did you mean 'IMeth'?}}
 @end





More information about the cfe-commits mailing list