There is smart dot operator handling in ccls which lets you call methods of smart pointer targets. But if you use arrow operator you see smart pointer methods in the first place for some reason.

struct A {
void m1();
};
struct B : private A {
void m2();
};
void foo () {
std::unique_ptr<A> ap;
ap->