[clangd][ObjC] Highlight Objc Ivar refs
Treat them just like we do for properties - as a `property` semantic
token although ideally we could differentiate the two.
Differential Revision: https://reviews.llvm.org/D101785
diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp
index d4cb2fe7..4789d28 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -780,6 +780,13 @@
explicitReferenceTargets(DynTypedNode::create(*E), {}, Resolver)});
}
+ void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *OIRE) {
+ Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(),
+ OIRE->getLocation(),
+ /*IsDecl=*/false,
+ {OIRE->getDecl()}});
+ }
+
void VisitObjCMessageExpr(const ObjCMessageExpr *E) {
// The name may have several tokens, we can only report the first.
Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(),
diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index f32081a..beca7c2 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -1607,6 +1607,21 @@
"5: targets = {t}, decl\n"
"6: targets = {t}\n"
"7: targets = {}\n"},
+ // Objective-C: instance variables
+ {
+ R"cpp(
+ @interface I {
+ @public
+ I *_z;
+ }
+ @end
+ I *f;
+ void foo() {
+ $0^f->$1^_z = 0;
+ }
+ )cpp",
+ "0: targets = {f}\n"
+ "1: targets = {I::_z}\n"},
// Objective-C: properties
{
R"cpp(
diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index 815ef92..a2e8f79 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -687,6 +687,21 @@
@implementation $Class[[Foo]]($Namespace_decl[[Bar]])
@end
)cpp",
+ R"cpp(
+ // ObjC: Properties and Ivars.
+ @interface $Class_decl[[Foo]] {
+ int $Field_decl[[_someProperty]];
+ }
+ @property(nonatomic, assign) int $Field_decl[[someProperty]];
+ @end
+ @implementation $Class_decl[[Foo]]
+ @synthesize someProperty = _someProperty;
+ - (int)$Method_decl[[doSomething]] {
+ self.$Field[[someProperty]] = self.$Field[[someProperty]] + 1;
+ self->$Field[[_someProperty]] = $Field[[_someProperty]] + 1;
+ }
+ @end
+ )cpp",
// Member imported from dependent base
R"cpp(
template <typename> struct $Class_decl[[Base]] {