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