微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以在运行时将完成项添加到 Microsoft 语言服务器?

如何解决是否可以在运行时将完成项添加到 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 举报,一经查实,本站将立刻删除。