]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/clang/AST/NSAPI.h
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / include / clang / AST / NSAPI.h
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
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_NSCountedSet,
39     ClassId_NSMutableOrderedSet,
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 = 5;
52
53   IdentifierInfo *getNSClassId(NSClassIdKindKind K) const;
54
55   /// \brief The Objective-C NSString selectors.
56   Selector getNSStringSelector(NSStringMethodKind MK) const;
57
58   /// \brief Return NSStringMethodKind if \param Sel is such a selector.
59   Optional<NSStringMethodKind> getNSStringMethodKind(Selector Sel) const;
60
61   /// \brief 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   /// \brief 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   /// \brief 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   /// \brief The Objective-C NSArray selectors.
92   Selector getNSArraySelector(NSArrayMethodKind MK) const;
93
94   /// \brief Return NSArrayMethodKind if \p Sel is such a selector.
95   Optional<NSArrayMethodKind> getNSArrayMethodKind(Selector Sel);
96
97   /// \brief 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 = 14;
115   
116   /// \brief The Objective-C NSDictionary selectors.
117   Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const;
118
119   /// \brief Return NSDictionaryMethodKind if \p Sel is such a selector.
120   Optional<NSDictionaryMethodKind> getNSDictionaryMethodKind(Selector Sel);
121
122   /// \brief 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   /// \brief The Objective-C NSSet selectors.
134   Selector getNSSetSelector(NSSetMethodKind MK) const;
135
136   /// \brief Return NSSetMethodKind if \p Sel is such a selector.
137   Optional<NSSetMethodKind> getNSSetMethodKind(Selector Sel);
138
139   /// \brief Returns selector for "objectForKeyedSubscript:".
140   Selector getObjectForKeyedSubscriptSelector() const {
141     return getOrInitSelector(StringRef("objectForKeyedSubscript"),
142                              objectForKeyedSubscriptSel);
143   }
144
145   /// \brief Returns selector for "objectAtIndexedSubscript:".
146   Selector getObjectAtIndexedSubscriptSelector() const {
147     return getOrInitSelector(StringRef("objectAtIndexedSubscript"),
148                              objectAtIndexedSubscriptSel);
149   }
150
151   /// \brief Returns selector for "setObject:forKeyedSubscript".
152   Selector getSetObjectForKeyedSubscriptSelector() const {
153     StringRef Ids[] = { "setObject", "forKeyedSubscript" };
154     return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel);
155   }
156
157   /// \brief Returns selector for "setObject:atIndexedSubscript".
158   Selector getSetObjectAtIndexedSubscriptSelector() const {
159     StringRef Ids[] = { "setObject", "atIndexedSubscript" };
160     return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel);
161   }
162
163   /// \brief Returns selector for "isEqual:".
164   Selector getIsEqualSelector() const {
165     return getOrInitSelector(StringRef("isEqual"), isEqualSel);
166   }
167
168   /// \brief Enumerates the NSNumber methods used to generate literals.
169   enum NSNumberLiteralMethodKind {
170     NSNumberWithChar,
171     NSNumberWithUnsignedChar,
172     NSNumberWithShort,
173     NSNumberWithUnsignedShort,
174     NSNumberWithInt,
175     NSNumberWithUnsignedInt,
176     NSNumberWithLong,
177     NSNumberWithUnsignedLong,
178     NSNumberWithLongLong,
179     NSNumberWithUnsignedLongLong,
180     NSNumberWithFloat,
181     NSNumberWithDouble,
182     NSNumberWithBool,
183     NSNumberWithInteger,
184     NSNumberWithUnsignedInteger
185   };
186   static const unsigned NumNSNumberLiteralMethods = 15;
187
188   /// \brief The Objective-C NSNumber selectors used to create NSNumber literals.
189   /// \param Instance if true it will return the selector for the init* method
190   /// otherwise it will return the selector for the number* method.
191   Selector getNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,
192                                       bool Instance) const;
193
194   bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,
195                                  Selector Sel) const {
196     return Sel == getNSNumberLiteralSelector(MK, false) ||
197            Sel == getNSNumberLiteralSelector(MK, true);
198   }
199
200   /// \brief Return NSNumberLiteralMethodKind if \p Sel is such a selector.
201   Optional<NSNumberLiteralMethodKind>
202       getNSNumberLiteralMethodKind(Selector Sel) const;
203
204   /// \brief Determine the appropriate NSNumber factory method kind for a
205   /// literal of the given type.
206   Optional<NSNumberLiteralMethodKind>
207       getNSNumberFactoryMethodKind(QualType T) const;
208
209   /// \brief Returns true if \param T is a typedef of "BOOL" in objective-c.
210   bool isObjCBOOLType(QualType T) const;
211   /// \brief Returns true if \param T is a typedef of "NSInteger" in objective-c.
212   bool isObjCNSIntegerType(QualType T) const;
213   /// \brief Returns true if \param T is a typedef of "NSUInteger" in objective-c.
214   bool isObjCNSUIntegerType(QualType T) const;
215   /// \brief Returns one of NSIntegral typedef names if \param T is a typedef
216   /// of that name in objective-c.
217   StringRef GetNSIntegralKind(QualType T) const;
218
219   /// \brief Returns \c true if \p Id is currently defined as a macro.
220   bool isMacroDefined(StringRef Id) const;
221
222 private:
223   bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const;
224   bool isObjCEnumerator(const Expr *E,
225                         StringRef name, IdentifierInfo *&II) const;
226   Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const;
227
228   ASTContext &Ctx;
229
230   mutable IdentifierInfo *ClassIds[NumClassIds];
231
232   mutable Selector NSStringSelectors[NumNSStringMethods];
233
234   /// \brief The selectors for Objective-C NSArray methods.
235   mutable Selector NSArraySelectors[NumNSArrayMethods];
236
237   /// \brief The selectors for Objective-C NSDictionary methods.
238   mutable Selector NSDictionarySelectors[NumNSDictionaryMethods];
239
240   /// \brief The selectors for Objective-C NSSet methods.
241   mutable Selector NSSetSelectors[NumNSSetMethods];
242
243   /// \brief The Objective-C NSNumber selectors used to create NSNumber literals.
244   mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods];
245   mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods];
246
247   mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel,
248                    setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel,
249                    isEqualSel;
250
251   mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId;
252   mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId;
253 };
254
255 }  // end namespace clang
256
257 #endif // LLVM_CLANG_AST_NSAPI_H