[PATCH] D36150: [clangd] LSP extension to switch between source/header file

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 4 02:05:58 PDT 2017


ilya-biryukov requested changes to this revision.
ilya-biryukov added a comment.
This revision now requires changes to proceed.

This is probably not a final version, but I feel my comments should be helpful anyway.
Also, we're missing testcases now.



================
Comment at: clangd/ClangdLSPServer.cpp:225
+  PathRef ref = PathRef((Params.uri.uri).c_str());
+  Path result = LangServer.Server.switchSourceHeader(ref);
+
----------------
We use `Params.uri.file`, not `Params.uri.uri` when passing paths to clangd.
Also no need for extra local var: `LangServer.Server.switchSourceHeader(Params.uri.file);` should work.


================
Comment at: clangd/ClangdLSPServer.cpp:225
+  PathRef ref = PathRef((Params.uri.uri).c_str());
+  Path result = LangServer.Server.switchSourceHeader(ref);
+
----------------
ilya-biryukov wrote:
> We use `Params.uri.file`, not `Params.uri.uri` when passing paths to clangd.
> Also no need for extra local var: `LangServer.Server.switchSourceHeader(Params.uri.file);` should work.
Naming: local vars should start with capital letter.


================
Comment at: clangd/ClangdServer.cpp:295
+  std::string DEFAULT_SOURCE_EXTENSIONS[] = { ".cpp", ".c", ".cc", ".cxx",
+    ".c++", ".C", ".m", ".mm" };  
+  std::string DEFAULT_HEADER_EXTENSIONS[] = { ".h", ".hh", ".hpp", ".hxx",
----------------
We should check all extensions in both upper-case and lower-case, not just `.c` and `.C`
(ideally, we could use case-insensitive comparisons).


================
Comment at: clangd/ClangdServer.cpp:302
+
+  std::string pathDataRef = std::string(path.data());
+  bool isSourceFile = false, foundExtension = false;
----------------
`path` is already a `StringRef`, no need to convert it. 
`std::string` is also implicitly convertible to `StringRef`, you could pass `std::string` to every function that accepts a `StringRef`


================
Comment at: clangd/ClangdServer.cpp:307
+
+  while (!foundExtension && i < sourceSize)
+  {
----------------
Maybe replace with:
```
if (std::find(DEFAULT_SOURCE_EXTESIONS, /*end iterator*/, llvm::sys::path::extensions(path)) {
  isSourceFile = true;
  foundExtension = true;
}
```


================
Comment at: clangd/ClangdServer.cpp:323
+  {
+    while (!foundExtension && i < headerSize)
+    {
----------------
Maybe use `std::find` here too?


================
Comment at: clangd/ClangdServer.cpp:339
+  SmallString<128> CurrentPath;
+  CurrentPath = temp;
+  bool done = false;
----------------
Don't need `temp` var here, there's `StringRef::toVector` method to convert `StringRef` to `SmallString`.


================
Comment at: clangd/ClangdServer.cpp:341
+  bool done = false;
+  std::vector<std::string> EXTENSIONS_ARRAY;
+  
----------------
Naming: EXTENSIONS_ARRAY is a local var, use `UpperCamelCase`.

Maybe use `ArrayRef<std::string>` for `ExtensionsArray` instead?


================
Comment at: clangd/ClangdServer.cpp:360
+    FILE * file;
+    file = fopen(temp.c_str(), "r");
+    if (file)
----------------
Please use `vfs::FileSystem` instance, provided by `FSProvider.getTaggedFileSystem()` here for file accesses.


================
Comment at: clangd/ClangdServer.cpp:367
+      std::string returnValue = std::string(NewPath.str());
+      return Path("\"" + returnValue + "\"");
+    }
----------------
Don't add quotes here, `Uri` constructor and `Uri::unparse` is responsible for doing that.


================
Comment at: clangd/ClangdServer.h:185
 
+  std::string switchSourceHeader(std::string path);
+
----------------
ilya-biryukov wrote:
> ilya-biryukov wrote:
> > Please use descriptive typedefs for paths: `Path` (equivalent to `std::string`) for return type and `PathRef` (equivalent to `StringRef`) for parameter type.
> Maybe add a small comment for this function to indicate it's a fairly trivial helper?
Maybe also change wording to indicate that this function does not mutate any state and is indeed trivial, i.e.:
`Helper function that returns a path to the corresponding source file when given a header file and vice versa.`

Code style: please end all comments with full stops.


================
Comment at: clangd/ClangdServer.h:186
+  // Helper function to change from one header file to it's corresponding source file and vice versa
+  Path switchSourceHeader(PathRef path);
+
----------------
Naming: parameter names must be capitalized


================
Comment at: clangd/ProtocolHandlers.cpp:260
+  Dispatcher.registerHandler(
+      "textDocument/switchSourceHeader",
+      llvm::make_unique<SwitchSourceHeaderHandler>(Out, Callbacks));
----------------
ilya-biryukov wrote:
> I don't see this method in the [[ https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md | LSP spec ]].
> Is this some kind of extension?
> 
> Could you add some comments on that with pointers to proposal/explanation of where this extension is used?
This comment was not addressed, probably marked as 'Done' by accident.


https://reviews.llvm.org/D36150





More information about the cfe-commits mailing list