[PATCH] D34269: [clangd] Add "Go to Declaration" functionality

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 28 01:46:39 PDT 2017


ilya-biryukov added inline comments.


================
Comment at: clangd/ClangdUnit.cpp:276
+class DeclarationLocationsFinder : public index::IndexDataConsumer {
+  std::unique_ptr<std::vector<Location>> DeclarationLocations;
+  const SourceLocation &SearchedLocation;
----------------
malaperle-ericsson wrote:
> malaperle-ericsson wrote:
> > ilya-biryukov wrote:
> > > Why do we need to use `unique_ptr<vector<Location>>` here and in other places instead of `vector<Location>`? 
> > It was to implement "takeLocations". Calling it claims ownship of the vector. Did you have something else in mind when you suggested to implement takeLocations with a std::move? Disclaimer: this c++11 stuff is all new to me so I wouldn't be surprised if I'm doing it in a terrible way.
> I guess I can make takeLocations return a vector&& and the other places will return a normal vector RVO will take care of not making copies?
Just return `std::vector` and `std::move` the original field. It will have the same behaviour (i.e. no copies of the vector data, ownership transferred to the caller) without extra heap allocs:


```
  std::vector<Location> takeLocations() {
    // .... Do postprocessing here, i.e. sort+unique+erase
    return std::move(DeclarationLocations);
  }
// ...
private:
  std::vector<Location> DeclarationLocations;
```


https://reviews.llvm.org/D34269





More information about the cfe-commits mailing list