1 | // RUN: %check_clang_tidy %s google-objc-avoid-nsobject-new %t |
2 | |
3 | @interface NSObject |
4 | + (instancetype)new; |
5 | + (instancetype)alloc; |
6 | - (instancetype)init; |
7 | @end |
8 | |
9 | @interface NSProxy // Root class with no -init method. |
10 | @end |
11 | |
12 | // NSDate provides a specific factory method. |
13 | @interface NSDate : NSObject |
14 | + (instancetype)date; |
15 | @end |
16 | |
17 | // For testing behavior with Objective-C Generics. |
18 | @interface NSMutableDictionary<__covariant KeyType, __covariant ObjectType> : NSObject |
19 | @end |
20 | |
21 | @class NSString; |
22 | |
23 | #define ALLOCATE_OBJECT(_Type) [_Type new] |
24 | |
25 | void CheckSpecificInitRecommendations(void) { |
26 | NSObject *object = [NSObject new]; |
27 | // CHECK-MESSAGES: [[@LINE-1]]:22: warning: do not create objects with +new [google-objc-avoid-nsobject-new] |
28 | // CHECK-FIXES: [NSObject alloc] init]; |
29 | |
30 | NSDate *correctDate = [NSDate date]; |
31 | NSDate *incorrectDate = [NSDate new]; |
32 | // CHECK-MESSAGES: [[@LINE-1]]:27: warning: do not create objects with +new [google-objc-avoid-nsobject-new] |
33 | // CHECK-FIXES: [NSDate date]; |
34 | |
35 | NSObject *macroCreated = ALLOCATE_OBJECT(NSObject); // Shouldn't warn on macros. |
36 | |
37 | NSMutableDictionary *dict = [NSMutableDictionary<NSString *, NSString *> new]; |
38 | // CHECK-MESSAGES: [[@LINE-1]]:31: warning: do not create objects with +new [google-objc-avoid-nsobject-new] |
39 | // CHECK-FIXES: [NSMutableDictionary<NSString *, NSString *> alloc] init]; |
40 | } |
41 | |
42 | @interface Foo : NSObject |
43 | + (instancetype)new; // Declare again to suppress warning. |
44 | - (instancetype)initWithInt:(int)anInt; |
45 | - (instancetype)init __attribute__((unavailable)); |
46 | |
47 | - (id)new; |
48 | @end |
49 | |
50 | @interface Baz : Foo // Check unavailable -init through inheritance. |
51 | @end |
52 | |
53 | @interface ProxyFoo : NSProxy |
54 | + (instancetype)new; |
55 | @end |
56 | |
57 | void CallNewWhenInitUnavailable(void) { |
58 | Foo *foo = [Foo new]; |
59 | // CHECK-MESSAGES: [[@LINE-1]]:14: warning: do not create objects with +new [google-objc-avoid-nsobject-new] |
60 | |
61 | Baz *baz = [Baz new]; |
62 | // CHECK-MESSAGES: [[@LINE-1]]:14: warning: do not create objects with +new [google-objc-avoid-nsobject-new] |
63 | |
64 | // Instance method -new calls may be weird, but are not strictly forbidden. |
65 | Foo *bar = [[Foo alloc] initWithInt:4]; |
66 | [bar new]; |
67 | |
68 | ProxyFoo *proxy = [ProxyFoo new]; |
69 | // CHECK-MESSAGES: [[@LINE-1]]:21: warning: do not create objects with +new [google-objc-avoid-nsobject-new] |
70 | } |
71 | |
72 | @interface HasNewOverride : NSObject |
73 | @end |
74 | |
75 | @implementation HasNewOverride |
76 | + (instancetype)new { |
77 | return [[self alloc] init]; |
78 | } |
79 | // CHECK-MESSAGES: [[@LINE-3]]:1: warning: classes should not override +new [google-objc-avoid-nsobject-new] |
80 | @end |
81 | |