nridge added a comment.

In D71345#1781141 <https://reviews.llvm.org/D71345#1781141>, @sammccall wrote:

> How do you feel about the approach here?


I agree that having more of the logic centralized (in `SelectionTree`) is 
preferable to having it directly in a call site like `getDeclAtPosition`.

I also agree that this makes the `SelectionTree` API a bit clunky.

I tested the behaviour in Eclipse CDT, on the following testcase:

  struct Material {
      friend Material operator+(Material, Material);
  };
  
  void foo() {
      Material hydrogen, oxygen;
      hydrogen^+^oxygen;
  }

Here, both navigations target the overloaded operator, but if you comment out 
the overloaded operator, they target the respective local variable 
declarations. I think this is pretty good do-what-I-mean behaviour, arguably 
better than a categorical preference for the right side over the left side.

I can describe how CDT achieves this:

- There is an API that takes a textual selection, and an AST node type, and 
finds the innermost node of that type that encloses the selection.
- The AST nodes built for the statement are as follows:

  hydrogen+oxygen;
  AAAAAAAABCCCCCC;   // A and C have type Name, B has type ImplicitName



- (If the overloaded operator is commented out, there is no node B.)
- For the purpose of determining "encloses", the cursor being at either 
boundary of a node counts as a match (so A and B are both considered to enclose 
the first cursor, and B and C are both considered to enclose the second cursor).
- The algorithm for go-to-definition is: first look for an enclosing 
`ImplicitName` node; if one is found, go to its target. Otherwise, look for an 
enclosing `Name` node and go to its target.

Other features will use the same API, but perhaps with a different node type; 
for example, the "define out of line" refactoring will look for an enclosing 
`FunctionDeclarator` node.

Perhaps we could have a simpler `SelectionTree` API along these lines, where 
the type of desired node informs the selection at each call site?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71345



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

Reply via email to