From 4f3a64fd6e9dff09da70c4185243905dbfe9910c Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 23 Jul 2013 19:31:17 +0000 Subject: [PATCH] ObjC migrator: Define family of methods which are candidate for migrating to 'instancetype'. wip. llvm-svn: 186981 --- clang/include/clang/Basic/IdentifierTable.h | 16 ++++++++++++++ clang/lib/Basic/IdentifierTable.cpp | 33 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/clang/include/clang/Basic/IdentifierTable.h b/clang/include/clang/Basic/IdentifierTable.h index a195fc3..86f9d9b 100644 --- a/clang/include/clang/Basic/IdentifierTable.h +++ b/clang/include/clang/Basic/IdentifierTable.h @@ -578,6 +578,20 @@ enum { ObjCMethodFamilyBitWidth = 4 }; /// \brief An invalid value of ObjCMethodFamily. enum { InvalidObjCMethodFamily = (1 << ObjCMethodFamilyBitWidth) - 1 }; +/// \brief A family of Objective-C methods. +/// +/// These are family of methods whose result type is initially 'id', but +/// but are candidate for the result type to be changed to 'instancetype'. +enum ObjCInstanceTypeFamily { + OIT_None, + OIT_Array, + OIT_Dictionary, + OIT_MemManage, + OIT_NSString, + OIT_NSSet, + OIT_NSURL +}; + /// \brief Smart pointer class that efficiently represents Objective-C method /// names. /// @@ -623,6 +637,8 @@ class Selector { } static ObjCMethodFamily getMethodFamilyImpl(Selector sel); + + static ObjCInstanceTypeFamily getInstTypeMethodFamilyImpl(Selector sel); public: friend class SelectorTable; // only the SelectorTable can create these diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index b8ba4ba..faff4d8 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -452,6 +452,39 @@ ObjCMethodFamily Selector::getMethodFamilyImpl(Selector sel) { return OMF_None; } +ObjCInstanceTypeFamily Selector::getInstTypeMethodFamilyImpl(Selector sel) { + IdentifierInfo *first = sel.getIdentifierInfoForSlot(0); + if (!first) return OIT_None; + + StringRef name = first->getName(); + + if (name.empty()) return OIT_None; + switch (name.front()) { + case 'a': + if (startsWithWord(name, "alloc")) return OIT_MemManage; + else + if (startsWithWord(name, "array")) return OIT_Array; + break; + case 'd': + if (startsWithWord(name, "dictionary")) return OIT_Dictionary; + break; + case 'i': + if (startsWithWord(name, "init")) return OIT_MemManage; + break; + case 's': + if (startsWithWord(name, "string")) return OIT_NSString; + else + if (startsWithWord(name, "set")) return OIT_NSSet; + break; + case 'U': + if (startsWithWord(name, "URL")) return OIT_NSURL; + break; + default: + break; + } + return OIT_None; +} + namespace { struct SelectorTableImpl { llvm::FoldingSet Table; -- 2.7.4