/* * Copyright (c) 2016-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import #include #include #import "FakeComponentKitHeader.h" @interface CKLabelComponent : CKCompositeComponent + (instancetype)newWithLabelAttributes:(LabelAttributes)labelAttributes viewAttributes:(ViewAttributes)viewAttributes size:(CKSize)size; @end @implementation CKLabelComponent + (instancetype)newWithLabelAttributes:(LabelAttributes)labelAttributes viewAttributes:(ViewAttributes)viewAttributes size:(CKSize)size { return nil; } @end // Non-component class should be linted if in the same translation unit as a // component or controllerimplementation @interface SomeClass : NSObject @end @implementation SomeClass { NSString* _foo; } - (instancetype)init { if (self = [super init]) { NSString* foo = @"HI"; // error _foo = foo; } return nil; } @end @interface FooComponent : CKCompositeComponent @end @implementation FooComponent + (instancetype)newWithString:(NSString*)string { // Built-in types int builtin1 = 3; // error const int builtin2 = 4; // no error int const builtin3 = 1; // no error // Objc types NSString* a = @"lol"; // error NSString* const b = @"lol"; // no error static NSString* st = @"lol"; // no error const NSString* c = @"lol"; // error const NSString* const d = @"lol"; // no error // Typedef resolution BOOL e = YES; // error const BOOL f = YES; // no error // Pointer types NSObject* const o1 = nil; // no error NSObject* const* o2 = &o1; // error NSObject* const* const o3 = &o1; // no error return [super newWithComponent:[CKLabelComponent newWithLabelAttributes:{ .string = [@[ a, b, c, d ] componentsJoinedByString:@", "], } viewAttributes:{} size:{}]]; } @end class BarClass { public: int a; }; @interface BarComponent : CKCompositeComponent @end @implementation BarComponent + (instancetype) new { // C++ classes BarClass s1; // error const BarClass& s2 = s1; // no error BarClass& s3 = s1; // error const BarClass s4 = {.a = 3}; // no error // Whitelisted C++ class CKComponentScope w1(self); // no error const CKComponentScope& w2 = w1; // no error CKComponentScope& w3 = w1; // no error // const CKComponentScope w4 = {.a = 3}; // Can't, lacks default ctor const CKComponentScope w4(self); // no error // Whitelisted Objc class NSError* const e = nil; // no error NSError* __autoreleasing* e1; // no error NSError const* __autoreleasing* e2; // no error NSError* const* e3 = &e; // no error NSError* const* const e4 = &e; // no error // implicit vars (e.g. ones generated in a for loop statement) const std::vector const_vector_of_const_int = {1, 2, 3}; for (int i : const_vector_of_const_int) { // error printf("%d", i); } for (const int i : const_vector_of_const_int) { printf("%d", i); } for (auto i : const_vector_of_const_int) { // auto != const int; error printf("%d", i); } for (const auto i : const_vector_of_const_int) { printf("%d", i); } for (auto& i : const_vector_of_const_int) { // auto == const int; no error printf("%d", i); } return nil; } - (void)no_mutable_local_variable_in_self_aliases { __weak auto weakSelf = self; // no error __strong auto strongSelf = self; // no error auto comp = [BarComponent new]; // error } @end