From 4c5a4514d14537cae5459e03d1fea422664b3bc2 Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Fri, 10 Jan 2020 10:40:30 +0100 Subject: [PATCH] [clangd] Fix targetDecl() on certain usage of ObjC properties. Summary: In particular there's a common chain: OpaqueValueExpr->PseudoObjectExpr->ObjCPropertyRefExpr->ObjCPropertyDecl and we weren't handling the first two edges Reviewers: dgoldman, kadircet Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, jfb, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D72494 --- clang-tools-extra/clangd/FindTarget.cpp | 6 ++++++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp index 119b932..d8ce0b6 100644 --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -334,6 +334,12 @@ public: void VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE) { Outer.add(OPE->getProtocol(), Flags); } + void VisitOpaqueValueExpr(const OpaqueValueExpr *OVE) { + Outer.add(OVE->getSourceExpr(), Flags); + } + void VisitPseudoObjectExpr(const PseudoObjectExpr *POE) { + Outer.add(POE->getSyntacticForm(), Flags); + } }; Visitor(*this, Flags).Visit(S); } diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp index f34205a..263d015 100644 --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -503,15 +503,15 @@ TEST_F(TargetDeclTest, ObjC) { EXPECT_DECLS("ObjCPropertyRefExpr", "- (void)setX:(int)x"); Code = R"cpp( - @interface Foo {} - @property int x; + @interface I {} + @property(retain) I* x; + @property(retain) I* y; @end - void test(Foo *f) { - [[f.x]] = 42; + void test(I *f) { + [[f.x]].y = 0; } )cpp"; - EXPECT_DECLS("ObjCPropertyRefExpr", - "@property(atomic, assign, unsafe_unretained, readwrite) int x"); + EXPECT_DECLS("OpaqueValueExpr", "@property(atomic, retain, readwrite) I *x"); Code = R"cpp( @protocol Foo -- 2.7.4