Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/include/clang/AST/NSAPI.h
Line
Count
Source
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
10.3k
  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
4
  bool isNSUTF8StringEncodingConstant(const Expr *E) const {
64
4
    return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId);
65
4
  }
66
67
  /// Returns true if the expression \param E is a reference of
68
  /// "NSASCIIStringEncoding" enum constant.
69
3
  bool isNSASCIIStringEncodingConstant(const Expr *E) const {
70
3
    return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId);
71
3
  }
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
14
  Selector getObjectForKeyedSubscriptSelector() const {
141
14
    return getOrInitSelector(StringRef("objectForKeyedSubscript"),
142
14
                             objectForKeyedSubscriptSel);
143
14
  }
144
145
  /// Returns selector for "objectAtIndexedSubscript:".
146
11
  Selector getObjectAtIndexedSubscriptSelector() const {
147
11
    return getOrInitSelector(StringRef("objectAtIndexedSubscript"),
148
11
                             objectAtIndexedSubscriptSel);
149
11
  }
150
151
  /// Returns selector for "setObject:forKeyedSubscript".
152
9
  Selector getSetObjectForKeyedSubscriptSelector() const {
153
9
    StringRef Ids[] = { "setObject", "forKeyedSubscript" };
154
9
    return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel);
155
9
  }
156
157
  /// Returns selector for "setObject:atIndexedSubscript".
158
6
  Selector getSetObjectAtIndexedSubscriptSelector() const {
159
6
    StringRef Ids[] = { "setObject", "atIndexedSubscript" };
160
6
    return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel);
161
6
  }
162
163
  /// Returns selector for "isEqual:".
164
109
  Selector getIsEqualSelector() const {
165
109
    return getOrInitSelector(StringRef("isEqual"), isEqualSel);
166
109
  }
167
168
1.33k
  Selector getNewSelector() const {
169
1.33k
    return getOrInitNullarySelector("new", NewSel);
170
1.33k
  }
171
172
3.32k
  Selector getInitSelector() const {
173
3.32k
    return getOrInitNullarySelector("init", InitSel);
174
3.32k
  }
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
4.53k
                                 Selector Sel) const {
204
4.53k
    return Sel == getNSNumberLiteralSelector(MK, false) ||
205
4.53k
           
Sel == getNSNumberLiteralSelector(MK, true)3.94k
;
206
4.53k
  }
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