ilya-biryukov added inline comments.

================
Comment at: clang-tools-extra/clangd/XRefs.cpp:139
+// that constructor. FIXME(nridge): this should probably be handled in
+// targetDecl() itself.
+const CXXConstructorDecl *findCalledConstructor(const SelectionTree::Node *N) {
----------------
nridge wrote:
> ilya-biryukov wrote:
> > sammccall wrote:
> > > nridge wrote:
> > > > I would appreciate some tips on how we could handle this in 
> > > > `targetDecl()`. Please see more specific comments below.
> > > My thinking is basically:
> > >  - C++ syntax is vague and doesn't give us great ways of referring 
> > > directly to constructors.
> > >  - there's value to simplicity, and I've found go-to-definition 
> > > additionally finding implicit nodes to be confusing as often as useful. I 
> > > think on balance and given the constraints of LSP, we should consider 
> > > dropping this and having implicit references be returned by find-refs but 
> > > not targetable by go-to-def/hover/etc. It's OK for simplicity of 
> > > implementation to be a concern here.
> > >  - the node that targets the constructor is the CXXConstructExpr. 
> > > Treating the VarDecl conditionally as a reference to the constructor, 
> > > while clever, seems like a hack. Ideally the fix is to make SelectionTree 
> > > yield the CXXConstructExpr, not to change TargetDecl.
> > >  - CXXConstructExpr is only sometimes implicit. SelectionTree should 
> > > return it for the parens in `Foo()` or `Foo x()`. And ideally for the 
> > > equals in `Foo x = {}`, though I think there's no CXXConstructExpr in the 
> > > AST in that case :-(
> > >  - When the AST modelling is bad (as it seems to be for some aspects 
> > > CXXConstructExpr) we should consider accepting some glitches and trying 
> > > to improve things in clang if they're important. Hacking around them will 
> > > lead to inconsistencies between different clangd features.
> > > 
> > > The TL;DR is I think I'd be happy to drop this special case and try to 
> > > make SelectionTree surface CXXConstructExpr more often, even if it 
> > > changes some behavior.
> > +1 to the idea of landing this and changing behavior.
> > I don't think we're loosing much in terms of functionality and I personally 
> > like the new code much more.
> FWIW, I do find being able to get from a variable declaration to the invoked 
> constructor to be very useful.
> 
> If the class has several constructors, there's no other easy way to determine 
> which one is being invoked (only other thing I can think of is to perform 
> "find references" on each constructor and see which one includes the variable 
> declaration as a reference, which is a lot more tedious), and I think that's 
> an important thing to be able to do (just like for named functions).
> 
> So I'd definitely like to keep this case working. However, I'd be fine with 
> only having the parens or braces target the constructor. (That's still 
> slightly annoying, as you have to place  the cursor more precisely, and it 
> also may not be obvious to users, but at least there's a way to do it.) I'm 
> also fine with changing the behaviour for now, and deferring constructor 
> targeting to a follow-up, as there are other benefits this patch brings.
We discussed this offline: finding constructor references is useful, but 
current approach does not generalize very well, e.g. for implicit constructor 
calls:
```
struct Foo {
  Foo(int);
};

int func(Foo a, Foo b);
int test() {
  func(1, 2); // no way to find Foo(1) and Foo(2) calls.
}
```

So we'd probably want some other mechanism to expose *all* possible references.
In any case, changing behavior now and tweaking it with a follow-up patch is 
probably the best way to proceed with this change.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D69237



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

Reply via email to