[PATCH] D75623: [clangd][VSCode] Force VSCode to use the ranking provided by clangd.
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 5 09:18:09 PST 2020
sammccall updated this revision to Diff 248497.
sammccall marked 2 inline comments as done.
sammccall added a comment.
address review comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75623/new/
https://reviews.llvm.org/D75623
Files:
clang-tools-extra/clangd/clients/clangd-vscode/src/extension.ts
Index: clang-tools-extra/clangd/clients/clangd-vscode/src/extension.ts
===================================================================
--- clang-tools-extra/clangd/clients/clangd-vscode/src/extension.ts
+++ clang-tools-extra/clangd/clients/clangd-vscode/src/extension.ts
@@ -98,7 +98,33 @@
},
initializationOptions: { clangdFileStatus: true },
// Do not switch to output window when clangd returns output
- revealOutputChannelOn: vscodelc.RevealOutputChannelOn.Never
+ revealOutputChannelOn: vscodelc.RevealOutputChannelOn.Never,
+
+ // We hack up the completion items a bit to prevent VSCode from re-ranking them
+ // and throwing away all our delicious signals like type information.
+ //
+ // VSCode sorts by (fuzzymatch(prefix, item.filterText), item.sortText)
+ // By adding the prefix to the beginning of the filterText, we get a perfect
+ // fuzzymatch score for every item.
+ // The sortText (which reflects clangd ranking) breaks the tie.
+ //
+ // We also have to mark the list as incomplete to force retrieving new rankings.
+ // See https://github.com/microsoft/language-server-protocol/issues/898
+ middleware: {
+ provideCompletionItem: async (document, position, context, token, next) => {
+ // Get the incomplete identifier before the cursor.
+ let word = document.getWordRangeAtPosition(position);
+ let prefix = word && document.getText(new vscode.Range(word.start, position));
+
+ let list = await next(document, position, context, token);
+ let items = (Array.isArray(list) ? list : list.items).map(item => {
+ if (prefix)
+ item.filterText = prefix + "_" + item.filterText;
+ return item;
+ })
+ return new vscode.CompletionList(items, /*isIncomplete=*/true);
+ }
+ },
};
const clangdClient = new ClangdLanguageClient('Clang Language Server',
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D75623.248497.patch
Type: text/x-patch
Size: 2051 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200305/0d9ee972/attachment.bin>
More information about the cfe-commits
mailing list