Clang Project

clang_source_code/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
16namespace clang {
17  class ASTContext;
18  class ObjCInterfaceDecl;
19  class QualType;
20  class Expr;
21
22// 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    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 Kconst;
54
55  /// The Objective-C NSString selectors.
56  Selector getNSStringSelector(NSStringMethodKind MKconst;
57
58  /// Return NSStringMethodKind if \param Sel is such a selector.
59  Optional<NSStringMethodKindgetNSStringMethodKind(Selector Selconst;
60
61  /// Returns true if the expression \param E is a reference of
62  /// "NSUTF8StringEncoding" enum constant.
63  bool isNSUTF8StringEncodingConstant(const Expr *Econst {
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 *Econst {
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 MKconst;
93
94  /// Return NSArrayMethodKind if \p Sel is such a selector.
95  Optional<NSArrayMethodKindgetNSArrayMethodKind(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 MKconst;
118
119  /// Return NSDictionaryMethodKind if \p Sel is such a selector.
120  Optional<NSDictionaryMethodKindgetNSDictionaryMethodKind(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 MKconst;
135
136  /// Return NSSetMethodKind if \p Sel is such a selector.
137  Optional<NSSetMethodKindgetNSSetMethodKind(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 Instanceconst;
201
202  bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,
203                                 Selector Selconst {
204    return Sel == getNSNumberLiteralSelector(MKfalse) ||
205           Sel == getNSNumberLiteralSelector(MKtrue);
206  }
207
208  /// Return NSNumberLiteralMethodKind if \p Sel is such a selector.
209  Optional<NSNumberLiteralMethodKind>
210      getNSNumberLiteralMethodKind(Selector Selconst;
211
212  /// Determine the appropriate NSNumber factory method kind for a
213  /// literal of the given type.
214  Optional<NSNumberLiteralMethodKind>
215      getNSNumberFactoryMethodKind(QualType Tconst;
216
217  /// Returns true if \param T is a typedef of "BOOL" in objective-c.
218  bool isObjCBOOLType(QualType Tconst;
219  /// Returns true if \param T is a typedef of "NSInteger" in objective-c.
220  bool isObjCNSIntegerType(QualType Tconst;
221  /// Returns true if \param T is a typedef of "NSUInteger" in objective-c.
222  bool isObjCNSUIntegerType(QualType Tconst;
223  /// Returns one of NSIntegral typedef names if \param T is a typedef
224  /// of that name in objective-c.
225  StringRef GetNSIntegralKind(QualType Tconst;
226
227  /// Returns \c true if \p Id is currently defined as a macro.
228  bool isMacroDefined(StringRef Idconst;
229
230  /// Returns \c true if \p InterfaceDecl is subclass of \p NSClassKind
231  bool isSubclassOfNSClass(ObjCInterfaceDecl *InterfaceDecl,
232                           NSClassIdKindKind NSClassKindconst;
233
234private:
235  bool isObjCTypedef(QualType TStringRef nameIdentifierInfo *&IIconst;
236  bool isObjCEnumerator(const Expr *E,
237                        StringRef nameIdentifierInfo *&IIconst;
238  Selector getOrInitSelector(ArrayRef<StringRefIdsSelector &Selconst;
239  Selector getOrInitNullarySelector(StringRef IdSelector &Selconst;
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 objectForKeyedSubscriptSelobjectAtIndexedSubscriptSel,
261                   setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel,
262                   isEqualSelInitSelNewSel;
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
271
clang::NSAPI::getASTContext
clang::NSAPI::NSClassIdKindKind
clang::NSAPI::NumClassIds
clang::NSAPI::NSStringMethodKind
clang::NSAPI::NumNSStringMethods
clang::NSAPI::getNSClassId
clang::NSAPI::getNSStringSelector
clang::NSAPI::getNSStringMethodKind
clang::NSAPI::isNSUTF8StringEncodingConstant
clang::NSAPI::isNSASCIIStringEncodingConstant
clang::NSAPI::NSArrayMethodKind
clang::NSAPI::NumNSArrayMethods
clang::NSAPI::getNSArraySelector
clang::NSAPI::getNSArrayMethodKind
clang::NSAPI::NSDictionaryMethodKind
clang::NSAPI::NumNSDictionaryMethods
clang::NSAPI::getNSDictionarySelector
clang::NSAPI::getNSDictionaryMethodKind
clang::NSAPI::NSSetMethodKind
clang::NSAPI::NumNSSetMethods
clang::NSAPI::getNSSetSelector
clang::NSAPI::getNSSetMethodKind
clang::NSAPI::getObjectForKeyedSubscriptSelector
clang::NSAPI::getObjectAtIndexedSubscriptSelector
clang::NSAPI::getSetObjectForKeyedSubscriptSelector
clang::NSAPI::getSetObjectAtIndexedSubscriptSelector
clang::NSAPI::getIsEqualSelector
clang::NSAPI::getNewSelector
clang::NSAPI::getInitSelector
clang::NSAPI::NSNumberLiteralMethodKind
clang::NSAPI::NumNSNumberLiteralMethods
clang::NSAPI::getNSNumberLiteralSelector
clang::NSAPI::isNSNumberLiteralSelector
clang::NSAPI::getNSNumberLiteralMethodKind
clang::NSAPI::getNSNumberFactoryMethodKind
clang::NSAPI::isObjCBOOLType
clang::NSAPI::isObjCNSIntegerType
clang::NSAPI::isObjCNSUIntegerType
clang::NSAPI::GetNSIntegralKind
clang::NSAPI::isMacroDefined
clang::NSAPI::isSubclassOfNSClass
clang::NSAPI::isObjCTypedef
clang::NSAPI::isObjCEnumerator
clang::NSAPI::getOrInitSelector
clang::NSAPI::getOrInitNullarySelector
clang::NSAPI::Ctx
clang::NSAPI::ClassIds
clang::NSAPI::NSStringSelectors
clang::NSAPI::NSArraySelectors
clang::NSAPI::NSDictionarySelectors
clang::NSAPI::NSSetSelectors
clang::NSAPI::NSNumberClassSelectors
clang::NSAPI::NSNumberInstanceSelectors
clang::NSAPI::objectForKeyedSubscriptSel
clang::NSAPI::objectAtIndexedSubscriptSel
clang::NSAPI::setObjectForKeyedSubscriptSel
clang::NSAPI::setObjectAtIndexedSubscriptSel
clang::NSAPI::isEqualSel
clang::NSAPI::InitSel
clang::NSAPI::NewSel
clang::NSAPI::BOOLId
clang::NSAPI::NSIntegerId
clang::NSAPI::NSUIntegerId
clang::NSAPI::NSASCIIStringEncodingId
clang::NSAPI::NSUTF8StringEncodingId