/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/include/clang/AST/NSAPI.h
Line | Count | Source |
1 | | //===--- NSAPI.h - NSFoundation APIs ----------------------------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #ifndef LLVM_CLANG_AST_NSAPI_H |
10 | | #define LLVM_CLANG_AST_NSAPI_H |
11 | | |
12 | | #include "clang/Basic/IdentifierTable.h" |
13 | | #include "llvm/ADT/ArrayRef.h" |
14 | | #include "llvm/ADT/Optional.h" |
15 | | |
16 | | namespace clang { |
17 | | class ASTContext; |
18 | | class ObjCInterfaceDecl; |
19 | | class QualType; |
20 | | class Expr; |
21 | | |
22 | | // Provides info and caches identifiers/selectors for NSFoundation API. |
23 | | class NSAPI { |
24 | | public: |
25 | | explicit NSAPI(ASTContext &Ctx); |
26 | | |
27 | 10.2k | 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 | | ClassId_NSMutableSet, |
38 | | ClassId_NSMutableOrderedSet, |
39 | | ClassId_NSValue |
40 | | }; |
41 | | static const unsigned NumClassIds = 10; |
42 | | |
43 | | enum NSStringMethodKind { |
44 | | NSStr_stringWithString, |
45 | | NSStr_stringWithUTF8String, |
46 | | NSStr_stringWithCStringEncoding, |
47 | | NSStr_stringWithCString, |
48 | | NSStr_initWithString, |
49 | | NSStr_initWithUTF8String |
50 | | }; |
51 | | static const unsigned NumNSStringMethods = 6; |
52 | | |
53 | | IdentifierInfo *getNSClassId(NSClassIdKindKind K) const; |
54 | | |
55 | | /// The Objective-C NSString selectors. |
56 | | Selector getNSStringSelector(NSStringMethodKind MK) const; |
57 | | |
58 | | /// Return NSStringMethodKind if \param Sel is such a selector. |
59 | | Optional<NSStringMethodKind> getNSStringMethodKind(Selector Sel) const; |
60 | | |
61 | | /// Returns true if the expression \param E is a reference of |
62 | | /// "NSUTF8StringEncoding" enum constant. |
63 | 4 | bool isNSUTF8StringEncodingConstant(const Expr *E) const { |
64 | 4 | return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId); |
65 | 4 | } |
66 | | |
67 | | /// Returns true if the expression \param E is a reference of |
68 | | /// "NSASCIIStringEncoding" enum constant. |
69 | 3 | bool isNSASCIIStringEncodingConstant(const Expr *E) const { |
70 | 3 | return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId); |
71 | 3 | } |
72 | | |
73 | | /// Enumerates the NSArray/NSMutableArray methods used to generate |
74 | | /// literals and to apply some checks. |
75 | | enum NSArrayMethodKind { |
76 | | NSArr_array, |
77 | | NSArr_arrayWithArray, |
78 | | NSArr_arrayWithObject, |
79 | | NSArr_arrayWithObjects, |
80 | | NSArr_arrayWithObjectsCount, |
81 | | NSArr_initWithArray, |
82 | | NSArr_initWithObjects, |
83 | | NSArr_objectAtIndex, |
84 | | NSMutableArr_replaceObjectAtIndex, |
85 | | NSMutableArr_addObject, |
86 | | NSMutableArr_insertObjectAtIndex, |
87 | | NSMutableArr_setObjectAtIndexedSubscript |
88 | | }; |
89 | | static const unsigned NumNSArrayMethods = 12; |
90 | | |
91 | | /// The Objective-C NSArray selectors. |
92 | | Selector getNSArraySelector(NSArrayMethodKind MK) const; |
93 | | |
94 | | /// Return NSArrayMethodKind if \p Sel is such a selector. |
95 | | Optional<NSArrayMethodKind> getNSArrayMethodKind(Selector Sel); |
96 | | |
97 | | /// Enumerates the NSDictionary/NSMutableDictionary methods used |
98 | | /// to generate literals and to apply some checks. |
99 | | enum NSDictionaryMethodKind { |
100 | | NSDict_dictionary, |
101 | | NSDict_dictionaryWithDictionary, |
102 | | NSDict_dictionaryWithObjectForKey, |
103 | | NSDict_dictionaryWithObjectsForKeys, |
104 | | NSDict_dictionaryWithObjectsForKeysCount, |
105 | | NSDict_dictionaryWithObjectsAndKeys, |
106 | | NSDict_initWithDictionary, |
107 | | NSDict_initWithObjectsAndKeys, |
108 | | NSDict_initWithObjectsForKeys, |
109 | | NSDict_objectForKey, |
110 | | NSMutableDict_setObjectForKey, |
111 | | NSMutableDict_setObjectForKeyedSubscript, |
112 | | NSMutableDict_setValueForKey |
113 | | }; |
114 | | static const unsigned NumNSDictionaryMethods = 13; |
115 | | |
116 | | /// The Objective-C NSDictionary selectors. |
117 | | Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const; |
118 | | |
119 | | /// Return NSDictionaryMethodKind if \p Sel is such a selector. |
120 | | Optional<NSDictionaryMethodKind> getNSDictionaryMethodKind(Selector Sel); |
121 | | |
122 | | /// Enumerates the NSMutableSet/NSOrderedSet methods used |
123 | | /// to apply some checks. |
124 | | enum NSSetMethodKind { |
125 | | NSMutableSet_addObject, |
126 | | NSOrderedSet_insertObjectAtIndex, |
127 | | NSOrderedSet_setObjectAtIndex, |
128 | | NSOrderedSet_setObjectAtIndexedSubscript, |
129 | | NSOrderedSet_replaceObjectAtIndexWithObject |
130 | | }; |
131 | | static const unsigned NumNSSetMethods = 5; |
132 | | |
133 | | /// The Objective-C NSSet selectors. |
134 | | Selector getNSSetSelector(NSSetMethodKind MK) const; |
135 | | |
136 | | /// Return NSSetMethodKind if \p Sel is such a selector. |
137 | | Optional<NSSetMethodKind> getNSSetMethodKind(Selector Sel); |
138 | | |
139 | | /// Returns selector for "objectForKeyedSubscript:". |
140 | 14 | Selector getObjectForKeyedSubscriptSelector() const { |
141 | 14 | return getOrInitSelector(StringRef("objectForKeyedSubscript"), |
142 | 14 | objectForKeyedSubscriptSel); |
143 | 14 | } |
144 | | |
145 | | /// Returns selector for "objectAtIndexedSubscript:". |
146 | 11 | Selector getObjectAtIndexedSubscriptSelector() const { |
147 | 11 | return getOrInitSelector(StringRef("objectAtIndexedSubscript"), |
148 | 11 | objectAtIndexedSubscriptSel); |
149 | 11 | } |
150 | | |
151 | | /// Returns selector for "setObject:forKeyedSubscript". |
152 | 9 | Selector getSetObjectForKeyedSubscriptSelector() const { |
153 | 9 | StringRef Ids[] = { "setObject", "forKeyedSubscript" }; |
154 | 9 | return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel); |
155 | 9 | } |
156 | | |
157 | | /// Returns selector for "setObject:atIndexedSubscript". |
158 | 6 | Selector getSetObjectAtIndexedSubscriptSelector() const { |
159 | 6 | StringRef Ids[] = { "setObject", "atIndexedSubscript" }; |
160 | 6 | return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel); |
161 | 6 | } |
162 | | |
163 | | /// Returns selector for "isEqual:". |
164 | 109 | Selector getIsEqualSelector() const { |
165 | 109 | return getOrInitSelector(StringRef("isEqual"), isEqualSel); |
166 | 109 | } |
167 | | |
168 | 1.33k | Selector getNewSelector() const { |
169 | 1.33k | return getOrInitNullarySelector("new", NewSel); |
170 | 1.33k | } |
171 | | |
172 | 3.29k | Selector getInitSelector() const { |
173 | 3.29k | return getOrInitNullarySelector("init", InitSel); |
174 | 3.29k | } |
175 | | |
176 | | /// Enumerates the NSNumber methods used to generate literals. |
177 | | enum NSNumberLiteralMethodKind { |
178 | | NSNumberWithChar, |
179 | | NSNumberWithUnsignedChar, |
180 | | NSNumberWithShort, |
181 | | NSNumberWithUnsignedShort, |
182 | | NSNumberWithInt, |
183 | | NSNumberWithUnsignedInt, |
184 | | NSNumberWithLong, |
185 | | NSNumberWithUnsignedLong, |
186 | | NSNumberWithLongLong, |
187 | | NSNumberWithUnsignedLongLong, |
188 | | NSNumberWithFloat, |
189 | | NSNumberWithDouble, |
190 | | NSNumberWithBool, |
191 | | NSNumberWithInteger, |
192 | | NSNumberWithUnsignedInteger |
193 | | }; |
194 | | static const unsigned NumNSNumberLiteralMethods = 15; |
195 | | |
196 | | /// The Objective-C NSNumber selectors used to create NSNumber literals. |
197 | | /// \param Instance if true it will return the selector for the init* method |
198 | | /// otherwise it will return the selector for the number* method. |
199 | | Selector getNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, |
200 | | bool Instance) const; |
201 | | |
202 | | bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, |
203 | 4.53k | Selector Sel) const { |
204 | 4.53k | return Sel == getNSNumberLiteralSelector(MK, false) || |
205 | 4.53k | Sel == getNSNumberLiteralSelector(MK, true)3.94k ; |
206 | 4.53k | } |
207 | | |
208 | | /// Return NSNumberLiteralMethodKind if \p Sel is such a selector. |
209 | | Optional<NSNumberLiteralMethodKind> |
210 | | getNSNumberLiteralMethodKind(Selector Sel) const; |
211 | | |
212 | | /// Determine the appropriate NSNumber factory method kind for a |
213 | | /// literal of the given type. |
214 | | Optional<NSNumberLiteralMethodKind> |
215 | | getNSNumberFactoryMethodKind(QualType T) const; |
216 | | |
217 | | /// Returns true if \param T is a typedef of "BOOL" in objective-c. |
218 | | bool isObjCBOOLType(QualType T) const; |
219 | | /// Returns true if \param T is a typedef of "NSInteger" in objective-c. |
220 | | bool isObjCNSIntegerType(QualType T) const; |
221 | | /// Returns true if \param T is a typedef of "NSUInteger" in objective-c. |
222 | | bool isObjCNSUIntegerType(QualType T) const; |
223 | | /// Returns one of NSIntegral typedef names if \param T is a typedef |
224 | | /// of that name in objective-c. |
225 | | StringRef GetNSIntegralKind(QualType T) const; |
226 | | |
227 | | /// Returns \c true if \p Id is currently defined as a macro. |
228 | | bool isMacroDefined(StringRef Id) const; |
229 | | |
230 | | /// Returns \c true if \p InterfaceDecl is subclass of \p NSClassKind |
231 | | bool isSubclassOfNSClass(ObjCInterfaceDecl *InterfaceDecl, |
232 | | NSClassIdKindKind NSClassKind) const; |
233 | | |
234 | | private: |
235 | | bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const; |
236 | | bool isObjCEnumerator(const Expr *E, |
237 | | StringRef name, IdentifierInfo *&II) const; |
238 | | Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const; |
239 | | Selector getOrInitNullarySelector(StringRef Id, Selector &Sel) const; |
240 | | |
241 | | ASTContext &Ctx; |
242 | | |
243 | | mutable IdentifierInfo *ClassIds[NumClassIds]; |
244 | | |
245 | | mutable Selector NSStringSelectors[NumNSStringMethods]; |
246 | | |
247 | | /// The selectors for Objective-C NSArray methods. |
248 | | mutable Selector NSArraySelectors[NumNSArrayMethods]; |
249 | | |
250 | | /// The selectors for Objective-C NSDictionary methods. |
251 | | mutable Selector NSDictionarySelectors[NumNSDictionaryMethods]; |
252 | | |
253 | | /// The selectors for Objective-C NSSet methods. |
254 | | mutable Selector NSSetSelectors[NumNSSetMethods]; |
255 | | |
256 | | /// The Objective-C NSNumber selectors used to create NSNumber literals. |
257 | | mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods]; |
258 | | mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods]; |
259 | | |
260 | | mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel, |
261 | | setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel, |
262 | | isEqualSel, InitSel, NewSel; |
263 | | |
264 | | mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId; |
265 | | mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId; |
266 | | }; |
267 | | |
268 | | } // end namespace clang |
269 | | |
270 | | #endif // LLVM_CLANG_AST_NSAPI_H |