1*67e74705SXin Li// Test that @properties within class extensions are visited by 2*67e74705SXin Li// clang_visitChildren only in the class extension, not the original 3*67e74705SXin Li// @interface (where we have a duplicate declaration - to be removed). 4*67e74705SXin Li@interface Foo {} @end 5*67e74705SXin Li@interface Foo (Cat) 6*67e74705SXin Li@property int a; 7*67e74705SXin Li@end 8*67e74705SXin Li@interface Foo () 9*67e74705SXin Li@property int b; 10*67e74705SXin Li- (void) bar; 11*67e74705SXin Li@end 12*67e74705SXin Li 13*67e74705SXin Li// Test that 'setter' methods defined by @property in the class extension 14*67e74705SXin Li// but not the in @interface are only presented in the class extension. 15*67e74705SXin Li@interface Bar 16*67e74705SXin Li@property (readonly) id bar; 17*67e74705SXin Li@end 18*67e74705SXin Li@interface Bar () 19*67e74705SXin Li@property (readwrite) id bar; 20*67e74705SXin Li@end 21*67e74705SXin Li 22*67e74705SXin Li// Another test, this one involving protocols, where the @property should 23*67e74705SXin Li// not appear in the @interface. 24*67e74705SXin Li@class Rdar8467189_Bar; 25*67e74705SXin Li@protocol Rdar8467189_FooProtocol 26*67e74705SXin Li@property (readonly) Rdar8467189_Bar *Rdar8467189_Bar; 27*67e74705SXin Li@end 28*67e74705SXin Li@interface Rdar8467189_Foo <Rdar8467189_FooProtocol> 29*67e74705SXin Li@end 30*67e74705SXin Li@interface Rdar8467189_Foo () 31*67e74705SXin Li@property (readwrite) Rdar8467189_Bar *Rdar8467189_Bar; 32*67e74705SXin Li@end 33*67e74705SXin Li 34*67e74705SXin Li// Test if the @property added in an extension is not reported in the @interface. 35*67e74705SXin Li@interface Qux 36*67e74705SXin Li@end 37*67e74705SXin Li@interface Qux () 38*67e74705SXin Li@property (assign, readwrite) id qux; 39*67e74705SXin Li@end 40*67e74705SXin Li 41*67e74705SXin Li@implementation Qux 42*67e74705SXin Li@dynamic qux; 43*67e74705SXin Li@end 44*67e74705SXin Li 45*67e74705SXin Li// RUN: c-index-test -test-load-source local %s | FileCheck %s 46*67e74705SXin Li// CHECK: properties-class-extensions.m:4:12: ObjCInterfaceDecl=Foo:4:12 Extent=[4:1 - 4:23] 47*67e74705SXin Li// CHECK-NOT: properties-class-extensions.m:9:15: ObjCInstanceMethodDecl=setB::9:15 Extent=[9:15 - 9:16] 48*67e74705SXin Li// CHECK-NOT: properties-class-extensions.m:9:15: ParmDecl=b:9:15 (Definition) Extent=[9:15 - 9:16] 49*67e74705SXin Li// CHECK: properties-class-extensions.m:5:12: ObjCCategoryDecl=Cat:5:12 Extent=[5:1 - 7:5] 50*67e74705SXin Li// CHECK: properties-class-extensions.m:5:12: ObjCClassRef=Foo:4:12 Extent=[5:12 - 5:15] 51*67e74705SXin Li// CHECK: properties-class-extensions.m:6:15: ObjCPropertyDecl=a:6:15 Extent=[6:1 - 6:16] 52*67e74705SXin Li// CHECK: properties-class-extensions.m:6:15: ObjCInstanceMethodDecl=a:6:15 Extent=[6:15 - 6:16] 53*67e74705SXin Li// CHECK: properties-class-extensions.m:6:15: ObjCInstanceMethodDecl=setA::6:15 Extent=[6:15 - 6:16] 54*67e74705SXin Li// CHECK: properties-class-extensions.m:6:15: ParmDecl=a:6:15 (Definition) Extent=[6:15 - 6:16] 55*67e74705SXin Li// CHECK: properties-class-extensions.m:8:12: ObjCCategoryDecl=:8:12 Extent=[8:1 - 11:5] 56*67e74705SXin Li// CHECK: properties-class-extensions.m:8:12: ObjCClassRef=Foo:4:12 Extent=[8:12 - 8:15] 57*67e74705SXin Li// CHECK: properties-class-extensions.m:9:15: ObjCPropertyDecl=b:9:15 Extent=[9:1 - 9:16] 58*67e74705SXin Li// CHECK: properties-class-extensions.m:9:15: ObjCInstanceMethodDecl=b:9:15 Extent=[9:15 - 9:16] 59*67e74705SXin Li// CHECK: properties-class-extensions.m:9:15: ObjCInstanceMethodDecl=setB::9:15 Extent=[9:15 - 9:16] 60*67e74705SXin Li// CHECK: properties-class-extensions.m:9:15: ParmDecl=b:9:15 (Definition) Extent=[9:15 - 9:16] 61*67e74705SXin Li// CHECK: properties-class-extensions.m:10:10: ObjCInstanceMethodDecl=bar:10:10 Extent=[10:1 - 10:14] 62*67e74705SXin Li// CHECK: properties-class-extensions.m:15:12: ObjCInterfaceDecl=Bar:15:12 Extent=[15:1 - 17:5] 63*67e74705SXin Li// CHECK: properties-class-extensions.m:16:25: ObjCPropertyDecl=bar:16:25 [readonly,] Extent=[16:1 - 16:28] 64*67e74705SXin Li// CHECK: properties-class-extensions.m:16:22: TypeRef=id:0:0 Extent=[16:22 - 16:24] 65*67e74705SXin Li// CHECK: properties-class-extensions.m:16:25: ObjCInstanceMethodDecl=bar:16:25 Extent=[16:25 - 16:28] 66*67e74705SXin Li// CHECK: properties-class-extensions.m:18:12: ObjCCategoryDecl=:18:12 Extent=[18:1 - 20:5] 67*67e74705SXin Li// CHECK: properties-class-extensions.m:18:12: ObjCClassRef=Bar:15:12 Extent=[18:12 - 18:15] 68*67e74705SXin Li// CHECK: properties-class-extensions.m:19:26: ObjCPropertyDecl=bar:19:26 [readwrite,] Extent=[19:1 - 19:29] 69*67e74705SXin Li// CHECK: properties-class-extensions.m:19:23: TypeRef=id:0:0 Extent=[19:23 - 19:25] 70*67e74705SXin Li// CHECK-NOT: properties-class-extensions.m:16:25: ObjCInstanceMethodDecl=bar:16:25 Extent=[16:25 - 16:28] 71*67e74705SXin Li// CHECK: properties-class-extensions.m:19:26: ObjCInstanceMethodDecl=setBar::19:26 Extent=[19:26 - 19:29] 72*67e74705SXin Li// CHECK: properties-class-extensions.m:19:26: ParmDecl=bar:19:26 (Definition) Extent=[19:26 - 19:29] 73*67e74705SXin Li// CHECK-NOT: properties-class-extensions.m:24:8: ObjCInterfaceDecl=Rdar8467189_Bar:24:8 74*67e74705SXin Li// CHECK: properties-class-extensions.m:24:8: ObjCClassRef=Rdar8467189_Bar:24:8 Extent=[24:8 - 24:23] 75*67e74705SXin Li// CHECK: properties-class-extensions.m:25:11: ObjCProtocolDecl=Rdar8467189_FooProtocol:25:11 (Definition) Extent=[25:1 - 27:5] 76*67e74705SXin Li// CHECK: properties-class-extensions.m:26:39: ObjCPropertyDecl=Rdar8467189_Bar:26:39 [readonly,] Extent=[26:1 - 26:54] 77*67e74705SXin Li// CHECK: properties-class-extensions.m:26:22: ObjCClassRef=Rdar8467189_Bar:24:8 Extent=[26:22 - 26:37] 78*67e74705SXin Li// CHECK: properties-class-extensions.m:26:39: ObjCInstanceMethodDecl=Rdar8467189_Bar:26:39 Extent=[26:39 - 26:54] 79*67e74705SXin Li// CHECK: properties-class-extensions.m:28:12: ObjCInterfaceDecl=Rdar8467189_Foo:28:12 Extent=[28:1 - 29:5] 80*67e74705SXin Li// CHECK: properties-class-extensions.m:28:29: ObjCProtocolRef=Rdar8467189_FooProtocol:25:11 Extent=[28:29 - 28:52] 81*67e74705SXin Li// CHECK-NOT: properties-class-extensions.m:31:40: ObjCPropertyDecl=Rdar8467189_Bar:31:40 Extent=[31:40 - 31:55] 82*67e74705SXin Li// CHECK-NOT: properties-class-extensions.m:31:23: ObjCClassRef=Rdar8467189_Bar:24:8 Extent=[31:23 - 31:38] 83*67e74705SXin Li// CHECK: properties-class-extensions.m:30:12: ObjCCategoryDecl=:30:12 Extent=[30:1 - 32:5] 84*67e74705SXin Li// CHECK: properties-class-extensions.m:30:12: ObjCClassRef=Rdar8467189_Foo:28:12 Extent=[30:12 - 30:27] 85*67e74705SXin Li// CHECK: properties-class-extensions.m:31:40: ObjCPropertyDecl=Rdar8467189_Bar:31:40 [readwrite,] Extent=[31:1 - 31:55] 86*67e74705SXin Li// CHECK: properties-class-extensions.m:31:23: ObjCClassRef=Rdar8467189_Bar:24:8 Extent=[31:23 - 31:38] 87*67e74705SXin Li// CHECK: properties-class-extensions.m:31:40: ObjCInstanceMethodDecl=Rdar8467189_Bar:31:40 [Overrides @26:39] Extent=[31:40 - 31:55] 88*67e74705SXin Li// CHECK: properties-class-extensions.m:31:40: ObjCInstanceMethodDecl=setRdar8467189_Bar::31:40 Extent=[31:40 - 31:55] 89*67e74705SXin Li// CHECK: properties-class-extensions.m:31:40: ParmDecl=Rdar8467189_Bar:31:40 (Definition) Extent=[31:40 - 31:55] 90*67e74705SXin Li// CHECK: properties-class-extensions.m:35:12: ObjCInterfaceDecl=Qux:35:12 Extent=[35:1 - 36:5] 91*67e74705SXin Li// CHECK: properties-class-extensions.m:37:12: ObjCCategoryDecl=:37:12 Extent=[37:1 - 39:5] 92*67e74705SXin Li// CHECK: properties-class-extensions.m:37:12: ObjCClassRef=Qux:35:12 Extent=[37:12 - 37:15] 93*67e74705SXin Li// CHECK: properties-class-extensions.m:38:34: ObjCPropertyDecl=qux:38:34 [assign,readwrite,] Extent=[38:1 - 38:37] 94*67e74705SXin Li// CHECK: properties-class-extensions.m:38:31: TypeRef=id:0:0 Extent=[38:31 - 38:33] 95*67e74705SXin Li// CHECK: properties-class-extensions.m:38:34: ObjCInstanceMethodDecl=qux:38:34 Extent=[38:34 - 38:37] 96*67e74705SXin Li// CHECK: properties-class-extensions.m:38:34: ObjCInstanceMethodDecl=setQux::38:34 Extent=[38:34 - 38:37] 97*67e74705SXin Li// CHECK: properties-class-extensions.m:38:34: ParmDecl=qux:38:34 (Definition) Extent=[38:34 - 38:37] 98*67e74705SXin Li// CHECK: properties-class-extensions.m:42:10: ObjCDynamicDecl=qux:38:34 (Definition) Extent=[42:1 - 42:13] 99*67e74705SXin Li 100