29 个版本 (19 个重大更新)
0.20.0 | 2023 年 8 月 11 日 |
---|---|
0.19.0 | 2023 年 2 月 28 日 |
0.18.0 | 2023 年 1 月 15 日 |
0.17.0 | 2022 年 4 月 15 日 |
0.4.0 | 2019 年 10 月 2 日 |
在 文本编辑器 中排名 #4
每月下载量 64,072
在 73 个 crate 中使用(直接使用 63 个)
195KB
3K SLoC
tower-lsp
Tower 是一个简单的、可组合的框架,用于在 Rust 中实现异步服务。Tower 的核心是 Service
trait,它提供了定义请求/响应客户端和服务器所需的高级抽象。使用 Service
trait 实现的协议示例包括用于 HTTP 的 hyper
和用于 gRPC 的 tonic
。
此库(tower-lsp
)提供了一个简单的语言服务器协议(LSP)实现,使编写自己的语言服务器变得容易。它由三部分组成
- 定义您的语言服务器行为的
LanguageServer
trait。 - 包装您的语言服务器实现的异步
LspService
委托,定义协议的行为。 - 一个
Server
,它启动LspService
并通过stdio
或 TCP 处理请求和响应。
示例
use tower_lsp::jsonrpc::Result;
use tower_lsp::lsp_types::*;
use tower_lsp::{Client, LanguageServer, LspService, Server};
#[derive(Debug)]
struct Backend {
client: Client,
}
#[tower_lsp::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, socket) = LspService::new(|client| Backend { client });
Server::new(stdin, stdout, socket).serve(service).await;
}
使用 tokio 之外的其他运行时
默认情况下,tower-lsp
配置为与 tokio
一起使用。
要使用其他运行时与 tower-lsp
一起使用,需要禁用 default-features
并启用 runtime-agnostic
功能
[dependencies.tower-lsp]
version = "*"
default-features = false
features = ["runtime-agnostic"]
使用建议功能
您可以通过启用 proposed
Cargo crate 功能来使用 LSP 规范版本 3.18 中的建议功能。请注意,对于 proposed
功能没有 semver 保证,因此在 proposed
功能中的任何类型版本之间都可能存在破坏性更改。
生态系统
- tower-lsp-boilerplate - 一个有用的GitHub项目模板,可简化编写新的语言服务器。
许可证
tower-lsp
是免费的开源软件,根据MIT或Apache 2.0许可证条款分发,您可自行选择。
除非您明确声明,否则您有意提交的任何贡献,根据Apache-2.0许可证的定义,将根据上述条款双重许可,不附加任何额外的条款或条件。
依赖项
~5–13MB
~165K SLoC