我正在开发一个 VSCode 扩展,它应该通过额外的代码完成来增强 JSON 编辑。因此我添加了四个虚拟建议(foo
, foo1
, foo2
, foo3
)开始测试。当在 JSON 键后输入冒号时,它会按预期工作:
![expected behavior](https://i.stack.imgur.com/i7kGL.png)
此外,当我在空对象中触发完成时,它会按我想要的方式工作(包括其他扩展的建议):
![enter image description here](https://i.stack.imgur.com/5Iyaq.png)
但是,当我在双引号内触发完成时(无论它们是否包含文本),我的建议丢失了:
![enter image description here](https://i.stack.imgur.com/Jxqoa.png)
当我在我的中设置断点时CompletionItemProvider
在这两种情况下,执行都会按预期暂停。所以它被正确调用并且它肯定会返回我的建议。我查看了现有的 JSON 编辑器扩展(甚至是 VSCodes 默认的扩展),以获取如何正确实现它的建议,并查看默认的 JSON 扩展是否可能覆盖双引号内的所有建议(尽管在我看来这会破坏整个可扩展性的想法)但找不到任何东西。
要重现它就足以搭建一个空扩展,如所描述的here.
这是我的扩展.ts:
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';
class OpenApiCompletionItemProvider implements vscode.CompletionItemProvider {
public provideCompletionItems(
document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
Thenable<vscode.CompletionItem[]> {
return Promise.resolve([
new vscode.CompletionItem('foo', vscode.CompletionItemKind.Class),
new vscode.CompletionItem('foo1', vscode.CompletionItemKind.Property),
new vscode.CompletionItem('foo2', vscode.CompletionItemKind.Interface),
new vscode.CompletionItem('foo3', vscode.CompletionItemKind.Class),
]);
}
}
export function activate(ctx: vscode.ExtensionContext): void {
ctx.subscriptions.push(
vscode.languages.registerCompletionItemProvider(
{ pattern: '**/*.openapi.json' },
new OpenApiCompletionItemProvider(),
':',
'"'
)
);
}
// this method is called when your extension is deactivated
export function deactivate() { }