From: Ben Langmuir Date: Fri, 21 Jul 2017 23:04:27 +0000 (+0000) Subject: [index] Set SymbolSubKind::Accessor[GS]etter on class methods X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a50011f98b3ec6b3e79150451a59ddaf9b9cf937;p=clang [index] Set SymbolSubKind::Accessor[GS]etter on class methods We have the same relation between class properties and getter/setters that we have for instance properties, so set the same symbol sub-kind. rdar://problem/32376404 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@308800 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Index/IndexSymbol.cpp b/lib/Index/IndexSymbol.cpp index 0dc3720208..95b3ac1966 100644 --- a/lib/Index/IndexSymbol.cpp +++ b/lib/Index/IndexSymbol.cpp @@ -201,25 +201,22 @@ SymbolInfo index::getSymbolInfo(const Decl *D) { Info.Properties |= (unsigned)SymbolProperty::UnitTest; break; } - case Decl::ObjCMethod: - if (cast(D)->isInstanceMethod()) { - const ObjCMethodDecl *MD = cast(D); - Info.Kind = SymbolKind::InstanceMethod; - if (MD->isPropertyAccessor()) { - if (MD->param_size()) - Info.SubKind = SymbolSubKind::AccessorSetter; - else - Info.SubKind = SymbolSubKind::AccessorGetter; - } - } else { - Info.Kind = SymbolKind::ClassMethod; + case Decl::ObjCMethod: { + const ObjCMethodDecl *MD = cast(D); + Info.Kind = MD->isInstanceMethod() ? SymbolKind::InstanceMethod : SymbolKind::ClassMethod; + if (MD->isPropertyAccessor()) { + if (MD->param_size()) + Info.SubKind = SymbolSubKind::AccessorSetter; + else + Info.SubKind = SymbolSubKind::AccessorGetter; } Info.Lang = SymbolLanguage::ObjC; - if (isUnitTest(cast(D))) + if (isUnitTest(MD)) Info.Properties |= (unsigned)SymbolProperty::UnitTest; if (D->hasAttr()) Info.Properties |= (unsigned)SymbolProperty::IBAnnotated; break; + } case Decl::ObjCProperty: Info.Kind = SymbolKind::InstanceProperty; Info.Lang = SymbolLanguage::ObjC; diff --git a/test/Index/Core/index-source.m b/test/Index/Core/index-source.m index 1333cafd75..2931e664ea 100644 --- a/test/Index/Core/index-source.m +++ b/test/Index/Core/index-source.m @@ -389,6 +389,15 @@ struct Separate separateE; @interface ClassReceivers @property(class) int p1; +// CHECK: [[@LINE-1]]:22 | class-method/acc-get/ObjC | p1 | c:objc(cs)ClassReceivers(cm)p1 | +[ClassReceivers p1] | Decl,Dyn,Impl,RelChild,RelAcc | rel: 2 +// CHECK-NEXT: RelChild | ClassReceivers | c:objc(cs)ClassReceivers +// CHECK-NEXT: RelAcc | p1 | c:objc(cs)ClassReceivers(cpy)p1 +// CHECK: [[@LINE-4]]:22 | class-method/acc-set/ObjC | setP1: | c:objc(cs)ClassReceivers(cm)setP1: | +[ClassReceivers setP1:] | Decl,Dyn,Impl,RelChild,RelAcc | rel: 2 +// CHECK-NEXT: RelChild | ClassReceivers | c:objc(cs)ClassReceivers +// CHECK-NEXT: RelAcc | p1 | c:objc(cs)ClassReceivers(cpy)p1 +// CHECK: [[@LINE-7]]:22 | instance-property/ObjC | p1 | c:objc(cs)ClassReceivers(cpy)p1 | | Decl,RelChild | rel: 1 +// CHECK-NEXT: RelChild | ClassReceivers | c:objc(cs)ClassReceivers + + (int)implicit; + (void)setImplicit:(int)x; @@ -399,13 +408,13 @@ void classReceivers() { // CHECK: [[@LINE-1]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 // CHECK: [[@LINE-2]]:18 | instance-property/ObjC | p1 | c:objc(cs)ClassReceivers(cpy)p1 | | Ref,Writ,RelCont | rel: 1 // CHECK-NEXT: RelCont | classReceivers | c:@F@classReceivers -// CHECK: [[@LINE-4]]:18 | class-method/ObjC | setP1: | c:objc(cs)ClassReceivers(cm)setP1: | +[ClassReceivers setP1:] | Ref,Call,Impl,RelCall,RelCont | rel: 1 +// CHECK: [[@LINE-4]]:18 | class-method/acc-set/ObjC | setP1: | c:objc(cs)ClassReceivers(cm)setP1: | +[ClassReceivers setP1:] | Ref,Call,Impl,RelCall,RelCont | rel: 1 // CHECK-NEXT: RelCall,RelCont | classReceivers | c:@F@classReceivers (void)ClassReceivers.p1; // CHECK: [[@LINE-1]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,RelCont | rel: 1 // CHECK: [[@LINE-2]]:24 | instance-property/ObjC | p1 | c:objc(cs)ClassReceivers(cpy)p1 | | Ref,RelCont | rel: 1 // CHECK-NEXT: RelCont | classReceivers | c:@F@classReceivers -// CHECK: [[@LINE-4]]:24 | class-method/ObjC | p1 | c:objc(cs)ClassReceivers(cm)p1 | +[ClassReceivers p1] | Ref,Call,Impl,RelCall,RelCont | rel: 1 +// CHECK: [[@LINE-4]]:24 | class-method/acc-get/ObjC | p1 | c:objc(cs)ClassReceivers(cm)p1 | +[ClassReceivers p1] | Ref,Call,Impl,RelCall,RelCont | rel: 1 // CHECK-NEXT: RelCall,RelCont | classReceivers | c:@F@classReceivers ClassReceivers.implicit = 0;