sammccall added inline comments.

================
Comment at: clang-tools-extra/clangd/FindTarget.cpp:657
+    void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *OID) {
+      if (OID->hasDefinition())
+        visitProtocolList(OID->protocols(), OID->protocol_locs());
----------------
dgoldman wrote:
> Should this be isThisDeclarationADefinition()? Is it even needed (will the 
> protocol list just be empty otherwise)?
Indeed it should be isThisDeclarationADefinition().
And I think this is why we need the check - otherwise if this is a forward 
decl, we'll still traverse the protocols at any visible definition.

(getReferencedProtocols() asserts, and I was calling that at some point, which 
is why I originially had this check).


================
Comment at: clang-tools-extra/clangd/FindTarget.cpp:659
+        visitProtocolList(OID->protocols(), OID->protocol_locs());
+      Base::VisitObjCInterfaceDecl(OID); // Visit the interface itself.
+    }
----------------
dgoldman wrote:
> Hmm, for what? might be better to say why/what it does
Changed the comment.

(this walks back up the hierarchy, landing at VisitNamedDecl, which highlights 
the primary name token)


================
Comment at: clang-tools-extra/clangd/FindTarget.cpp:668
+                                  /*IsDecl=*/false,
+                                  {OCD->getClassInterface()}});
+      Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(),
----------------
dgoldman wrote:
> IIRC I think it's possible that these could be NULL if the code was invalid, 
> is this NULL safe?
Good point. But checking for nulls is tedious, and guessing which cases can't 
ever be null is a fool's game. Made it null-safe in 
https://github.com/llvm/llvm-project/commit/7556abf82137b57be9e32475a1995f936a22cd16
 instead.


================
Comment at: clang-tools-extra/clangd/FindTarget.cpp:774
+      Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(),
+                                  E->getSelectorStartLoc(),
+                                  /*IsDecl=*/false, Targets});
----------------
dgoldman wrote:
> What is this location used for? I guess it's not possible to have multiple 
> Locs here like we have for a selector and you specifically handle for 
> semantic highlighting below?
Yup, the abstraction only lets us report one location/token, and it's not worth 
complicating for one case IMO, so we hack around it at the caller.

There are two ideas for the specific location
 - it's a reasonable fallback behavior
 - callers that do handle the multi-token case themselves can use this location 
to match up the overlapping data. (As SemanticTokens does here and 
DocumentHighlight does too albeit it uses IndexDataConsumer code rather than 
findExplicitReferences)

Added a comment noting the limitation.


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:927-930
+      // Possible it was something else referencing an ObjCMethodDecl.
+      // If the first token doesn't match, assume our guess was wrong.
+      if (!Locs.empty() && Locs.front() != Loc)
+        Locs.clear();
----------------
dgoldman wrote:
> Hmm, is this intentional? Not sure what else could reference it besides maybe 
> a property?
I'm not sure either, but IME assuming we've covered every possible case in the 
AST tends to be a bad idea :-) This is mostly a defensive check (though now you 
mention it, I suppose property access might hit this.

Note that isa<ObjCMessageExpr>(OrigE) implies we're indexing a message expr, 
but isa<ObjCMethodDecl>(OrigD) *doesn't* imply we're indexing a method decl! 
(When indexing a message expr, OrigD is set to the target method, so the order 
of if/else is significant here).
This makes me feel like it would be quite plausible to go off the rails without 
this check.

I've tweaked the comments a bit here to reinforce this is a sanity check.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97617/new/

https://reviews.llvm.org/D97617

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to