如何解决是否可以在运行时将完成项添加到 Microsoft 语言服务器?
我正在尝试开发一个 IntelliJ 插件,该插件在 ballerina 的 lsp4intellij 的帮助下提供语言服务器。
但是我没有找到任何方法在 LanguageServer 进程运行后将新的完成项传达给它。
我目前的想法是向插件添加一个操作,该操作会构建一个新的 jar,然后使用 Java Compiler API 使用新的 jar 重新启动服务器。
问题在于,我需要从插件项目中获取源代码,包括可从正在运行的插件访问的 gradle 依赖项......有什么想法吗?
解决方法
如果您的要求是在 IntelliJ UI 中显示它们之前修改完成项(来自语言服务器),您可以通过实现 LSP4IntelliJ 的 LSPExtensionManager 在您的插件中。
目前,我们没有关于 LSP4IntelliJ 扩展点的适当文档,但您可以参考我们的 Ballerina IntelliJ 插件作为参考实现,它在客户端运行时实现了 Ballerina LSP Extension manager 以覆盖/修改完成项here。
,对于那些可能会偶然发现这一点的人 - 确实可以更改 LanguageServer 在运行时可以提供的 CompletionItems 的数量。
我只是编辑了 TextDocumentService.java(我使用的库是 LSP4J)。
它是这样工作的:
LanguageServer 的主要功能需要使用附加参数启动,该参数是您在其中定义 CompletionItems 的配置文件的路径。 从 LSP4IntelliJ 调用它看起来像这样:
String[] command = new String[]{"java","-jar","path\\to\\LangServer.jar","path\\to\\config.json"};
IntellijLanguageClient.addServerDefinition(new RawCommandServerDefinition("md,java",command));
路径字符串将被传递给您的 CustomTextDocumentServer.java 的构造函数,它将在新的 Timer 线程中解析 config.json。
一个例子:
public class CustomTextDocumentService implements TextDocumentService {
private List<CompletionItem> providedItems;
private String pathToConfig;
public CustomTextDocumentService(String pathToConfig) {
this.pathToConfig = pathToConfig;
Timer timer = new Timer();
timer.schedule(new ReloadCompletionItemsTask(),10000);
loadCompletionItems();
}
@Override
public CompletableFuture<Either<List<CompletionItem>,CompletionList>> completion(CompletionParams completionParams) {
return CompletableFuture.supplyAsync(() -> {
List<CompletionItem> completionItems;
completionItems = this.providedItems;
// Return the list of completion items.
return Either.forLeft(completionItems);
});
}
@Override
public void didOpen(DidOpenTextDocumentParams didOpenTextDocumentParams) {
}
@Override
public void didChange(DidChangeTextDocumentParams didChangeTextDocumentParams) {
}
@Override
public void didClose(DidCloseTextDocumentParams didCloseTextDocumentParams) {
}
@Override
public void didSave(DidSaveTextDocumentParams didSaveTextDocumentParams) {
}
private void loadCompletionItems() {
providedItems = new ArrayList<>();
CustomParser = new CustomParser(pathToConfig);
ArrayList<String> variables = customParser.getTheParsedItems();
for(String variable : variables) {
String itemTxt = "$" + variable + "$";
CompletionItem completionItem = new CompletionItem();
completionItem.setInsertText(itemTxt);
completionItem.setLabel(itemTxt);
completionItem.setKind(CompletionItemKind.Snippet);
completionItem.setDetail("CompletionItem");
providedItems.add(completionItem);
}
}
class ReloadCompletionItemsTask extends TimerTask {
@Override
public void run() {
loadCompletionItems();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。