我正在尝试在 VSCode 中为针对可编程 ASIC 的汇编程序提供语言支持。到目前为止,我只有 TextMate 语法,现在我正在尝试了解如何实现语言服务器。我正在学习
https://github.com/Microsoft/vscode-extension-samples/tree/master/lsp-sample
并且已经到了让我的环境进行调试的地步。我苦苦挣扎的地方是我不明白示例中的完成机制是如何完成的。
我在调试时看到的是,第一个字母(单词边界)是:
- j 或 J 带有字符串 JavaScript(J 突出显示)的小文本弹出窗口和详细信息显示,因此我无需输入即可选择
- t 或 T 相同,但用于 TypeScript(T 突出显示)
- s 或 S 给出了两个先前弹出窗口的列表(S 都突出显示)和向上/向下箭头以供选择
据我了解,涵盖此内容的唯一代码是 server.ts 文件中的此部分
// This handler provides the initial list of the completion items.
connection.onCompletion(
(_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
// The pass parameter contains the position of the text document in
// which code complete got requested. For the example we ignore this
// info and always provide the same completion items.
return [
{
label: 'TypeScript',
kind: CompletionItemKind.Text,
data: 1
},
{
label: 'JavaScript',
kind: CompletionItemKind.Text,
data: 2
}
];
}
);
// This handler resolves additional information for the item selected in
// the completion list.
connection.onCompletionResolve(
(item: CompletionItem): CompletionItem => {
if (item.data === 1) {
item.detail = 'TypeScript details';
item.documentation = 'TypeScript documentation';
} else if (item.data === 2) {
item.detail = 'JavaScript details';
item.documentation = 'JavaScript documentation';
}
return item;
}
);
我已经使用更多标签进行了测试,它显示为 Completionparser 检查标签中的大写字母。添加了另外 2 个标签,“TwoMore”和“JetBrain”,它们的行为方式相同,例如 m/M 或 b/B 也会弹出一个窗口。
不明显的是为什么会这样?