NSAPI.h revision a44b97004298a4eb7c270009ea4cb12aad49c543
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 17namespace clang { 18 class ASTContext; 19 class QualType; 20 class Expr; 21 22// \brief Provides info and caches identifiers/selectors for NSFoundation API. 23class NSAPI { 24public: 25 explicit NSAPI(ASTContext &Ctx); 26 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. 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. 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 \p 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_initWithObjectsForKeys, 100 NSDict_objectForKey, 101 NSMutableDict_setObjectForKey 102 }; 103 static const unsigned NumNSDictionaryMethods = 11; 104 105 /// \brief The Objective-C NSDictionary selectors. 106 Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const; 107 108 /// \brief Return NSDictionaryMethodKind if \p Sel is such a selector. 109 llvm::Optional<NSDictionaryMethodKind> 110 getNSDictionaryMethodKind(Selector Sel); 111 112 /// \brief Returns selector for "objectForKeyedSubscript:". 113 Selector getObjectForKeyedSubscriptSelector() const { 114 return getOrInitSelector(StringRef("objectForKeyedSubscript"), 115 objectForKeyedSubscriptSel); 116 } 117 118 /// \brief Returns selector for "objectAtIndexedSubscript:". 119 Selector getObjectAtIndexedSubscriptSelector() const { 120 return getOrInitSelector(StringRef("objectAtIndexedSubscript"), 121 objectAtIndexedSubscriptSel); 122 } 123 124 /// \brief Returns selector for "setObject:forKeyedSubscript". 125 Selector getSetObjectForKeyedSubscriptSelector() const { 126 StringRef Ids[] = { "setObject", "forKeyedSubscript" }; 127 return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel); 128 } 129 130 /// \brief Returns selector for "setObject:atIndexedSubscript". 131 Selector getSetObjectAtIndexedSubscriptSelector() const { 132 StringRef Ids[] = { "setObject", "atIndexedSubscript" }; 133 return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel); 134 } 135 136 /// \brief Returns selector for "isEqual:". 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 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 llvm::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 llvm::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 189private: 190 bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const; 191 bool isObjCEnumerator(const Expr *E, 192 StringRef name, IdentifierInfo *&II) const; 193 Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const; 194 195 ASTContext &Ctx; 196 197 mutable IdentifierInfo *ClassIds[NumClassIds]; 198 199 mutable Selector NSStringSelectors[NumNSStringMethods]; 200 201 /// \brief The selectors for Objective-C NSArray methods. 202 mutable Selector NSArraySelectors[NumNSArrayMethods]; 203 204 /// \brief The selectors for Objective-C NSDictionary methods. 205 mutable Selector NSDictionarySelectors[NumNSDictionaryMethods]; 206 207 /// \brief The Objective-C NSNumber selectors used to create NSNumber literals. 208 mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods]; 209 mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods]; 210 211 mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel, 212 setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel, 213 isEqualSel; 214 215 mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId; 216 mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId; 217}; 218 219} // end namespace clang 220 221#endif // LLVM_CLANG_AST_NSAPI_H 222