[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
This commit is contained in:
David Goldman
2021-05-03 16:18:57 -04:00
parent 28f1d018b1
commit 159dd447fe
3 changed files with 37 additions and 0 deletions

View File

@@ -780,6 +780,13 @@ llvm::SmallVector<ReferenceLoc> refInStmt(const Stmt *S,
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(),

View File

@@ -1607,6 +1607,21 @@ TEST_F(FindExplicitReferencesTest, All) {
"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(

View File

@@ -687,6 +687,21 @@ sizeof...($TemplateParameter[[Elements]]);
@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]] {