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 NSStr_initWithUTF8String 47 }; 48 static const unsigned NumNSStringMethods = 5; 49 50 IdentifierInfo *getNSClassId(NSClassIdKindKind K) const; 51 52 /// \brief The Objective-C NSString selectors. 53 Selector getNSStringSelector(NSStringMethodKind MK) const; 54 55 /// \brief Return NSStringMethodKind if \param Sel is such a selector. 56 Optional<NSStringMethodKind> getNSStringMethodKind(Selector Sel) const; 57 58 /// \brief Returns true if the expression \param E is a reference of 59 /// "NSUTF8StringEncoding" enum constant. isNSUTF8StringEncodingConstant(const Expr * E)60 bool isNSUTF8StringEncodingConstant(const Expr *E) const { 61 return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId); 62 } 63 64 /// \brief Returns true if the expression \param E is a reference of 65 /// "NSASCIIStringEncoding" enum constant. isNSASCIIStringEncodingConstant(const Expr * E)66 bool isNSASCIIStringEncodingConstant(const Expr *E) const { 67 return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId); 68 } 69 70 /// \brief Enumerates the NSArray methods used to generate literals. 71 enum NSArrayMethodKind { 72 NSArr_array, 73 NSArr_arrayWithArray, 74 NSArr_arrayWithObject, 75 NSArr_arrayWithObjects, 76 NSArr_arrayWithObjectsCount, 77 NSArr_initWithArray, 78 NSArr_initWithObjects, 79 NSArr_objectAtIndex, 80 NSMutableArr_replaceObjectAtIndex 81 }; 82 static const unsigned NumNSArrayMethods = 9; 83 84 /// \brief The Objective-C NSArray selectors. 85 Selector getNSArraySelector(NSArrayMethodKind MK) const; 86 87 /// \brief Return NSArrayMethodKind if \p Sel is such a selector. 88 Optional<NSArrayMethodKind> getNSArrayMethodKind(Selector Sel); 89 90 /// \brief Enumerates the NSDictionary methods used to generate literals. 91 enum NSDictionaryMethodKind { 92 NSDict_dictionary, 93 NSDict_dictionaryWithDictionary, 94 NSDict_dictionaryWithObjectForKey, 95 NSDict_dictionaryWithObjectsForKeys, 96 NSDict_dictionaryWithObjectsForKeysCount, 97 NSDict_dictionaryWithObjectsAndKeys, 98 NSDict_initWithDictionary, 99 NSDict_initWithObjectsAndKeys, 100 NSDict_initWithObjectsForKeys, 101 NSDict_objectForKey, 102 NSMutableDict_setObjectForKey 103 }; 104 static const unsigned NumNSDictionaryMethods = 12; 105 106 /// \brief The Objective-C NSDictionary selectors. 107 Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const; 108 109 /// \brief Return NSDictionaryMethodKind if \p Sel is such a selector. 110 Optional<NSDictionaryMethodKind> getNSDictionaryMethodKind(Selector Sel); 111 112 /// \brief Returns selector for "objectForKeyedSubscript:". getObjectForKeyedSubscriptSelector()113 Selector getObjectForKeyedSubscriptSelector() const { 114 return getOrInitSelector(StringRef("objectForKeyedSubscript"), 115 objectForKeyedSubscriptSel); 116 } 117 118 /// \brief Returns selector for "objectAtIndexedSubscript:". getObjectAtIndexedSubscriptSelector()119 Selector getObjectAtIndexedSubscriptSelector() const { 120 return getOrInitSelector(StringRef("objectAtIndexedSubscript"), 121 objectAtIndexedSubscriptSel); 122 } 123 124 /// \brief Returns selector for "setObject:forKeyedSubscript". getSetObjectForKeyedSubscriptSelector()125 Selector getSetObjectForKeyedSubscriptSelector() const { 126 StringRef Ids[] = { "setObject", "forKeyedSubscript" }; 127 return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel); 128 } 129 130 /// \brief Returns selector for "setObject:atIndexedSubscript". getSetObjectAtIndexedSubscriptSelector()131 Selector getSetObjectAtIndexedSubscriptSelector() const { 132 StringRef Ids[] = { "setObject", "atIndexedSubscript" }; 133 return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel); 134 } 135 136 /// \brief Returns selector for "isEqual:". getIsEqualSelector()137 Selector getIsEqualSelector() const { 138 return getOrInitSelector(StringRef("isEqual"), isEqualSel); 139 } 140 141 /// \brief Enumerates the NSNumber methods used to generate literals. 142 enum NSNumberLiteralMethodKind { 143 NSNumberWithChar, 144 NSNumberWithUnsignedChar, 145 NSNumberWithShort, 146 NSNumberWithUnsignedShort, 147 NSNumberWithInt, 148 NSNumberWithUnsignedInt, 149 NSNumberWithLong, 150 NSNumberWithUnsignedLong, 151 NSNumberWithLongLong, 152 NSNumberWithUnsignedLongLong, 153 NSNumberWithFloat, 154 NSNumberWithDouble, 155 NSNumberWithBool, 156 NSNumberWithInteger, 157 NSNumberWithUnsignedInteger 158 }; 159 static const unsigned NumNSNumberLiteralMethods = 15; 160 161 /// \brief The Objective-C NSNumber selectors used to create NSNumber literals. 162 /// \param Instance if true it will return the selector for the init* method 163 /// otherwise it will return the selector for the number* method. 164 Selector getNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, 165 bool Instance) const; 166 isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,Selector Sel)167 bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, 168 Selector Sel) const { 169 return Sel == getNSNumberLiteralSelector(MK, false) || 170 Sel == getNSNumberLiteralSelector(MK, true); 171 } 172 173 /// \brief Return NSNumberLiteralMethodKind if \p Sel is such a selector. 174 Optional<NSNumberLiteralMethodKind> 175 getNSNumberLiteralMethodKind(Selector Sel) const; 176 177 /// \brief Determine the appropriate NSNumber factory method kind for a 178 /// literal of the given type. 179 Optional<NSNumberLiteralMethodKind> 180 getNSNumberFactoryMethodKind(QualType T) const; 181 182 /// \brief Returns true if \param T is a typedef of "BOOL" in objective-c. 183 bool isObjCBOOLType(QualType T) const; 184 /// \brief Returns true if \param T is a typedef of "NSInteger" in objective-c. 185 bool isObjCNSIntegerType(QualType T) const; 186 /// \brief Returns true if \param T is a typedef of "NSUInteger" in objective-c. 187 bool isObjCNSUIntegerType(QualType T) const; 188 /// \brief Returns one of NSIntegral typedef names if \param T is a typedef 189 /// of that name in objective-c. 190 StringRef GetNSIntegralKind(QualType T) const; 191 192 private: 193 bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const; 194 bool isObjCEnumerator(const Expr *E, 195 StringRef name, IdentifierInfo *&II) const; 196 Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const; 197 198 ASTContext &Ctx; 199 200 mutable IdentifierInfo *ClassIds[NumClassIds]; 201 202 mutable Selector NSStringSelectors[NumNSStringMethods]; 203 204 /// \brief The selectors for Objective-C NSArray methods. 205 mutable Selector NSArraySelectors[NumNSArrayMethods]; 206 207 /// \brief The selectors for Objective-C NSDictionary methods. 208 mutable Selector NSDictionarySelectors[NumNSDictionaryMethods]; 209 210 /// \brief The Objective-C NSNumber selectors used to create NSNumber literals. 211 mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods]; 212 mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods]; 213 214 mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel, 215 setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel, 216 isEqualSel; 217 218 mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId; 219 mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId; 220 }; 221 222 } // end namespace clang 223 224 #endif // LLVM_CLANG_AST_NSAPI_H 225