hokein added inline comments.

================
Comment at: clang-tools-extra/clangd/Selection.cpp:526
+  // the traversal order of SizeExpr and ElementTypeLoc, which gives a chance
+  // for the SizeExpr to claim its tokens.
+  bool TraverseConstantArrayTypeLoc(ConstantArrayTypeLoc X) {
----------------
sammccall wrote:
> I don't think this is a complete solution: won't the inner ArrayTypeLoc still 
> end up owning both sets of brackets?
> 
> I think maybe a better solution is making getSourceRange(ArrayTypeLoc) return 
> only ATL.getBracketRange(), and then modify canSafelySkipNode to to avoid 
> pruning based on this small range.
> 
> This is vaguely similar to how DeclTypeLoc works today (though in that case 
> the reduced range is the one reported by the AST).
> won't the inner ArrayTypeLoc still end up owning both sets of brackets?

yes, unfortunately, the inner ATL still owns both sets of brackets, that means 
go-to-def (etc) won't work on an overloaded subscript operator [], I don't have 
a better solution to fix that. I guess it is ok to live with that as it might 
be a rare case in practice.

> I think maybe a better solution is making getSourceRange(ArrayTypeLoc) return 
> only ATL.getBracketRange(), and then modify canSafelySkipNode to to avoid 
> pruning based on this small range.

yeah, indeed I tried this approach before coming up the current approach, and I 
didn't find a satisfied solution (BracketRange is not enough, otherwise we will 
lose the array type `int`). 


```
 // int array[Size][100];
 // ~~~      [-2 -]~~~~~  ConstantArrayTypeLoc int[Size][100]
 // [1]            [-3-]  |-ConstantArrayTypeLoc int[100]

```
Ideally, the inner ATL should own tokens `int` ([1]) and tokens `[100]` ([3]). 
And in the `canSafelySkipNode`, we want to skip the inner ATL if the cursor is 
in the source range of ` array[Size]`, it seems quite tricky to get the source 
range (the range of `int` [1] in particular). Of course we could use some lexer 
hacks or call `ATL.getElementLoc()` recursively until we hit a non-array type 
loc (it can easily go up to  O(n^2) for super-multi-dimensional arrays).




================
Comment at: clang-tools-extra/clangd/Selection.cpp:527
+  // for the SizeExpr to claim its tokens.
+  bool TraverseConstantArrayTypeLoc(ConstantArrayTypeLoc X) {
+    if (!Base::TraverseStmt(X.getSizeExpr()))
----------------
sammccall wrote:
> ConstantArrayType isn't the only kind of array, see the other subclasses of 
> ArrayType
oh, right. There are three others, we could do similar for them. Will do that 
if we agree on the current approach. 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D116218

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

Reply via email to