]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/include/clang/AST/NSAPI.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / include / clang / AST / NSAPI.h
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   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   bool isNSUTF8StringEncodingConstant(const Expr *E) const {
64     return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId);
65   }
66
67   /// Returns true if the expression \param E is a reference of
68   /// "NSASCIIStringEncoding" enum constant.
69   bool isNSASCIIStringEncodingConstant(const Expr *E) const {
70     return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId);
71   }
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   Selector getObjectForKeyedSubscriptSelector() const {
141     return getOrInitSelector(StringRef("objectForKeyedSubscript"),
142                              objectForKeyedSubscriptSel);
143   }
144
145   /// Returns selector for "objectAtIndexedSubscript:".
146   Selector getObjectAtIndexedSubscriptSelector() const {
147     return getOrInitSelector(StringRef("objectAtIndexedSubscript"),
148                              objectAtIndexedSubscriptSel);
149   }
150
151   /// Returns selector for "setObject:forKeyedSubscript".
152   Selector getSetObjectForKeyedSubscriptSelector() const {
153     StringRef Ids[] = { "setObject", "forKeyedSubscript" };
154     return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel);
155   }
156
157   /// Returns selector for "setObject:atIndexedSubscript".
158   Selector getSetObjectAtIndexedSubscriptSelector() const {
159     StringRef Ids[] = { "setObject", "atIndexedSubscript" };
160     return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel);
161   }
162
163   /// Returns selector for "isEqual:".
164   Selector getIsEqualSelector() const {
165     return getOrInitSelector(StringRef("isEqual"), isEqualSel);
166   }
167
168   Selector getNewSelector() const {
169     return getOrInitNullarySelector("new", NewSel);
170   }
171
172   Selector getInitSelector() const {
173     return getOrInitNullarySelector("init", InitSel);
174   }
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                                  Selector Sel) const {
204     return Sel == getNSNumberLiteralSelector(MK, false) ||
205            Sel == getNSNumberLiteralSelector(MK, true);
206   }
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