1 //===--- NSAPI.h - NSFoundation APIs ----------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_AST_NSAPI_H 11 #define LLVM_CLANG_AST_NSAPI_H 12 13 #include "clang/Basic/IdentifierTable.h" 14 #include "llvm/ADT/ArrayRef.h" 15 #include "llvm/ADT/Optional.h" 16 17 namespace clang { 18 class ASTContext; 19 class QualType; 20 class Expr; 21 22 // \brief Provides info and caches identifiers/selectors for NSFoundation API. 23 class NSAPI { 24 public: 25 explicit NSAPI(ASTContext &Ctx); 26 getASTContext()27 ASTContext &getASTContext() const { return Ctx; } 28 29 enum NSClassIdKindKind { 30 ClassId_NSObject, 31 ClassId_NSString, 32 ClassId_NSArray, 33 ClassId_NSMutableArray, 34 ClassId_NSDictionary, 35 ClassId_NSMutableDictionary, 36 ClassId_NSNumber 37 }; 38 static const unsigned NumClassIds = 7; 39 40 enum NSStringMethodKind { 41 NSStr_stringWithString, 42 NSStr_stringWithUTF8String, 43 NSStr_stringWithCStringEncoding, 44 NSStr_stringWithCString, 45 NSStr_initWithString 46 }; 47 static const unsigned NumNSStringMethods = 5; 48 49 IdentifierInfo *getNSClassId(NSClassIdKindKind K) const; 50 51 /// \brief The Objective-C NSString selectors. 52 Selector getNSStringSelector(NSStringMethodKind MK) const; 53 54 /// \brief Return NSStringMethodKind if \param Sel is such a selector. 55 llvm::Optional<NSStringMethodKind> getNSStringMethodKind(Selector Sel) const; 56 57 /// \brief Returns true if the expression \param E is a reference of 58 /// "NSUTF8StringEncoding" enum constant. isNSUTF8StringEncodingConstant(const Expr * E)59 bool isNSUTF8StringEncodingConstant(const Expr *E) const { 60 return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId); 61 } 62 63 /// \brief Returns true if the expression \param E is a reference of 64 /// "NSASCIIStringEncoding" enum constant. isNSASCIIStringEncodingConstant(const Expr * E)65 bool isNSASCIIStringEncodingConstant(const Expr *E) const { 66 return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId); 67 } 68 69 /// \brief Enumerates the NSArray methods used to generate literals. 70 enum NSArrayMethodKind { 71 NSArr_array, 72 NSArr_arrayWithArray, 73 NSArr_arrayWithObject, 74 NSArr_arrayWithObjects, 75 NSArr_arrayWithObjectsCount, 76 NSArr_initWithArray, 77 NSArr_initWithObjects, 78 NSArr_objectAtIndex, 79 NSMutableArr_replaceObjectAtIndex 80 }; 81 static const unsigned NumNSArrayMethods = 9; 82 83 /// \brief The Objective-C NSArray selectors. 84 Selector getNSArraySelector(NSArrayMethodKind MK) const; 85 86 /// \brief Return NSArrayMethodKind if \arg Sel is such a selector. 87 llvm::Optional<NSArrayMethodKind> getNSArrayMethodKind(Selector Sel); 88 89 /// \brief Enumerates the NSDictionary methods used to generate literals. 90 enum NSDictionaryMethodKind { 91 NSDict_dictionary, 92 NSDict_dictionaryWithDictionary, 93 NSDict_dictionaryWithObjectForKey, 94 NSDict_dictionaryWithObjectsForKeys, 95 NSDict_dictionaryWithObjectsForKeysCount, 96 NSDict_dictionaryWithObjectsAndKeys, 97 NSDict_initWithDictionary, 98 NSDict_initWithObjectsAndKeys, 99 NSDict_objectForKey, 100 NSMutableDict_setObjectForKey 101 }; 102 static const unsigned NumNSDictionaryMethods = 10; 103 104 /// \brief The Objective-C NSDictionary selectors. 105 Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const; 106 107 /// \brief Return NSDictionaryMethodKind if \arg Sel is such a selector. 108 llvm::Optional<NSDictionaryMethodKind> 109 getNSDictionaryMethodKind(Selector Sel); 110 111 /// \brief Returns selector for "objectForKeyedSubscript:". getObjectForKeyedSubscriptSelector()112 Selector getObjectForKeyedSubscriptSelector() const { 113 return getOrInitSelector(StringRef("objectForKeyedSubscript"), 114 objectForKeyedSubscriptSel); 115 } 116 117 /// \brief Returns selector for "objectAtIndexedSubscript:". getObjectAtIndexedSubscriptSelector()118 Selector getObjectAtIndexedSubscriptSelector() const { 119 return getOrInitSelector(StringRef("objectAtIndexedSubscript"), 120 objectAtIndexedSubscriptSel); 121 } 122 123 /// \brief Returns selector for "setObject:forKeyedSubscript". getSetObjectForKeyedSubscriptSelector()124 Selector getSetObjectForKeyedSubscriptSelector() const { 125 StringRef Ids[] = { "setObject", "forKeyedSubscript" }; 126 return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel); 127 } 128 129 /// \brief Returns selector for "setObject:atIndexedSubscript". getSetObjectAtIndexedSubscriptSelector()130 Selector getSetObjectAtIndexedSubscriptSelector() const { 131 StringRef Ids[] = { "setObject", "atIndexedSubscript" }; 132 return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel); 133 } 134 135 /// \brief Returns selector for "isEqual:". getIsEqualSelector()136 Selector getIsEqualSelector() const { 137 return getOrInitSelector(StringRef("isEqual"), isEqualSel); 138 } 139 140 /// \brief Enumerates the NSNumber methods used to generate literals. 141 enum NSNumberLiteralMethodKind { 142 NSNumberWithChar, 143 NSNumberWithUnsignedChar, 144 NSNumberWithShort, 145 NSNumberWithUnsignedShort, 146 NSNumberWithInt, 147 NSNumberWithUnsignedInt, 148 NSNumberWithLong, 149 NSNumberWithUnsignedLong, 150 NSNumberWithLongLong, 151 NSNumberWithUnsignedLongLong, 152 NSNumberWithFloat, 153 NSNumberWithDouble, 154 NSNumberWithBool, 155 NSNumberWithInteger, 156 NSNumberWithUnsignedInteger 157 }; 158 static const unsigned NumNSNumberLiteralMethods = 15; 159 160 /// \brief The Objective-C NSNumber selectors used to create NSNumber literals. 161 /// \param Instance if true it will return the selector for the init* method 162 /// otherwise it will return the selector for the number* method. 163 Selector getNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, 164 bool Instance) const; 165 isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,Selector Sel)166 bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, 167 Selector Sel) const { 168 return Sel == getNSNumberLiteralSelector(MK, false) || 169 Sel == getNSNumberLiteralSelector(MK, true); 170 } 171 172 /// \brief Return NSNumberLiteralMethodKind if \arg Sel is such a selector. 173 llvm::Optional<NSNumberLiteralMethodKind> 174 getNSNumberLiteralMethodKind(Selector Sel) const; 175 176 /// \brief Determine the appropriate NSNumber factory method kind for a 177 /// literal of the given type. 178 llvm::Optional<NSNumberLiteralMethodKind> 179 getNSNumberFactoryMethodKind(QualType T) const; 180 181 /// \brief Returns true if \param T is a typedef of "BOOL" in objective-c. 182 bool isObjCBOOLType(QualType T) const; 183 /// \brief Returns true if \param T is a typedef of "NSInteger" in objective-c. 184 bool isObjCNSIntegerType(QualType T) const; 185 /// \brief Returns true if \param T is a typedef of "NSUInteger" in objective-c. 186 bool isObjCNSUIntegerType(QualType T) const; 187 188 private: 189 bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const; 190 bool isObjCEnumerator(const Expr *E, 191 StringRef name, IdentifierInfo *&II) const; 192 Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const; 193 194 ASTContext &Ctx; 195 196 mutable IdentifierInfo *ClassIds[NumClassIds]; 197 198 mutable Selector NSStringSelectors[NumNSStringMethods]; 199 200 /// \brief The selectors for Objective-C NSArray methods. 201 mutable Selector NSArraySelectors[NumNSArrayMethods]; 202 203 /// \brief The selectors for Objective-C NSDictionary methods. 204 mutable Selector NSDictionarySelectors[NumNSDictionaryMethods]; 205 206 /// \brief The Objective-C NSNumber selectors used to create NSNumber literals. 207 mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods]; 208 mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods]; 209 210 mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel, 211 setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel, 212 isEqualSel; 213 214 mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId; 215 mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId; 216 }; 217 218 } // end namespace clang 219 220 #endif // LLVM_CLANG_AST_NSAPI_H 221