diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-06-05 18:46:14 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-06-05 18:46:14 +0000 |
commit | 0c0fc9e14b9c52402ab81aac1caf8c80c72ddb0e (patch) | |
tree | 2d5abdedb6cc21523f8f758976dd69637ae127d2 /clang/lib/Sema/SemaDeclObjC.cpp | |
parent | 205a30d83d0e4d1c60e69b46d045c8dc5d9acfd4 (diff) | |
download | bcm5719-llvm-0c0fc9e14b9c52402ab81aac1caf8c80c72ddb0e.tar.gz bcm5719-llvm-0c0fc9e14b9c52402ab81aac1caf8c80c72ddb0e.zip |
Objective-C: Provide fixit with suggested spelling correction
for -Wundeclared-selector warnings. // rdar://14039037
llvm-svn: 183331
Diffstat (limited to 'clang/lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index f1ce4bce5f6..b2387d3c7e1 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -2272,6 +2272,57 @@ ObjCMethodDecl *Sema::LookupImplementedMethodInGlobalPool(Selector Sel) { } static void +HelperSelectorsForTypoCorrection( + SmallVectorImpl<const ObjCMethodDecl *> &BestMethod, + StringRef Typo, const ObjCMethodDecl * Method) { + const unsigned MaxEditDistance = 1; + unsigned BestEditDistance = MaxEditDistance + 1; + StringRef MethodName = Method->getSelector().getAsString(); + + unsigned MinPossibleEditDistance = abs((int)MethodName.size() - (int)Typo.size()); + if (MinPossibleEditDistance > 0 && + Typo.size() / MinPossibleEditDistance < 1) + return; + unsigned EditDistance = Typo.edit_distance(MethodName, true, MaxEditDistance); + if (EditDistance > MaxEditDistance) + return; + if (EditDistance == BestEditDistance) + BestMethod.push_back(Method); + else if (EditDistance < BestEditDistance) { + BestMethod.clear(); + BestMethod.push_back(Method); + BestEditDistance = EditDistance; + } +} + +const ObjCMethodDecl * +Sema::SelectorsForTypoCorrection(Selector Sel) { + unsigned NumArgs = Sel.getNumArgs(); + SmallVector<const ObjCMethodDecl *, 8> Methods; + + for (GlobalMethodPool::iterator b = MethodPool.begin(), + e = MethodPool.end(); b != e; b++) { + // instance methods + for (ObjCMethodList *M = &b->second.first; M; M=M->getNext()) + if (M->Method && + (M->Method->getSelector().getNumArgs() == NumArgs)) + 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)) + Methods.push_back(M->Method); + } + + SmallVector<const ObjCMethodDecl *, 8> SelectedMethods; + for (unsigned i = 0, e = Methods.size(); i < e; i++) { + HelperSelectorsForTypoCorrection(SelectedMethods, + Sel.getAsString(), Methods[i]); + } + return (SelectedMethods.size() == 1) ? SelectedMethods[0] : NULL; +} + +static void HelperToDiagnoseMismatchedMethodsInGlobalPool(Sema &S, ObjCMethodList &MethList) { ObjCMethodList *M = &MethList; |