#language-server #client-server #tower #lsp #define

lspower

轻量级框架,用于实现 LSP 服务器

21 个版本 (6 个稳定版)

1.5.0 2021 年 12 月 7 日
1.4.0 2021 年 11 月 22 日
1.1.0 2021 年 5 月 10 日
1.0.0 2021 年 3 月 10 日
0.2.0 2020 年 12 月 28 日

#1542异步

Download history 2231/week @ 2024-03-13 2290/week @ 2024-03-20 1916/week @ 2024-03-27 2246/week @ 2024-04-03 2026/week @ 2024-04-10 2485/week @ 2024-04-17 1815/week @ 2024-04-24 2449/week @ 2024-05-01 3380/week @ 2024-05-08 2379/week @ 2024-05-15 2210/week @ 2024-05-22 2356/week @ 2024-05-29 2157/week @ 2024-06-05 2525/week @ 2024-06-12 1997/week @ 2024-06-19 2154/week @ 2024-06-26

9,100 每月下载量
6 个 Crates 中使用 (5 个直接使用)

Apache-2.0 WITH LLVM-exception

190KB
3.5K SLoC

lspower

基于 Tower 的 Rust 语言服务器协议 (LSP) 实现

Tower 是一个用于在 Rust 中实现异步服务的简单且可组合的框架。Tower 的核心是 Service 特性,它提供了定义请求/响应客户端和服务器所需的抽象。使用 Service 特性实现的协议示例包括用于 HTTP 的 hyper 和用于 gRPC 的 tonic

此库 (lspower) 提供了一个简单的语言服务器协议 (LSP) 实现,使得编写自己的语言服务器变得容易。它由三个部分组成

  • LanguageServer 特性,它定义了你的语言服务器的行为。
  • LspService 代理包装你的服务器,并定义了协议。
  • Server 生成 LspService 并通过 stdio 或 TCP 处理消息。

示例

use lspower::jsonrpc::Result;
use lspower::lsp::*;
use lspower::{Client, LanguageServer, LspService, Server};

#[derive(Debug)]
struct Backend {
    client: Client,
}

#[lspower::async_trait]
impl LanguageServer for Backend {
    async fn initialize(&self, _: InitializeParams) -> Result<InitializeResult> {
        Ok(InitializeResult::default())
    }

    async fn initialized(&self, _: InitializedParams) {
        self.client
            .log_message(MessageType::Info, "server initialized!")
            .await;
    }

    async fn shutdown(&self) -> Result<()> {
        Ok(())
    }
}

#[tokio::main]
async fn main() {
    let stdin = tokio::io::stdin();
    let stdout = tokio::io::stdout();

    let (service, messages) = LspService::new(|client| Backend { client });
    Server::new(stdin, stdout)
        .interleave(messages)
        .serve(service)
        .await;
}

与 tower-lsp 的区别

lspowertower-lsp crate 的分支。

这两个 crate 之间的主要区别如下

  • lspower 目前仍在维护,而 tower-lsp 的开发似乎已停止
  • lspower 自分支以来已进行了几次重大重构和错误修复
  • lspower 支持当前的 LSP 规范,包括语义标记等更多功能
  • lspower 支持从服务器向客户端发送自定义请求
  • lspower 支持取消标记(以及服务器到客户端的 $/cancelRequest 通知)
  • lspower 不需要 要求 tokio,同时也能与 async-stdsmolfutures 一起工作
  • lspower 兼容 WASM 目标(解决:tower-lsp#187
  • lspower 依赖更少(通过用 httparse 替换 nom
  • lspower 更高效地解析消息流,并最小化不必要的重新解析
  • lspower 从格式不正确的消息中恢复得更快(通过 twoway 加速 SIMD)

使用非 tokio 的运行时与 lspower

默认情况下,lspower 配置为与 tokio 一起使用。

要使用其他运行时与 lspower 一起使用,需要禁用 default-features 并启用 runtime-agnostic 功能

[dependencies.lspower]
version = "*"
default-features = false
features = ["runtime-agnostic"]

许可证

lspower 是免费的开放源代码软件,根据您选择的许可证,可以分别使用 MITApache 2.0 许可证。

除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,都应按上述方式双重许可,不附加任何额外条款或条件。

致谢

lspowertower-lsp crate 的分支。

依赖关系

~4–7MB
~154K SLoC