clang  8.0.0svn
NSAPI.h
Go to the documentation of this file.
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 
14 #include "llvm/ADT/ArrayRef.h"
15 #include "llvm/ADT/Optional.h"
16 
17 namespace clang {
18  class ASTContext;
19  class ObjCInterfaceDecl;
20  class QualType;
21  class Expr;
22 
23 // Provides info and caches identifiers/selectors for NSFoundation API.
24 class NSAPI {
25 public:
26  explicit NSAPI(ASTContext &Ctx);
27 
28  ASTContext &getASTContext() const { return Ctx; }
29 
41  };
42  static const unsigned NumClassIds = 10;
43 
51  };
52  static const unsigned NumNSStringMethods = 6;
53 
55 
56  /// The Objective-C NSString selectors.
58 
59  /// Return NSStringMethodKind if \param Sel is such a selector.
61 
62  /// Returns true if the expression \param E is a reference of
63  /// "NSUTF8StringEncoding" enum constant.
64  bool isNSUTF8StringEncodingConstant(const Expr *E) const {
65  return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId);
66  }
67 
68  /// Returns true if the expression \param E is a reference of
69  /// "NSASCIIStringEncoding" enum constant.
70  bool isNSASCIIStringEncodingConstant(const Expr *E) const {
71  return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId);
72  }
73 
74  /// Enumerates the NSArray/NSMutableArray methods used to generate
75  /// literals and to apply some checks.
89  };
90  static const unsigned NumNSArrayMethods = 12;
91 
92  /// The Objective-C NSArray selectors.
94 
95  /// Return NSArrayMethodKind if \p Sel is such a selector.
97 
98  /// Enumerates the NSDictionary/NSMutableDictionary methods used
99  /// to generate literals and to apply some checks.
114  };
115  static const unsigned NumNSDictionaryMethods = 13;
116 
117  /// The Objective-C NSDictionary selectors.
119 
120  /// Return NSDictionaryMethodKind if \p Sel is such a selector.
122 
123  /// Enumerates the NSMutableSet/NSOrderedSet methods used
124  /// to apply some checks.
131  };
132  static const unsigned NumNSSetMethods = 5;
133 
134  /// The Objective-C NSSet selectors.
136 
137  /// Return NSSetMethodKind if \p Sel is such a selector.
139 
140  /// Returns selector for "objectForKeyedSubscript:".
142  return getOrInitSelector(StringRef("objectForKeyedSubscript"),
143  objectForKeyedSubscriptSel);
144  }
145 
146  /// Returns selector for "objectAtIndexedSubscript:".
148  return getOrInitSelector(StringRef("objectAtIndexedSubscript"),
149  objectAtIndexedSubscriptSel);
150  }
151 
152  /// Returns selector for "setObject:forKeyedSubscript".
154  StringRef Ids[] = { "setObject", "forKeyedSubscript" };
155  return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel);
156  }
157 
158  /// Returns selector for "setObject:atIndexedSubscript".
160  StringRef Ids[] = { "setObject", "atIndexedSubscript" };
161  return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel);
162  }
163 
164  /// Returns selector for "isEqual:".
166  return getOrInitSelector(StringRef("isEqual"), isEqualSel);
167  }
168 
170  return getOrInitNullarySelector("new", NewSel);
171  }
172 
174  return getOrInitNullarySelector("init", InitSel);
175  }
176 
177  /// Enumerates the NSNumber methods used to generate literals.
194  };
195  static const unsigned NumNSNumberLiteralMethods = 15;
196 
197  /// The Objective-C NSNumber selectors used to create NSNumber literals.
198  /// \param Instance if true it will return the selector for the init* method
199  /// otherwise it will return the selector for the number* method.
201  bool Instance) const;
202 
204  Selector Sel) const {
205  return Sel == getNSNumberLiteralSelector(MK, false) ||
206  Sel == getNSNumberLiteralSelector(MK, true);
207  }
208 
209  /// Return NSNumberLiteralMethodKind if \p Sel is such a selector.
212 
213  /// Determine the appropriate NSNumber factory method kind for a
214  /// literal of the given type.
217 
218  /// Returns true if \param T is a typedef of "BOOL" in objective-c.
219  bool isObjCBOOLType(QualType T) const;
220  /// Returns true if \param T is a typedef of "NSInteger" in objective-c.
221  bool isObjCNSIntegerType(QualType T) const;
222  /// Returns true if \param T is a typedef of "NSUInteger" in objective-c.
223  bool isObjCNSUIntegerType(QualType T) const;
224  /// Returns one of NSIntegral typedef names if \param T is a typedef
225  /// of that name in objective-c.
226  StringRef GetNSIntegralKind(QualType T) const;
227 
228  /// Returns \c true if \p Id is currently defined as a macro.
229  bool isMacroDefined(StringRef Id) const;
230 
231  /// Returns \c true if \p InterfaceDecl is subclass of \p NSClassKind
232  bool isSubclassOfNSClass(ObjCInterfaceDecl *InterfaceDecl,
233  NSClassIdKindKind NSClassKind) const;
234 
235 private:
236  bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const;
237  bool isObjCEnumerator(const Expr *E,
238  StringRef name, IdentifierInfo *&II) const;
239  Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const;
240  Selector getOrInitNullarySelector(StringRef Id, Selector &Sel) const;
241 
242  ASTContext &Ctx;
243 
244  mutable IdentifierInfo *ClassIds[NumClassIds];
245 
246  mutable Selector NSStringSelectors[NumNSStringMethods];
247 
248  /// The selectors for Objective-C NSArray methods.
249  mutable Selector NSArraySelectors[NumNSArrayMethods];
250 
251  /// The selectors for Objective-C NSDictionary methods.
252  mutable Selector NSDictionarySelectors[NumNSDictionaryMethods];
253 
254  /// The selectors for Objective-C NSSet methods.
255  mutable Selector NSSetSelectors[NumNSSetMethods];
256 
257  /// The Objective-C NSNumber selectors used to create NSNumber literals.
258  mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods];
259  mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods];
260 
261  mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel,
262  setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel,
263  isEqualSel, InitSel, NewSel;
264 
265  mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId;
266  mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId;
267 };
268 
269 } // end namespace clang
270 
271 #endif // LLVM_CLANG_AST_NSAPI_H
Selector getObjectAtIndexedSubscriptSelector() const
Returns selector for "objectAtIndexedSubscript:".
Definition: NSAPI.h:147
Optional< NSNumberLiteralMethodKind > getNSNumberFactoryMethodKind(QualType T) const
Determine the appropriate NSNumber factory method kind for a literal of the given type...
Definition: NSAPI.cpp:390
Smart pointer class that efficiently represents Objective-C method names.
A (possibly-)qualified type.
Definition: Type.h:642
Selector getNewSelector() const
Definition: NSAPI.h:169
Optional< NSDictionaryMethodKind > getNSDictionaryMethodKind(Selector Sel)
Return NSDictionaryMethodKind if Sel is such a selector.
Definition: NSAPI.cpp:259
NSNumberLiteralMethodKind
Enumerates the NSNumber methods used to generate literals.
Definition: NSAPI.h:178
Selector getIsEqualSelector() const
Returns selector for "isEqual:".
Definition: NSAPI.h:165
NSDictionaryMethodKind
Enumerates the NSDictionary/NSMutableDictionary methods used to generate literals and to apply some c...
Definition: NSAPI.h:100
One of these records is kept for each identifier that is lexed.
Selector getSetObjectForKeyedSubscriptSelector() const
Returns selector for "setObject:forKeyedSubscript".
Definition: NSAPI.h:153
Optional< NSSetMethodKind > getNSSetMethodKind(Selector Sel)
Return NSSetMethodKind if Sel is such a selector.
Definition: NSAPI.cpp:316
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:154
Selector getNSStringSelector(NSStringMethodKind MK) const
The Objective-C NSString selectors.
Definition: NSAPI.cpp:43
Selector getNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, bool Instance) const
The Objective-C NSNumber selectors used to create NSNumber literals.
Definition: NSAPI.cpp:326
Optional< NSNumberLiteralMethodKind > getNSNumberLiteralMethodKind(Selector Sel) const
Return NSNumberLiteralMethodKind if Sel is such a selector.
Definition: NSAPI.cpp:379
static const unsigned NumClassIds
Definition: NSAPI.h:42
static const unsigned NumNSNumberLiteralMethods
Definition: NSAPI.h:195
NSSetMethodKind
Enumerates the NSMutableSet/NSOrderedSet methods used to apply some checks.
Definition: NSAPI.h:125
NSAPI(ASTContext &Ctx)
Definition: NSAPI.cpp:18
Represents an ObjC class declaration.
Definition: DeclObjC.h:1164
static const unsigned NumNSSetMethods
Definition: NSAPI.h:132
NSClassIdKindKind
Definition: NSAPI.h:30
NSArrayMethodKind
Enumerates the NSArray/NSMutableArray methods used to generate literals and to apply some checks...
Definition: NSAPI.h:76
This represents one expression.
Definition: Expr.h:105
Selector getNSArraySelector(NSArrayMethodKind MK) const
The Objective-C NSArray selectors.
Definition: NSAPI.cpp:90
int Id
Definition: ASTDiff.cpp:191
ASTContext & getASTContext() const
Definition: NSAPI.h:28
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
StringRef GetNSIntegralKind(QualType T) const
Returns one of NSIntegral typedef names if.
Definition: NSAPI.cpp:511
bool isNSUTF8StringEncodingConstant(const Expr *E) const
Returns true if the expression.
Definition: NSAPI.h:64
bool isObjCBOOLType(QualType T) const
Returns true if.
Definition: NSAPI.cpp:499
bool isObjCNSUIntegerType(QualType T) const
Returns true if.
Definition: NSAPI.cpp:507
Selector getNSSetSelector(NSSetMethodKind MK) const
The Objective-C NSSet selectors.
Definition: NSAPI.cpp:269
bool isObjCNSIntegerType(QualType T) const
Returns true if.
Definition: NSAPI.cpp:503
bool isSubclassOfNSClass(ObjCInterfaceDecl *InterfaceDecl, NSClassIdKindKind NSClassKind) const
Returns true if InterfaceDecl is subclass of NSClassKind.
Definition: NSAPI.cpp:542
IdentifierInfo * getNSClassId(NSClassIdKindKind K) const
Definition: NSAPI.cpp:23
NSStringMethodKind
Definition: NSAPI.h:44
Selector getInitSelector() const
Definition: NSAPI.h:173
Optional< NSStringMethodKind > getNSStringMethodKind(Selector Sel) const
Return NSStringMethodKind if.
Definition: NSAPI.cpp:80
Dataflow Directional Tag Classes.
bool isMacroDefined(StringRef Id) const
Returns true if Id is currently defined as a macro.
Definition: NSAPI.cpp:537
bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK, Selector Sel) const
Definition: NSAPI.h:203
static const unsigned NumNSArrayMethods
Definition: NSAPI.h:90
Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const
The Objective-C NSDictionary selectors.
Definition: NSAPI.cpp:167
static const unsigned NumNSDictionaryMethods
Definition: NSAPI.h:115
Optional< NSArrayMethodKind > getNSArrayMethodKind(Selector Sel)
Return NSArrayMethodKind if Sel is such a selector.
Definition: NSAPI.cpp:157
Selector getObjectForKeyedSubscriptSelector() const
Returns selector for "objectForKeyedSubscript:".
Definition: NSAPI.h:141
static const unsigned NumNSStringMethods
Definition: NSAPI.h:52
bool isNSASCIIStringEncodingConstant(const Expr *E) const
Returns true if the expression.
Definition: NSAPI.h:70
Selector getSetObjectAtIndexedSubscriptSelector() const
Returns selector for "setObject:atIndexedSubscript".
Definition: NSAPI.h:159