[PATCH] D101645: [clang] RecursiveASTVisitor visits ObjCPropertyRefExpr's class receiver
This revision was automatically updated to reflect the committed changes. Closed by commit rG13a8aa3ee15a: [clang] RecursiveASTVisitor visits ObjCPropertyRefExprs class receiver (authored by dgoldman). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101645/new/ https://reviews.llvm.org/D101645 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp clang/include/clang/AST/RecursiveASTVisitor.h clang/lib/Index/IndexBody.cpp clang/lib/Sema/SemaAvailability.cpp clang/test/Index/Core/index-source.m Index: clang/test/Index/Core/index-source.m === --- clang/test/Index/Core/index-source.m +++ clang/test/Index/Core/index-source.m @@ -405,15 +405,15 @@ void classReceivers() { ClassReceivers.p1 = 0; -// 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: [[@LINE-1]]: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-3]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,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: [[@LINE-1]]:24 | instance-property/ObjC | p1 | c:objc(cs)ClassReceivers(cpy)p1 | | Ref,RelCont | rel: 1 // CHECK-NEXT: RelCont | classReceivers | c:@F@classReceivers +// CHECK: [[@LINE-3]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,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 Index: clang/lib/Sema/SemaAvailability.cpp === --- clang/lib/Sema/SemaAvailability.cpp +++ clang/lib/Sema/SemaAvailability.cpp @@ -683,11 +683,7 @@ // to any useful diagnostics. bool TraverseCaseStmt(CaseStmt *CS) { return TraverseStmt(CS->getSubStmt()); } - bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { -if (PRE->isClassReceiver()) - DiagnoseDeclAvailability(PRE->getClassReceiver(), PRE->getReceiverLocation()); -return true; - } + bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { return true; } bool VisitObjCMessageExpr(ObjCMessageExpr *Msg) { if (ObjCMethodDecl *D = Msg->getMethodDecl()) { Index: clang/lib/Index/IndexBody.cpp === --- clang/lib/Index/IndexBody.cpp +++ clang/lib/Index/IndexBody.cpp @@ -286,9 +286,6 @@ } bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { -if (E->isClassReceiver()) - IndexCtx.handleReference(E->getClassReceiver(), E->getReceiverLocation(), - Parent, ParentDC); if (E->isExplicitProperty()) { SmallVector Relations; SymbolRoleSet Roles = getRolesForRef(E, Relations); Index: clang/include/clang/AST/RecursiveASTVisitor.h === --- clang/include/clang/AST/RecursiveASTVisitor.h +++ clang/include/clang/AST/RecursiveASTVisitor.h @@ -2638,7 +2638,16 @@ TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc())); }) -DEF_TRAVERSE_STMT(ObjCPropertyRefExpr, {}) +DEF_TRAVERSE_STMT(ObjCPropertyRefExpr, { + if (S->isClassReceiver()) { +ObjCInterfaceDecl *IDecl = S->getClassReceiver(); +QualType Type = IDecl->getASTContext().getObjCInterfaceType(IDecl); +ObjCInterfaceLocInfo Data; +Data.NameLoc = S->getReceiverLocation(); +Data.NameEndLoc = Data.NameLoc; +TRY_TO(TraverseTypeLoc(TypeLoc(Type, ))); + } +}) DEF_TRAVERSE_STMT(ObjCSubscriptRefExpr, {}) DEF_TRAVERSE_STMT(ObjCProtocolExpr, {}) DEF_TRAVERSE_STMT(ObjCSelectorExpr, {}) Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp === --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -981,8 +981,7 @@ id value = [[Foo]].sharedInstance; } )cpp"; - // FIXME: We currently can't identify the
[PATCH] D101645: [clang] RecursiveASTVisitor visits ObjCPropertyRefExpr's class receiver
sammccall accepted this revision. sammccall added a comment. This revision is now accepted and ready to land. This looks good from my side, thanks for fixing! Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101645/new/ https://reviews.llvm.org/D101645 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D101645: [clang] RecursiveASTVisitor visits ObjCPropertyRefExpr's class receiver
dgoldman added a comment. Friendly ping Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101645/new/ https://reviews.llvm.org/D101645 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D101645: [clang] RecursiveASTVisitor visits ObjCPropertyRefExpr's class receiver
akyrtzi added inline comments. Comment at: clang/test/Index/Core/index-source.m:410 // CHECK-NEXT: RelCont | classReceivers | c:@F@classReceivers +// CHECK: [[@LINE-3]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,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 benlangmuir wrote: > Is it okay that this is being visited out of source order now? CC @akyrtzi It's fine, while recording the data we make sure to keep the entries sorted by location. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101645/new/ https://reviews.llvm.org/D101645 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D101645: [clang] RecursiveASTVisitor visits ObjCPropertyRefExpr's class receiver
benlangmuir added a subscriber: akyrtzi. benlangmuir added inline comments. Comment at: clang/test/Index/Core/index-source.m:410 // CHECK-NEXT: RelCont | classReceivers | c:@F@classReceivers +// CHECK: [[@LINE-3]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,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 Is it okay that this is being visited out of source order now? CC @akyrtzi Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D101645/new/ https://reviews.llvm.org/D101645 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D101645: [clang] RecursiveASTVisitor visits ObjCPropertyRefExpr's class receiver
dgoldman created this revision. dgoldman added reviewers: sammccall, benlangmuir. Herald added subscribers: usaxena95, kadircet, arphaman. dgoldman requested review of this revision. Herald added subscribers: cfe-commits, ilya-biryukov. Herald added projects: clang, clang-tools-extra. We now make up a TypeLoc for the class receiver to simplify visiting, notably for indexing, availability, and clangd. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D101645 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp clang/include/clang/AST/RecursiveASTVisitor.h clang/lib/Index/IndexBody.cpp clang/lib/Sema/SemaAvailability.cpp clang/test/Index/Core/index-source.m Index: clang/test/Index/Core/index-source.m === --- clang/test/Index/Core/index-source.m +++ clang/test/Index/Core/index-source.m @@ -405,15 +405,15 @@ void classReceivers() { ClassReceivers.p1 = 0; -// 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: [[@LINE-1]]: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-3]]:3 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,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: [[@LINE-1]]:24 | instance-property/ObjC | p1 | c:objc(cs)ClassReceivers(cpy)p1 | | Ref,RelCont | rel: 1 // CHECK-NEXT: RelCont | classReceivers | c:@F@classReceivers +// CHECK: [[@LINE-3]]:9 | class/ObjC | ClassReceivers | c:objc(cs)ClassReceivers | _OBJC_CLASS_$_ClassReceivers | Ref,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 Index: clang/lib/Sema/SemaAvailability.cpp === --- clang/lib/Sema/SemaAvailability.cpp +++ clang/lib/Sema/SemaAvailability.cpp @@ -692,11 +692,7 @@ // to any useful diagnostics. bool TraverseCaseStmt(CaseStmt *CS) { return TraverseStmt(CS->getSubStmt()); } - bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { -if (PRE->isClassReceiver()) - DiagnoseDeclAvailability(PRE->getClassReceiver(), PRE->getReceiverLocation()); -return true; - } + bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { return true; } bool VisitObjCMessageExpr(ObjCMessageExpr *Msg) { if (ObjCMethodDecl *D = Msg->getMethodDecl()) { Index: clang/lib/Index/IndexBody.cpp === --- clang/lib/Index/IndexBody.cpp +++ clang/lib/Index/IndexBody.cpp @@ -286,9 +286,6 @@ } bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { -if (E->isClassReceiver()) - IndexCtx.handleReference(E->getClassReceiver(), E->getReceiverLocation(), - Parent, ParentDC); if (E->isExplicitProperty()) { SmallVector Relations; SymbolRoleSet Roles = getRolesForRef(E, Relations); Index: clang/include/clang/AST/RecursiveASTVisitor.h === --- clang/include/clang/AST/RecursiveASTVisitor.h +++ clang/include/clang/AST/RecursiveASTVisitor.h @@ -2623,7 +2623,16 @@ TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc())); }) -DEF_TRAVERSE_STMT(ObjCPropertyRefExpr, {}) +DEF_TRAVERSE_STMT(ObjCPropertyRefExpr, { + if (S->isClassReceiver()) { +ObjCInterfaceDecl *IDecl = S->getClassReceiver(); +QualType Type = IDecl->getASTContext().getObjCInterfaceType(IDecl); +ObjCInterfaceLocInfo Data; +Data.NameLoc = S->getReceiverLocation(); +Data.NameEndLoc = Data.NameLoc; +TRY_TO(TraverseTypeLoc(TypeLoc(Type, ))); + } +}) DEF_TRAVERSE_STMT(ObjCSubscriptRefExpr, {}) DEF_TRAVERSE_STMT(ObjCProtocolExpr, {}) DEF_TRAVERSE_STMT(ObjCSelectorExpr, {}) Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp === --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++