nridge added a comment.

Thanks -- this patch is looking great so far!



================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:314
 //   (these tend to be vague, like Type or Unknown)
+// - Resolved tokens (i.e. without the "dependent-name" modifier) with kind
+//   "Unknown" are less reliable than resolved tokens with other kinds
----------------
We should consider the case where a dependent name is passed by non-const 
reference, for example:

```
void increment_counter(int&);

template <typename T>
void bar() {
   increment_counter(T::static_counter);
}
```

This case does not work yet with the current patch (the dependent name is a 
`DependentScopeDeclRefExpr` rather than a `DeclRefExpr`), but we'll want to 
make it work in the future.

With the conflict resolution logic in this patch, the `Unknown` token kind from 
`highlightPassedByNonConstReference()` will be chosen over the dependent token 
kind.

As it happens, the dependent token kind for expressions is also `Unknown` so it 
doesn't matter, but perhaps we shouldn't be relying on this. Perhaps the 
following would make more sense:

1. a token with `Unknown` as the kind has the lowest priority
2. then a token with the `DependentName` modifier (next lowest)
3. then everything else?


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:515
+    // Highlighting parameters passed by non-const reference does not really
+    // make sence for these
+    if (isa<CXXOperatorCallExpr>(E) || isa<UserDefinedLiteral>(E))
----------------
nit: sense


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:530
+      const FunctionDecl *FD,
+      llvm::function_ref<Expr *(size_t)> GetArgExprAtIndex) {
+    if (!FD)
----------------
We can avoid the callback by constructing an ArrayRef of the arguments, see a 
similar case here:

https://searchfox.org/llvm/source/clang-tools-extra/clangd/InlayHints.cpp#56
https://searchfox.org/llvm/source/clang-tools-extra/clangd/InlayHints.cpp#79


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:542
+        // Is this parameter passed by non-const reference?
+        if (T->isLValueReferenceType() && !isConst(T)) {
+          if (auto *Arg = GetArgExprAtIndex(I)) {
----------------
I think there are some edge cases where `isConst()` doesn't do what we want.

For example, I think for a parameter of type `const int*&`, it will return 
`true` (and thus we will **not** highlight the corresponding argument), even 
thus this is actually a non-const reference.

So, we may want to use a dedicated function that specifically handles 
reference-related logic only.

(This probably also makes a good test case.)


================
Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:547
+            if (isa<DeclRefExpr>(Arg)) {
+              Location = Arg->getBeginLoc();
+            } else if (auto *M = dyn_cast<MemberExpr>(Arg)) {
----------------
For a qualified name (e.g. `A::B`), I think this is going to return the 
beginning of the qualifier, whereas we only want to highlight the last name 
(otherwise there won't be a matching token from the first pass).

So I think we want `getLocation()` instead.

(Also makes a good test case.)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D108320

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

Reply via email to