[PATCH] D37101: [clangd] Add support for snippet completions
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 4 03:59:09 PDT 2017
ilya-biryukov added a comment.
Looks good overall, just a bunch of comments before accepting the revision. Mostly minor code style issues, sorry for spamming you with those.
================
Comment at: clangd/ClangdLSPServer.h:30
ClangdLSPServer(JSONOutput &Out, unsigned AsyncThreadsCount,
+ const bool SnippetCompletions,
llvm::Optional<StringRef> ResourceDir);
----------------
Code style: we don't use `const` for non-reference parameters.
================
Comment at: clangd/ClangdUnit.cpp:275
+std::string SnippetEscape(const llvm::StringRef Text) {
+ std::string Result;
----------------
Code style: function names are `lowerCamelCase`.
Also maybe rename to `escapeSnippet` to follow the style guide: "function names should be verb phrases, e.g. `openFile()` or `isFoo()`" (see https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly)
================
Comment at: clangd/ClangdUnit.cpp:315
+protected:
+ std::vector<CompletionItem> &Items;
+ std::shared_ptr<clang::GlobalCodeCompletionAllocator> Allocator;
----------------
Code style: we put all field definitions at the bottom of the class in clangd.
Also: why not make the fields private?
================
Comment at: clangd/ClangdUnit.cpp:376
+
+ CompletionItem Item{InsertTextFormat::PlainText};
+
----------------
Implementations of this function in `PlainTextCompletionItemsCollector` and `SnippetCompletionItemsCollector` are the same.
Maybe make `ProcessChunks` virtual instead?
Or maybe consider replacing inheritance with a `bool` flag. Inheritance does not seem to buy us much here. This looks simpler:
```
if (EnableSnippets)
ProcessChunksWithSnippets(CCS, Item);
else
ProcessChunksWithoutSnippets(CCS, Item);
```
================
Comment at: clangd/ClangdUnit.cpp:454
+ // a declarator or macro.
+ Item.filterText = Chunk.Text;
+ case CodeCompletionString::CK_Text:
----------------
Maybe add a comment that fallthrough to the next case is intended?
It's very easy to miss that there's no break intentionally when reading the code.
================
Comment at: clangd/ClangdUnit.cpp:533
+ Item.insertText += Chunk.Text;
+ // Don't even add a space to the label.
+ }
----------------
Maybe add `break` here?
To avoid unintentional fallthrough if new `case` statement gets added.
================
Comment at: clangd/Protocol.h:393
+ CompletionItem() = default;
+ CompletionItem(const InsertTextFormat Format);
+
----------------
Maybe remove these constructors?
It seems weird that `insertTextFormat` is initialized on construction, while all other fields are filled up later.
Having to write all the fields explicitly is pretty low-level, but it's consistent and is done in all other structs from `Protocol.h`.
================
Comment at: clangd/tool/ClangdMain.cpp:31
+static llvm::cl::opt<bool> EnableSnippets(
+ "enable-snippets",
+ llvm::cl::desc("Present completions with embedded snippets instead of "
----------------
I've managed to get snippet completion working in VSCode.
The problem is that we're using outdated version of `vscode-languageclient` dependency in our npm module.
Simply bumping versions of dependencies in `clangd\clients\clangd-vscode\package.json` worked.
Had to change
```
"dependencies": {
"vscode-languageclient": "^2.6.3",
"vscode-languageserver": "^2.6.2"
},
```
to
```
"dependencies": {
"vscode-languageclient": "^3.3.0",
"vscode-languageserver": "^3.3.0"
},
```
Maybe include this in this commit and make `-enable-snippets` true by default?
https://reviews.llvm.org/D37101
More information about the cfe-commits
mailing list