[clangd] Fix rename for explicit destructor calls
authorKirill Bobyrev <kbobyrev@google.com>
Tue, 21 Jan 2020 04:33:39 +0000 (05:33 +0100)
committerKirill Bobyrev <kbobyrev@google.com>
Tue, 21 Jan 2020 04:33:39 +0000 (05:33 +0100)
commit38bdb94120b76f8f79cd27d721892673e573895a
tree22c3eb69d9c918b6af81dd0c7c12bc59d364ff18
parentc72aa27f917832af8a0d8d3a8aa9974411c30610
[clangd] Fix rename for explicit destructor calls

When triggering rename of the class name in the code with explicit destructor
calls, rename fails. Consider the following piece of code:

```
class Foo;

...

Foo f;
f.~/*...*/Foo();
```

`findExplicitReferences` will report two `ReferenceLoc` for destructor call:
one is comming from `MemberExpr` (i.e. destructor call itself) and would point
to the tilde:

```
f.~/*...*/Foo();
  ^
```

And the second one is pointing to the typename and is coming from `TypeLoc`.

```
f.~/*...*/Foo();
          ^
```

This causes rename to produce incorrect textual replacements. This patch
updates `MemberExpr` handler to detect destructor calls and prevents it
from reporting a duplicate reference.

Resolves: https://github.com/clangd/clangd/issues/236

Reviewers: kadircet, hokein

Differential Revision: https://reviews.llvm.org/D72638
clang-tools-extra/clangd/FindTarget.cpp
clang-tools-extra/clangd/unittests/FindTargetTests.cpp
clang-tools-extra/clangd/unittests/RenameTests.cpp